@viu/emporix-sdk 4.5.0 → 4.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/config.ts","../src/core/logger.ts","../src/core/session-keys.ts","../src/core/session-storage.ts","../src/core/browser-storage.ts","../src/core/query-keys.ts","../src/core/customer-session-store.ts","../src/core/sse.ts","../src/core/http.ts","../package.json","../src/version.ts","../src/core/create-core.ts","../src/services/site.ts","../src/services/session-context.ts","../src/services/tenant-config.ts","../src/services/client-config.ts","../src/services/shopping-list.ts","../src/services/ai-rag-indexer.ts","../src/services/sequential-id.ts","../src/services/fee.ts","../src/services/cloud-functions.ts","../src/services/webhook.ts","../src/services/schema.ts","../src/services/ai-resources.ts","../src/services/ai.ts","../src/services/tax.ts","../src/services/coupon.ts","../src/services/reward-points.ts","../src/services/brand.ts","../src/services/label.ts","../src/services/country.ts","../src/services/currency.ts","../src/services/shipping.ts","../src/services/invoice.ts","../src/services/quote.ts","../src/services/returns.ts","../src/services/indexing.ts","../src/services/search.ts","../src/services/imports.ts","../src/services/audit-log.ts","../src/services/unit-handling.ts","../src/services/catalog.ts","../src/services/vendor.ts","../src/services/customer-admin.ts","../src/services/approval.ts","../src/client.ts","../src/create-emporix-client.ts","../src/core/yrn.ts"],"names":["ANON","version","SERVICE","auth","toPage"],"mappings":"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","file":"index.js","sourcesContent":["import type { Logger, LoggerConfig } from \"./logger\";\nimport type { TokenProvider } from \"./auth\";\n\n/** Default Emporix API host. */\nexport const DEFAULT_HOST = \"https://api.emporix.io\";\n\n/**\n * Tenant guard. Emporix docs only state \"always lowercase\"; the 3–16 char\n * `^[a-z][a-z0-9]+$` rule is an SDK-side guard, not a documented constraint.\n */\nconst TENANT_RE = /^[a-z][a-z0-9]{2,15}$/;\n\n/** A client-credentials credential set (service / custom). */\nexport interface ServiceCredentials {\n clientId: string;\n secret: string;\n scope?: string;\n}\n\n/** Storefront credential — anonymous token needs the client id only, no secret. */\nexport interface StorefrontCredentials {\n clientId: string;\n /**\n * Session context bound at anonymous-login time. Required for\n * `prices.matchByContext` to resolve currency/site/country server-side.\n * `targetLocation` is an ISO country code.\n */\n context?: { currency?: string; siteCode?: string; targetLocation?: string; language?: string };\n}\n\n/** User-supplied SDK configuration. */\nexport interface EmporixConfig {\n tenant: string;\n host?: string;\n credentials: {\n /**\n * Service (client-credentials) credentials. Optional: storefront/SPA apps\n * use only `storefront` (anonymous) + caller-supplied customer tokens and\n * must never ship a backend secret. Required only when a `service`\n * AuthContext is actually used — enforced lazily by the TokenProvider.\n */\n backend?: ServiceCredentials;\n storefront?: StorefrontCredentials;\n custom?: Record<string, ServiceCredentials>;\n };\n tokenProvider?: TokenProvider;\n timeouts?: { connectMs?: number; readMs?: number };\n retry?: { maxAttempts?: number };\n cache?: { expirationBufferSeconds?: number; maxLifetimeSeconds?: number };\n logger?: LoggerConfig;\n /**\n * Replaces the global `fetch` for API requests. Receives the same arguments.\n *\n * Deliberately NOT used for token requests (`core/auth.ts`) or SSE\n * (`HttpClient.stream`): a cached token response would be a security defect,\n * and caching an event stream is meaningless. Those keep the global `fetch`,\n * which makes them structurally uncacheable rather than uncached by\n * convention.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Sent as `Content-Language` on every request that carries a body: the\n * language of the localized fields in it. Unset (the default) sends no header.\n *\n * - `\"*\"` — localized fields are maps of translations, `{ de: \"…\", en: \"…\" }`;\n * - a language code such as `\"de\"` — they are plain strings in that language.\n *\n * Without the header, most services read localized fields as plain strings in\n * the tenant's default language and answer a map with a 400 («localized values\n * must be of String type when the Content-Language header is not set to all\n * languages»). Categories and catalogs are the exception: they always take maps.\n *\n * It applies to every write the client makes, so set it on the client that does\n * back-office writes, not on a storefront client. Product and category writes\n * can override it per call with `contentLanguage` in their write options.\n */\n contentLanguage?: string;\n}\n\n/** Fully-resolved configuration with defaults applied. */\nexport interface ResolvedConfig {\n tenant: string;\n host: string;\n credentials: EmporixConfig[\"credentials\"];\n tokenProvider: TokenProvider | undefined;\n timeouts: { connectMs: number; readMs: number };\n retry: { maxAttempts: number };\n cache: { expirationBufferSeconds: number; maxLifetimeSeconds: number };\n logger: LoggerConfig | undefined;\n fetch: typeof globalThis.fetch | undefined;\n contentLanguage: string | undefined;\n}\n\n/**\n * `context` belongs inside `credentials.storefront`, and at the top level it is\n * silently lost.\n *\n * `EmporixConfig` has no top-level `context`, so such an object is dropped without a\n * word — and then `matchByContext` answers `[]` with no error, because the anonymous\n * token was minted without site, currency and country. Measured on tenant `viu`\n * (2026-08-18): 0 matches when misplaced, 1 when placed correctly. The expensive part\n * is the silence: it reads exactly like «no prices configured».\n *\n * A warning rather than a throw — configs that misplace it work today (badly), and a\n * throw would stop them on upgrade. `logger: false` is honoured as an explicit\n * request for silence; the object form of `LoggerConfig` carries no `warn` method, so\n * anything that is not a `Logger` instance falls back to the console.\n */\nfunction warnOnMisplacedContext(input: EmporixConfig): void {\n if (!(\"context\" in input)) return;\n const logger = input.logger;\n if (logger === false) return;\n const message =\n \"EmporixConfig has no top-level `context` — it is being ignored. Move it into \" +\n \"`credentials.storefront.context`, otherwise the anonymous token carries no \" +\n \"site/currency/country and price matching returns an empty list without erroring.\";\n if (logger && typeof (logger as Logger).warn === \"function\") {\n (logger as Logger).warn(message);\n return;\n }\n // Same escape hatch as the read-only-storage warning in `session-storage.ts`: this\n // has to reach a developer who configured no logger at all, which is exactly the\n // situation the mistake happens in.\n // eslint-disable-next-line no-console\n console.warn(`[emporix] ${message}`);\n}\n\n/** Validates user config and applies defaults. Throws on invalid tenant/credentials. */\nexport function validateConfig(input: EmporixConfig): ResolvedConfig {\n if (!TENANT_RE.test(input.tenant)) {\n throw new Error(\n `Invalid tenant \"${input.tenant}\": must be lowercase, 3–16 chars, match ^[a-z][a-z0-9]+$`,\n );\n }\n if (!input.credentials) {\n throw new Error(\"credentials is required (provide at least one of backend/storefront/custom)\");\n }\n warnOnMisplacedContext(input);\n return {\n tenant: input.tenant,\n host: input.host ?? DEFAULT_HOST,\n credentials: input.credentials,\n tokenProvider: input.tokenProvider,\n timeouts: {\n connectMs: input.timeouts?.connectMs ?? 10_000,\n readMs: input.timeouts?.readMs ?? 60_000,\n },\n retry: { maxAttempts: input.retry?.maxAttempts ?? 3 },\n cache: {\n expirationBufferSeconds: input.cache?.expirationBufferSeconds ?? 60,\n maxLifetimeSeconds: input.cache?.maxLifetimeSeconds ?? 3600,\n },\n logger: input.logger,\n fetch: input.fetch,\n contentLanguage: input.contentLanguage,\n };\n}\n","/** Log severity, low → high. */\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\n/** Numeric ordering used for fast comparison. */\nexport const LEVEL: Record<LogLevel, number> = {\n trace: 10, debug: 20, info: 30, warn: 40, error: 50, silent: 60,\n};\n\n/** Services that bind their own logger and are independently level-controllable. */\nexport type ServiceName =\n | \"customer\"\n | \"product\"\n | \"category\"\n | \"cart\"\n | \"checkout\"\n | \"payment\"\n | \"price\"\n | \"media\"\n | \"segment\"\n | \"site\"\n | \"session-context\"\n | \"customer-management\"\n | \"iam\"\n | \"orders\"\n | \"sales-orders\"\n | \"availability\"\n | \"configuration\"\n | \"shopping-list\"\n | \"ai-rag-indexer\"\n | \"sequential-id\"\n | \"fee\"\n | \"webhook\"\n | \"schema\"\n | \"ai\"\n | \"tax\"\n | \"coupon\"\n | \"reward-points\"\n | \"brand\"\n | \"label\"\n | \"country\"\n | \"currency\"\n | \"shipping\"\n | \"returns\"\n | \"indexing\"\n | \"search\"\n | \"import\"\n | \"audit-log\"\n | \"unit-handling\"\n | \"catalog\"\n | \"vendor\"\n | \"customer-admin\"\n | \"approval\"\n | \"invoice\"\n | \"quote\"\n | \"cloud-functions\"\n | \"http\"\n | \"auth\";\n\n/** Arbitrary structured fields attached to a log line. */\nexport interface LogFields { [key: string]: unknown; }\n\n/** The logger contract consumers may implement or swap. */\nexport interface Logger {\n level: LogLevel;\n isLevelEnabled(level: LogLevel): boolean;\n trace(msg: string, fields?: LogFields): void;\n debug(msg: string, fields?: LogFields): void;\n info(msg: string, fields?: LogFields): void;\n warn(msg: string, fields?: LogFields): void;\n error(msg: string, fields?: LogFields): void;\n child(bindings: LogFields): Logger;\n}\n\n/** Object form of logger configuration. */\nexport interface LoggerObjectConfig {\n level?: LogLevel;\n services?: Partial<Record<ServiceName, LogLevel>>;\n pretty?: boolean;\n redact?: string[];\n}\n\n/** `false` → noop logger; `Logger` → user-supplied; object → built-in console logger. */\nexport type LoggerConfig = false | Logger | LoggerObjectConfig;\n\nfunction isValidLevel(v: string | undefined): v is LogLevel {\n return v !== undefined && v in LEVEL;\n}\n\n/** Browser-safe env read — `process` is undefined in browsers/edge runtimes. */\nfunction readEnv(name: string): string | undefined {\n try {\n return typeof process !== \"undefined\" && process.env ? process.env[name] : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves the effective level per service following:\n * env per-service > env global > config.services[svc] > config.level > \"warn\".\n * Runtime `set()` mutates programmatic levels but never overrides env-set ones\n * unless `force` is passed.\n */\nexport class LevelResolver {\n private cfgLevel: LogLevel;\n private cfgServices: Partial<Record<ServiceName, LogLevel>>;\n private forcedServices: Partial<Record<ServiceName, LogLevel>> = {};\n private forcedGlobal: LogLevel | undefined;\n private warned = false;\n\n constructor(\n cfg: LoggerObjectConfig,\n private readonly warn: (msg: string) => void = () => {},\n ) {\n this.cfgLevel = cfg.level ?? \"warn\";\n this.cfgServices = { ...cfg.services };\n }\n\n private envFor(svc: ServiceName): LogLevel | undefined {\n const raw = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`);\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL_${svc.toUpperCase()}=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n private envGlobal(): LogLevel | undefined {\n const raw = readEnv(\"EMPORIX_LOG_LEVEL\");\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n /**\n * Effective level for a service. Forced overrides (from `set(..., force)`)\n * take precedence over env vars; otherwise env > programmatic config.\n */\n get(svc: ServiceName): LogLevel {\n return (\n this.forcedServices[svc] ??\n this.envFor(svc) ??\n this.forcedGlobal ??\n this.envGlobal() ??\n this.cfgServices[svc] ??\n this.cfgLevel ??\n \"warn\"\n );\n }\n\n /** Numeric effective level for a service. */\n numericLevel(svc: ServiceName): number {\n return LEVEL[this.get(svc)];\n }\n\n /** True if `svc`'s effective level allows emitting at `at`. */\n isAtLeast(svc: ServiceName, at: LogLevel): boolean {\n return this.numericLevel(svc) <= LEVEL[at];\n }\n\n /** Mutates programmatic level (global or one service). Env-set levels are sticky unless `force`. */\n set(level: LogLevel, svc?: ServiceName, force = false): void {\n if (svc) {\n const envBound = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`) !== undefined;\n if (envBound && !force) {\n this.warn(`Level for \"${svc}\" is env-controlled; pass force to override`);\n return;\n }\n if (force) this.forcedServices[svc] = level;\n else this.cfgServices[svc] = level;\n } else {\n const envBound = readEnv(\"EMPORIX_LOG_LEVEL\") !== undefined;\n if (envBound && !force) {\n this.warn(\"Global level is env-controlled; pass force to override\");\n return;\n }\n if (force) this.forcedGlobal = level;\n else this.cfgLevel = level;\n }\n }\n}\n\n/** Default redaction floor — never reducible. */\nconst DEFAULT_REDACT = new Set([\n \"authorization\", \"password\", \"oldpassword\", \"newpassword\", \"clientsecret\",\n \"secret\", \"access_token\", \"refresh_token\", \"customertoken\", \"saastoken\",\n \"saas-token\", \"bearertoken\", \"apikey\", \"token\",\n]);\n\n/** Deep-clones `value`, replacing redacted keys with a mask. AuthContext token is stripped. */\nexport function redact(value: unknown, extra: string[] = []): unknown {\n const keys = new Set(DEFAULT_REDACT);\n for (const k of extra) keys.add(k.toLowerCase());\n const walk = (v: unknown): unknown => {\n if (Array.isArray(v)) return v.map(walk);\n if (v && typeof v === \"object\") {\n const src = v as Record<string, unknown>;\n // AuthContext: keep only `kind`.\n if (typeof src.kind === \"string\" && \"token\" in src) return { kind: src.kind };\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(src)) {\n if (keys.has(k.toLowerCase())) {\n out[k] =\n k.toLowerCase() === \"authorization\" && typeof val === \"string\"\n ? \"Bearer ***redacted***\"\n : \"***redacted***\";\n } else {\n out[k] = walk(val);\n }\n }\n return out;\n }\n return v;\n };\n return walk(value);\n}\n\ninterface Sink {\n log: (...a: unknown[]) => void;\n info: (...a: unknown[]) => void;\n warn: (...a: unknown[]) => void;\n error: (...a: unknown[]) => void;\n}\n\nconst EMIT: Record<Exclude<LogLevel, \"silent\">, number> = {\n trace: LEVEL.trace, debug: LEVEL.debug, info: LEVEL.info, warn: LEVEL.warn, error: LEVEL.error,\n};\n\nabstract class BaseLogger implements Logger {\n constructor(\n protected readonly resolver: LevelResolver,\n protected readonly bindings: LogFields,\n protected readonly extraRedact: string[],\n ) {}\n private svc(): ServiceName {\n return (this.bindings.service as ServiceName) ?? \"http\";\n }\n get level(): LogLevel {\n return this.resolver.get(this.svc());\n }\n isLevelEnabled(level: LogLevel): boolean {\n return this.resolver.isAtLeast(this.svc(), level);\n }\n protected abstract emit(\n level: Exclude<LogLevel, \"silent\">,\n msg: string,\n fields: LogFields,\n ): void;\n private at(level: Exclude<LogLevel, \"silent\">, msg: string, fields?: LogFields): void {\n if (this.resolver.numericLevel(this.svc()) > EMIT[level]) return;\n const merged = { ...this.bindings, ...(fields ?? {}) };\n this.emit(level, msg, redact(merged, this.extraRedact) as LogFields);\n }\n trace(m: string, f?: LogFields): void { this.at(\"trace\", m, f); }\n debug(m: string, f?: LogFields): void { this.at(\"debug\", m, f); }\n info(m: string, f?: LogFields): void { this.at(\"info\", m, f); }\n warn(m: string, f?: LogFields): void { this.at(\"warn\", m, f); }\n error(m: string, f?: LogFields): void { this.at(\"error\", m, f); }\n abstract child(bindings: LogFields): Logger;\n}\n\nclass ConsoleLogger extends BaseLogger {\n constructor(\n resolver: LevelResolver,\n bindings: LogFields,\n extra: string[],\n private readonly sink: Sink,\n private readonly pretty: boolean,\n ) {\n super(resolver, bindings, extra);\n }\n protected emit(level: Exclude<LogLevel, \"silent\">, msg: string, fields: LogFields): void {\n if (this.pretty) {\n const fn =\n level === \"error\" ? this.sink.error\n : level === \"warn\" ? this.sink.warn\n : level === \"info\" ? this.sink.info\n : this.sink.log;\n fn(`[${level}] ${msg}`, fields);\n } else {\n this.sink.log(JSON.stringify({ ts: new Date().toISOString(), level, msg, ...fields }));\n }\n }\n child(bindings: LogFields): Logger {\n return new ConsoleLogger(\n this.resolver,\n { ...this.bindings, ...bindings },\n this.extraRedact,\n this.sink,\n this.pretty,\n );\n }\n}\n\nclass NoopLogger implements Logger {\n level: LogLevel = \"silent\";\n isLevelEnabled(): boolean { return false; }\n trace(): void {}\n debug(): void {}\n info(): void {}\n warn(): void {}\n error(): void {}\n child(): Logger { return this; }\n}\n\n/** Creates the built-in console logger. `opts.sink` overrides `console` (used in tests). */\nexport function createConsoleLogger(\n resolver: LevelResolver,\n bindings: LogFields = {},\n opts: { pretty?: boolean; redact?: string[]; sink?: Sink } = {},\n): Logger {\n const pretty = opts.pretty ?? readEnv(\"NODE_ENV\") !== \"production\";\n const sink: Sink = opts.sink ?? {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n };\n return new ConsoleLogger(resolver, bindings, opts.redact ?? [], sink, pretty);\n}\n\n/** Creates a logger that discards everything. */\nexport function createNoopLogger(): Logger {\n return new NoopLogger();\n}\n","/**\n * The persisted session-state contract, shared by every host.\n *\n * It lives in the core SDK rather than in `@viu/emporix-sdk-react` because it is\n * not a React concern: the same eight keys are cookie names in a Next\n * `proxy.ts`, Web Storage keys in a browser adapter, and record fields in a\n * server-side session store. Keeping it here is what let\n * `@viu/emporix-sdk-next` drop its dependency on the React package — it needed\n * these strings, not React.\n *\n * `@viu/emporix-sdk-react` re-exports both from `./storage` and `/ssr`, so\n * existing imports keep working.\n */\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"language\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\"\n | \"saasToken\";\n\n/**\n * The eight persisted session keys, as the strings each backend actually uses.\n * Same strings on purpose — a value written by one backend must be readable by\n * the next, and the cookie set by a Next `proxy.ts` has to be the one\n * `createCookieStorage` looks for.\n *\n * The `satisfies` is the point, not the deduplication: a ninth\n * {@link EmporixStorageKey} without an entry here is a compile error, and an\n * entry here without a union member is too. `as const` stays in front of it so\n * the literal types survive for consumers.\n */\nexport const STORAGE_KEYS = {\n customerToken: \"emporix.customerToken\",\n cartId: \"emporix.cartId\",\n anonymousSession: \"emporix.anonymousSession\",\n siteCode: \"emporix.siteCode\",\n language: \"emporix.language\",\n activeLegalEntityId: \"emporix.activeLegalEntityId\",\n refreshToken: \"emporix.refreshToken\",\n saasToken: \"emporix.saasToken\",\n} as const satisfies Record<EmporixStorageKey, string>;\n","/**\n * The persisted-session layer: the {@link EmporixStorage} contract and the two\n * framework-free implementations of it that are not browser-specific.\n *\n * It lives in the core SDK for the same reason {@link STORAGE_KEYS} does — none\n * of it is a React concern. A cookie-backed storage fits Next, Remix, SvelteKit,\n * Nitro or a plain Node handler equally, and `@viu/emporix-sdk-next` needed\n * exactly this and nothing else from `@viu/emporix-sdk-react`.\n *\n * `@viu/emporix-sdk-react` re-exports all of it and keeps the browser backends\n * (memory, localStorage, sessionStorage, document.cookie), which genuinely belong\n * there.\n */\nimport { auth, type AuthContext, type StoredAnonymousSession } from \"./auth\";\nimport { STORAGE_KEYS, type EmporixStorageKey } from \"./session-keys\";\n\n/**\n * The subset of an anonymous session a browser storage keeps.\n *\n * Derived from {@link StoredAnonymousSession} rather than re-declared: a server\n * store may additionally persist the access token and its expiry, a browser one\n * deliberately does not (the client is long-lived and holds the token in memory,\n * so writing it would only expose a bearer token to JavaScript).\n */\nexport type PersistedAnonymousSession = Pick<\n StoredAnonymousSession,\n \"refreshToken\" | \"sessionId\"\n>;\n\n/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active language (Accept-Language). `null` = use the site/tenant default.\n getLanguage(): string | null;\n setLanguage(language: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n // SaaS token (the checkout `saas-token` header). Persisted so a logged-in\n // customer can still complete checkout after a page reload — the refresh\n // endpoint does not re-mint it. Optional: a custom adapter may omit these,\n // in which case the saasToken stays in-memory only.\n getSaasToken?(): string | null;\n setSaasToken?(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(listener: (key: EmporixStorageKey) => void): () => void;\n}\n\n/** Backward-compat alias. New code should prefer {@link EmporixStorage}. */\nexport type TokenStorage = EmporixStorage;\n\n/**\n * Parses a stored anonymous session (from Web Storage or a cookie) into a\n * {@link PersistedAnonymousSession}. Returns `null` for absent, malformed or\n * incomplete values — a half-written session must not become a half-valid one.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (raw === null) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n return typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\"\n ? { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId }\n : null;\n } catch {\n return null;\n }\n}\n\n/** Backend-agnostic cookie accessor. `set` absent means the storage is read-only. */\nexport interface CookieIo {\n get(name: string): string | null;\n /** `null` deletes the cookie. */\n set?(name: string, value: string | null): void;\n}\n\n/**\n * Builds an {@link EmporixStorage} over a cookie accessor. Contains the whole\n * name-to-accessor mapping so no backend repeats it.\n *\n * `opts.notify` is a callback rather than a flag so this module stays free of\n * listener-set lifetime: the browser backend owns a `createListenerSet`, passes\n * its `notify` here, and attaches `subscribeAll` to the result itself. This\n * function never sets `subscribeAll` — the server backend therefore has none,\n * which is correct: a server render has no lifetime to observe.\n */\nexport function createCookieBackedStorage(\n io: CookieIo,\n opts: { tokenName?: string; notify?: (key: EmporixStorageKey) => void } = {},\n): EmporixStorage {\n const tokenName = opts.tokenName ?? STORAGE_KEYS.customerToken;\n const notify = opts.notify;\n\n // Read-only mode: warn once per key so a genuine bug surfaces, but a render\n // loop cannot flood the log.\n const warned = new Set<EmporixStorageKey>();\n const write = (name: string, value: string | null, key: EmporixStorageKey): void => {\n if (io.set === undefined) {\n if (!warned.has(key)) {\n warned.add(key);\n // eslint-disable-next-line no-console\n console.warn(\n `[emporix] storage is read-only; ignoring write to \"${key}\". ` +\n \"Provide a `set` accessor to enable writes (e.g. from a Server Action).\",\n );\n }\n return;\n }\n io.set(name, value);\n notify?.(key);\n };\n\n return {\n getCustomerToken: () => io.get(tokenName),\n setCustomerToken: (t) => write(tokenName, t, \"customerToken\"),\n\n getCartId: () => io.get(STORAGE_KEYS.cartId),\n setCartId: (id) => write(STORAGE_KEYS.cartId, id, \"cartId\"),\n\n getAnonymousSession: () => parseAnonymousSession(io.get(STORAGE_KEYS.anonymousSession)),\n setAnonymousSession: (s) =>\n write(\n STORAGE_KEYS.anonymousSession,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n \"anonymousSession\",\n ),\n\n getSiteCode: () => io.get(STORAGE_KEYS.siteCode),\n setSiteCode: (code) => write(STORAGE_KEYS.siteCode, code, \"siteCode\"),\n\n getLanguage: () => io.get(STORAGE_KEYS.language),\n setLanguage: (l) => write(STORAGE_KEYS.language, l, \"language\"),\n\n getActiveLegalEntityId: () => io.get(STORAGE_KEYS.activeLegalEntityId),\n setActiveLegalEntityId: (id) =>\n write(STORAGE_KEYS.activeLegalEntityId, id, \"activeLegalEntityId\"),\n\n getRefreshToken: () => io.get(STORAGE_KEYS.refreshToken),\n setRefreshToken: (t) => write(STORAGE_KEYS.refreshToken, t, \"refreshToken\"),\n\n getSaasToken: () => io.get(STORAGE_KEYS.saasToken),\n setSaasToken: (t) => write(STORAGE_KEYS.saasToken, t, \"saasToken\"),\n };\n}\n\n/**\n * A synchronous cookie accessor supplied by the caller. Deliberately\n * synchronous: {@link EmporixStorage} is synchronous throughout, so any\n * `await` (e.g. Next's `await cookies()`) belongs to the caller.\n *\n * Omit `set` for a read-only storage. Next.js forbids cookie writes during a\n * Server Component render — only Server Actions and Route Handlers may write.\n */\nexport interface ServerCookieJar {\n get(name: string): string | null;\n /** `null` deletes the cookie. */\n set?(name: string, value: string | null): void;\n}\n\n/**\n * An {@link EmporixStorage} reading (and optionally writing) through a\n * caller-supplied cookie jar — for RSC, Server Actions, Route Handlers, or any\n * other server runtime. No framework import: the jar shape fits Next, Remix,\n * SvelteKit, Nitro or a plain Node handler.\n *\n * `subscribe` / `subscribeAll` are absent: a server render has no lifetime over\n * which to observe changes.\n *\n * ```ts\n * // Next.js Server Component (read-only)\n * const jar = await cookies();\n * const storage = createServerStorage({ get: (n) => jar.get(n)?.value ?? null });\n *\n * // Next.js Server Action (read-write)\n * const jar = await cookies();\n * const storage = createServerStorage({\n * get: (n) => jar.get(n)?.value ?? null,\n * set: (n, v) =>\n * v === null\n * ? jar.delete(n)\n * : jar.set(n, v, { httpOnly: true, sameSite: \"lax\", secure: true, path: \"/\" }),\n * });\n * ```\n */\nexport function createServerStorage(jar: ServerCookieJar): EmporixStorage {\n return createCookieBackedStorage(\n jar.set !== undefined ? { get: jar.get, set: jar.set } : { get: jar.get },\n );\n}\n\n/**\n * Resolves the {@link AuthContext} a server-side read should use, mirroring\n * exactly what the React `useEmporixQuery` resolves on the client: the customer\n * context when a token is stored, anonymous otherwise.\n *\n * Use this rather than hand-rolling it — `authKind` is part of every React-Query\n * key, so a mismatch here produces a silent cache miss (a second fetch after\n * hydration, no error).\n */\nexport function serverAuth(storage: EmporixStorage): AuthContext {\n const token = storage.getCustomerToken();\n return token !== null ? auth.customer(token) : auth.anonymous();\n}\n","/**\n * The browser session-storage backends: memory, localStorage, sessionStorage,\n * document.cookie.\n *\n * The contract and the framework-free backends live in `./session-storage`;\n * these are the ones that need browser globals. They were in\n * `@viu/emporix-sdk-react` until `@viu/emporix-sdk-angular` needed them too —\n * `localStorage` is not a React API, and duplicating a storage backend per\n * binding means two of them writing subtly different values under the same key.\n *\n * Every export is a named factory and the package sets `sideEffects: false`, so\n * a Node consumer that imports none of them bundles none of them. That is\n * asserted by `scripts/check-treeshake.mjs`.\n */\nimport {\n createCookieBackedStorage,\n parseAnonymousSession,\n type EmporixStorage,\n type PersistedAnonymousSession,\n} from \"./session-storage\";\nimport { STORAGE_KEYS, type EmporixStorageKey } from \"./session-keys\";\n\n/**\n * The three methods these backends use from a Web `Storage`.\n *\n * Declared locally on purpose. This package compiles with `lib: [\"ES2022\"]` and\n * no `\"DOM\"` — that is the invariant which keeps the SDK runnable on Node, edge\n * runtimes and workers, and adding DOM to the lib to satisfy this one file would\n * switch that compile-time guard off for all ~60 services. So every browser\n * global below is reached through a narrowed `globalThis` instead of an ambient\n * declaration, which is also the pattern the localStorage and sessionStorage\n * availability checks already used before this code moved here.\n */\nexport interface WebStorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\n/** Narrowed view of the browser globals these backends touch. */\ninterface BrowserGlobals {\n localStorage?: WebStorageLike;\n sessionStorage?: WebStorageLike;\n document?: { cookie: string };\n location?: { protocol: string };\n}\n\nconst browser = globalThis as unknown as BrowserGlobals;\n\n/**\n * Internal: create a swallow-on-throw listener set used by all the storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let language: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n let saasToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getLanguage: () => language,\n setLanguage: (l) => {\n language = l;\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n getSaasToken: () => saasToken,\n setSaasToken: (t) => {\n saasToken = t;\n all.notify(\"saasToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n\n/**\n * Internal: build an {@link EmporixStorage} backed by any Web `Storage`\n * instance (`localStorage` or `sessionStorage`). Both share the identical\n * `getItem`/`setItem`/`removeItem` surface, so the 8-key wiring lives here once.\n * Callers own the availability check + memory fallback before delegating.\n */\nexport function fromWebStorage(\n storage: WebStorageLike,\n opts: { key?: string } = {},\n): EmporixStorage {\n const tokenKey = opts.key ?? STORAGE_KEYS.customerToken;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => storage.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) storage.removeItem(tokenKey);\n else storage.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => storage.getItem(STORAGE_KEYS.cartId),\n setCartId: (id) => {\n if (id === null) storage.removeItem(STORAGE_KEYS.cartId);\n else storage.setItem(STORAGE_KEYS.cartId, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () =>\n parseAnonymousSession(storage.getItem(STORAGE_KEYS.anonymousSession)),\n setAnonymousSession: (s) => {\n if (s === null) storage.removeItem(STORAGE_KEYS.anonymousSession);\n else\n storage.setItem(\n STORAGE_KEYS.anonymousSession,\n JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => storage.getItem(STORAGE_KEYS.siteCode),\n setSiteCode: (code) => {\n if (code === null) storage.removeItem(STORAGE_KEYS.siteCode);\n else storage.setItem(STORAGE_KEYS.siteCode, code);\n all.notify(\"siteCode\");\n },\n getLanguage: () => storage.getItem(STORAGE_KEYS.language),\n setLanguage: (l) => {\n if (l === null) storage.removeItem(STORAGE_KEYS.language);\n else storage.setItem(STORAGE_KEYS.language, l);\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => storage.getItem(STORAGE_KEYS.activeLegalEntityId),\n setActiveLegalEntityId: (id) => {\n if (id === null) storage.removeItem(STORAGE_KEYS.activeLegalEntityId);\n else storage.setItem(STORAGE_KEYS.activeLegalEntityId, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => storage.getItem(STORAGE_KEYS.refreshToken),\n setRefreshToken: (t) => {\n if (t === null) storage.removeItem(STORAGE_KEYS.refreshToken);\n else storage.setItem(STORAGE_KEYS.refreshToken, t);\n all.notify(\"refreshToken\");\n },\n getSaasToken: () => storage.getItem(STORAGE_KEYS.saasToken),\n setSaasToken: (t) => {\n if (t === null) storage.removeItem(STORAGE_KEYS.saasToken);\n else storage.setItem(STORAGE_KEYS.saasToken, t);\n all.notify(\"saasToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n\n/**\n * Browser `localStorage`-backed store: persistent and shared across tabs.\n * Falls back to memory on the server (or when localStorage is unavailable).\n */\nexport function createLocalStorage(opts: { key?: string } = {}): EmporixStorage {\n const store = browser.localStorage;\n if (store === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n return fromWebStorage(store, opts);\n}\n\n/** @deprecated Use {@link createLocalStorage}. Kept for backward compatibility. */\nexport const createLocalStorageStorage = createLocalStorage;\n\n/**\n * Browser `sessionStorage`-backed store: per-tab persistence that survives a\n * reload but is cleared when the tab closes and is not shared across tabs.\n * Falls back to memory on the server (or when sessionStorage is unavailable).\n */\nexport function createSessionStorage(opts: { key?: string } = {}): EmporixStorage {\n const store = browser.sessionStorage;\n if (store === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] sessionStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n return fromWebStorage(store, opts);\n}\n\n/**\n * Cookie-backed store. `Secure` defaults to on for https origins; override\n * with `secure: false` only for non-https dev setups. Consumer must still pick\n * an appropriate `sameSite` for CSRF safety.\n */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const sameSite = opts.sameSite ?? \"lax\";\n // Default: Secure on https origins. Tokens must not ride plain-http\n // cookies in production; localhost/http dev keeps working without opts.\n const secure = opts.secure ?? browser.location?.protocol === \"https:\";\n const doc = browser.document;\n if (doc === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const all = createListenerSet<EmporixStorageKey>();\n const storage = createCookieBackedStorage(\n {\n get: (name) => {\n for (const part of doc.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n },\n set: (name, value) => {\n doc.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n },\n },\n {\n ...(opts.name !== undefined ? { tokenName: opts.name } : {}),\n notify: (key) => all.notify(key),\n },\n );\n return { ...storage, subscribeAll: (l) => all.add(l) };\n}\n","/**\n * The cache-key shape every framework binding shares.\n *\n * Shape: `[\"emporix\", resource, ...args, { tenant, authKind, siteCode?, language? }]`\n *\n * It lives in the core SDK for the same reason {@link STORAGE_KEYS} does: it is\n * not a React concern. `@viu/emporix-sdk-react` and `@viu/emporix-sdk-angular`\n * must produce byte-identical keys or the two bindings, the docs and the\n * devtools all describe different caches. One definition is the only way that\n * holds — a copy per binding would agree on the day it was written and nowhere\n * after.\n *\n * The trailing meta object groups the discriminators that differentiate cache\n * entries across tenants, auth-kinds and (where applicable) active sites.\n * `siteCode` is included only when explicitly passed — non-site-aware reads\n * pass `undefined` and the field is dropped.\n */\nexport function emporixKey<TArgs extends readonly unknown[]>(\n resource: string,\n args: TArgs,\n context: {\n tenant: string;\n authKind: string;\n siteCode?: string | null;\n language?: string | null;\n },\n): readonly [\"emporix\", string, ...TArgs, Record<string, unknown>] {\n const meta: Record<string, unknown> = {\n tenant: context.tenant,\n authKind: context.authKind,\n };\n if (context.siteCode !== undefined) {\n meta.siteCode = context.siteCode;\n }\n if (context.language !== undefined) {\n meta.language = context.language;\n }\n return [\"emporix\", resource, ...args, meta] as const;\n}\n\n/** Which site discriminators go into the query key's meta object. */\nexport type SiteFields = \"full\" | \"language\" | \"none\";\n\n/**\n * Builds the site portion of a query key's meta object. Shared by every read\n * path — React's `useEmporixQuery`, its `prefetchEmporix`, and Angular's\n * `emporixQueryOptions` — so none of them can disagree about which\n * discriminators a resource carries. Key parity is structural, not tested.\n *\n * Note `null` is preserved rather than dropped: an unbound site is a distinct\n * cache identity from a bound one, and {@link emporixKey} only omits a field\n * when it is `undefined`.\n */\nexport function siteMeta(\n site: SiteFields,\n siteCode: string | null,\n language: string | null,\n): { siteCode?: string | null; language?: string | null } {\n return site === \"full\"\n ? { siteCode, language }\n : site === \"language\"\n ? { language }\n : {};\n}\n","/**\n * In-memory customer-session store, keyed by storage instance.\n *\n * Moved out of the React bindings: it is a subscribe/snapshot store over\n * {@link EmporixStorage} with no framework API in it. React consumes it through\n * `useSyncExternalStore`, Angular through a `signal` — the store itself does not\n * know or care, which is exactly why it does not belong in either binding.\n */\nimport type { EmporixStorage } from \"./session-storage\";\n\n/**\n * The three session tokens the customer session tracks. `token` is mirrored\n * from persistent storage; `refreshToken` and `saasToken` are in-memory only\n * (deliberately never persisted).\n */\nexport interface CustomerSessionState {\n token: string | null;\n refreshToken: string | null;\n saasToken: string | null;\n}\n\nexport interface CustomerSessionStore {\n getSnapshot: () => CustomerSessionState;\n setState: (\n next: CustomerSessionState | ((prev: CustomerSessionState) => CustomerSessionState),\n ) => void;\n subscribe: (listener: () => void) => () => void;\n}\n\n// One store per storage instance. The storage object is the stable per-app\n// identity (a WeakMap lets it be GC'd with the app; each test gets a fresh\n// storage → a fresh isolated store).\nconst stores = new WeakMap<EmporixStorage, CustomerSessionStore>();\n\n/**\n * Shared in-memory store for the customer session, keyed by the storage\n * instance. Every consumer reads and writes the same store, so a login in one\n * place (the auth form) is visible in another (the checkout page) — without\n * this, the in-memory `saasToken` lived in a single component's local state and\n * customer checkout would 401 elsewhere.\n */\nexport function getCustomerSessionStore(storage: EmporixStorage): CustomerSessionStore {\n const existing = stores.get(storage);\n if (existing) return existing;\n\n // Re-hydrate from storage so a page reload keeps the full session: `token`\n // and `refreshToken` are persisted by the storage adapter; `saasToken` is\n // too (when the adapter supports it) — the checkout `saas-token` header is\n // needed after a reload and the refresh endpoint cannot re-mint it.\n let state: CustomerSessionState = {\n token: storage.getCustomerToken(),\n refreshToken: storage.getRefreshToken(),\n saasToken: storage.getSaasToken?.() ?? null,\n };\n const listeners = new Set<() => void>();\n const store: CustomerSessionStore = {\n getSnapshot: () => state,\n setState: (next) => {\n const resolved =\n typeof next === \"function\"\n ? (next as (prev: CustomerSessionState) => CustomerSessionState)(state)\n : next;\n if (resolved === state) return;\n state = resolved;\n for (const listener of listeners) listener();\n },\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n // Mirror external token writes (login/logout from any consumer, telemetry-\n // driven flows) into the store, so EVERY subscriber observes token changes.\n // Lifetime: the subscription lives exactly as long as the storage instance\n // that owns this store.\n storage.subscribe?.((t) => {\n store.setState((s) => (s.token === t ? s : { ...s, token: t }));\n });\n stores.set(storage, store);\n return store;\n}\n","/** One Server-Sent Events frame. `data` is the concatenated data lines. */\nexport interface SseEvent {\n event?: string;\n data: string;\n id?: string;\n}\n\n/** Parse one frame (fields separated by \"\\n\"); returns undefined if it has no fields. */\nfunction parseFrame(frame: string): SseEvent | undefined {\n const ev: SseEvent = { data: \"\" };\n const dataLines: string[] = [];\n let saw = false;\n for (const line of frame.split(\"\\n\")) {\n if (line === \"\" || line.startsWith(\":\")) continue; // blank / comment\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1); // strip one leading space\n if (field === \"data\") {\n dataLines.push(value);\n saw = true;\n } else if (field === \"event\") {\n ev.event = value;\n saw = true;\n } else if (field === \"id\") {\n ev.id = value;\n saw = true;\n }\n }\n if (!saw) return undefined;\n ev.data = dataLines.join(\"\\n\");\n return ev;\n}\n\n/**\n * Parse an SSE byte stream (already decoded to text chunks) into events.\n * Buffers across chunk boundaries; frames are separated by a blank line.\n */\nexport async function* parseSseStream(\n chunks: AsyncIterable<string>,\n): AsyncIterable<SseEvent> {\n let buf = \"\";\n for await (const chunk of chunks) {\n buf += chunk.replace(/\\r\\n/g, \"\\n\");\n let idx: number;\n while ((idx = buf.indexOf(\"\\n\\n\")) !== -1) {\n const ev = parseFrame(buf.slice(0, idx));\n buf = buf.slice(idx + 2);\n if (ev) yield ev;\n }\n }\n const tail = parseFrame(buf);\n if (tail) yield tail;\n}\n","import {\n type AuthContext,\n type TokenProvider,\n type CustomerRefreshRegistry,\n resolveToken,\n} from \"./auth\";\nimport { errorFromResponse, EmporixTimeoutError, EmporixNetworkError } from \"./errors\";\nimport type { Logger } from \"./logger\";\nimport { parseSseStream, type SseEvent } from \"./sse\";\n\n/** A single HTTP request through the SDK. */\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthContext;\n /**\n * Query parameters. Booleans are serialized with `String(v)`, so a facade can\n * pass one straight through instead of stringifying it at the call site.\n */\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Extra request headers (merged before auth; cannot override Authorization). */\n headers?: Record<string, string>;\n /** Per-request abort timeout override (ms). */\n timeoutMs?: number;\n /**\n * Marks this request as safe to retry on 5xx/429 despite a non-idempotent\n * method. GET/PUT/DELETE retry by default; POST/PATCH only with this flag\n * (a 5xx can arrive after the server already committed — retrying e.g.\n * placeOrder would duplicate the order/charge).\n */\n idempotent?: boolean;\n}\n\n/**\n * A successful response: the parsed body plus its headers.\n *\n * `Headers` rather than the whole `Response` on purpose — by the time this\n * returns, the body has been consumed, and a `Response` whose body cannot be\n * read again is a trap in a caller's hands.\n */\nexport interface HttpResult<T> {\n data: T;\n headers: Headers;\n}\n\n/** Construction options for {@link HttpClient}. */\nexport interface HttpClientOptions {\n host: string;\n /**\n * Tenant, emitted as `Emporix-Tenant` on every request.\n *\n * The tenant is already in the path of nearly every endpoint, so this looks\n * redundant — it is not. Emporix validates dashboard/IAM user tokens against\n * this header and answers 401 without it, even when `Authorization` is\n * correct. `@emporix/api-calls`, the client library the Management Dashboard\n * itself uses, sets it whenever a tenant is known.\n *\n * Optional so a bare `new HttpClient(...)` stays constructible; every client\n * built through `createCore` passes it.\n */\n tenant?: string;\n provider: TokenProvider;\n logger: Logger;\n retry: { maxAttempts: number };\n timeouts: { connectMs: number; readMs: number };\n /** Override the retry backoff delay (ms → Promise). Defaults to a real timer. */\n sleep?: (ms: number) => Promise<void>;\n /** Opt-in customer-token refresher registry (off unless a refresher is set). */\n customerRefresh?: CustomerRefreshRegistry;\n /**\n * Shared storefront request context. When `language` is set, every request\n * carries `Accept-Language: <language>`. Mutated at runtime via\n * `EmporixClient.setStorefrontContext({ language })`.\n */\n requestContext?: { language?: string | undefined };\n /**\n * Sent as `Content-Language` on every request that carries a body — see\n * `EmporixConfig.contentLanguage`. Reads and bodiless requests never get it.\n */\n contentLanguage?: string;\n /**\n * Replaces the global `fetch` for API requests. Not used by token requests\n * (`core/auth.ts`) or by {@link HttpClient.stream} — see `EmporixConfig.fetch`.\n */\n fetch?: typeof globalThis.fetch;\n}\n\nlet requestSeq = 0;\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/** Fetch wrapper: auth resolution, JSON parsing, typed error mapping, logging. */\nexport class HttpClient {\n private readonly sleep: (ms: number) => Promise<void>;\n /** Resolved request fetch. The arrow keeps `globalThis.fetch` correctly bound. */\n private readonly doFetch: typeof globalThis.fetch;\n constructor(private readonly opts: HttpClientOptions) {\n this.sleep =\n opts.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n this.doFetch = opts.fetch ?? ((...args) => globalThis.fetch(...args));\n }\n\n private buildHeaders(\n o: RequestOptions,\n token: string,\n isFormData: boolean,\n ): Record<string, string> {\n return {\n // Before `o.headers` on purpose: a caller may override the tenant for a\n // single request, the way `Accept-Language` and `Content-Language` can be\n // overridden. Only `Authorization` is non-negotiable.\n ...(this.opts.tenant !== undefined ? { \"Emporix-Tenant\": this.opts.tenant } : {}),\n ...(this.opts.requestContext?.language\n ? { \"Accept-Language\": this.opts.requestContext.language }\n : {}),\n ...(this.opts.contentLanguage && o.body !== undefined\n ? { \"Content-Language\": this.opts.contentLanguage }\n : {}),\n ...(o.headers ?? {}),\n Authorization: `Bearer ${token}`,\n // JSON bodies: set Content-Type. FormData bodies: let `fetch`\n // emit `multipart/form-data; boundary=...` itself.\n ...(o.body !== undefined && !isFormData\n ? { \"Content-Type\": \"application/json\" }\n : {}),\n };\n }\n\n /**\n * Issues a request and returns the parsed body. Retries 5xx/429 on idempotent\n * methods and re-auths once on a 401 — see {@link send}.\n */\n async request<T = unknown>(o: RequestOptions): Promise<T> {\n return (await this.send<T>(o)).data;\n }\n\n /**\n * Like {@link request}, but also hands back the response headers.\n *\n * Emporix puts pagination metadata there — `X-Total-Count` and, on the schema\n * service's custom instances, `X-Next-Cursor` / `X-Prev-Cursor`. Facades\n * should reach for `core/paged.ts`'s `requestPage` rather than calling this\n * directly; it exists for metadata that does not fit the paginated shape.\n */\n async requestWithMeta<T = unknown>(o: RequestOptions): Promise<HttpResult<T>> {\n return this.send<T>(o);\n }\n\n private async send<T>(o: RequestOptions): Promise<HttpResult<T>> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const sdkManaged = o.auth.kind === \"service\" || o.auth.kind === \"anonymous\";\n const maxAttempts = this.opts.retry.maxAttempts;\n let reauthed = false;\n let customerToken = o.auth.kind === \"customer\" ? o.auth.token : undefined;\n let customerReauthed = false;\n\n for (let attempt = 1; ; attempt++) {\n const token = customerToken ?? (await resolveToken(o.auth, this.opts.provider));\n log.debug(\"http request\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n attempt,\n });\n\n const controller = new AbortController();\n const overallMs = o.timeoutMs ?? this.opts.timeouts.readMs;\n // connectMs bounds time-to-headers (fetch resolving); the overall budget\n // bounds headers + body. timeoutMs overrides the overall budget only.\n const connectMs = Math.min(this.opts.timeouts.connectMs, overallMs);\n const timeoutMsg = `${o.method} ${o.path} timed out after ${overallMs}ms (connect budget ${connectMs}ms)`;\n let connectTimer: ReturnType<typeof setTimeout> | undefined;\n let overallTimer: ReturnType<typeof setTimeout> | undefined;\n // The overall budget is a rejecting promise raced against fetch + the\n // body read, not just an abort. An abort interrupts the connection but\n // does NOT reliably unblock an already-streaming body that stalls\n // mid-read — racing the timer guarantees the read is bounded regardless.\n const overallBudget = new Promise<never>((_, reject) => {\n overallTimer = setTimeout(() => {\n controller.abort();\n reject(new EmporixTimeoutError(timeoutMsg));\n }, overallMs);\n });\n connectTimer = setTimeout(() => controller.abort(), connectMs);\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: this.buildHeaders(o, token, isFormData),\n signal: controller.signal,\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n let res: Response;\n let text: string;\n try {\n res = await Promise.race([this.doFetch(url, init), overallBudget]);\n // Headers are in — the connect budget no longer applies; the body\n // read stays bounded by the overall budget timer.\n clearTimeout(connectTimer);\n connectTimer = undefined;\n const body = res.text();\n // Swallow a late body rejection if the budget timer wins the race,\n // so it doesn't surface as an unhandled rejection.\n body.catch(() => {});\n text = await Promise.race([body, overallBudget]);\n } catch (err) {\n if (err instanceof EmporixTimeoutError) throw err;\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(timeoutMsg);\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n } finally {\n if (connectTimer !== undefined) clearTimeout(connectTimer);\n if (overallTimer !== undefined) clearTimeout(overallTimer);\n }\n const parsed = text ? safeJson(text) : undefined;\n if (res.ok) {\n log.debug(\"http ok\", { status: res.status });\n return { data: parsed as T, headers: res.headers };\n }\n\n // 401 asymmetry.\n if (res.status === 401) {\n if (sdkManaged && !reauthed) {\n reauthed = true;\n if (o.auth.kind === \"service\") {\n this.opts.provider.invalidate?.(o.auth.credentials ?? \"backend\");\n } else if (this.opts.provider.expireAnonymous) {\n // Keep the refresh token so the retry refreshes (same sessionId)\n // instead of starting a new anonymous session.\n this.opts.provider.expireAnonymous();\n } else {\n this.opts.provider.invalidateAnonymous?.();\n }\n log.warn(\"sdk-managed 401, re-authing once\", { authKind: o.auth.kind });\n continue;\n }\n if (\n o.auth.kind === \"customer\" &&\n !customerReauthed &&\n this.opts.customerRefresh?.enabled\n ) {\n customerReauthed = true;\n const fresh = await this.opts.customerRefresh.refresh(customerToken!);\n if (fresh) {\n customerToken = fresh;\n log.warn(\"customer 401, refreshed once\", { authKind: o.auth.kind });\n continue;\n }\n }\n throw errorFromResponse(res.status, `${o.method} ${o.path} → 401`, parsed);\n }\n\n // Retry 5xx / 429 — gated on idempotency: a 5xx can arrive AFTER the\n // server committed the write (e.g. placeOrder), so replaying a POST\n // could duplicate orders/charges. GET/PUT/DELETE are idempotent by\n // spec; POST/PATCH retry only when the caller opts in.\n const idempotent =\n o.method === \"GET\" ||\n o.method === \"PUT\" ||\n o.method === \"DELETE\" ||\n o.idempotent === true;\n const retryable = idempotent && (res.status >= 500 || res.status === 429);\n if (retryable && attempt < maxAttempts) {\n // headers.get() yields null when absent — Number(null) is 0, which\n // would short-circuit the exponential branch into a 0ms instant\n // retry. Only a non-empty header value counts.\n const retryAfterHeader = res.headers.get(\"Retry-After\");\n const retryAfter = retryAfterHeader ? Number(retryAfterHeader) : Number.NaN;\n const backoff =\n Number.isFinite(retryAfter) && retryAfter >= 0\n ? Math.min(retryAfter * 1000, 8000) // cap rogue Retry-After (e.g. 86400)\n : Math.min(1000 * 2 ** (attempt - 1), 8000) + Math.random() * 100;\n log.warn(\"retryable failure\", { status: res.status, attempt, backoffMs: backoff });\n await this.sleep(backoff);\n continue;\n }\n\n log.error(\"http error (final)\", { status: res.status, attempt });\n throw errorFromResponse(res.status, `${o.method} ${o.path} → ${res.status}`, parsed);\n }\n }\n\n /**\n * Single-shot fetch that returns the raw {@link Response} unparsed. Used by\n * endpoints whose responses are not JSON (binary downloads, redirect-only\n * endpoints). Skips the retry-on-5xx and 401-reauth-once paths intentionally\n * — those depend on parsing the JSON error body, which a raw consumer must\n * handle itself if needed. Auth resolution + timeout + logging are still\n * applied.\n *\n * `extra.redirect` is forwarded to `fetch` so callers can use `'manual'` to\n * capture 30x responses with their `Location` header (Node fetch exposes\n * the header in this mode; browser fetch returns an opaque response).\n */\n async requestRaw(\n o: RequestOptions,\n extra?: { redirect?: \"follow\" | \"manual\" | \"error\" },\n ): Promise<Response> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const token = await resolveToken(o.auth, this.opts.provider);\n log.debug(\"http requestRaw\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n redirect: extra?.redirect ?? \"follow\",\n });\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n o.timeoutMs ?? this.opts.timeouts.readMs,\n );\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: this.buildHeaders(o, token, isFormData),\n signal: controller.signal,\n ...(extra?.redirect ? { redirect: extra.redirect } : {}),\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n try {\n return await this.doFetch(url, init);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(\n `${o.method} ${o.path} timed out after ${o.timeoutMs ?? this.opts.timeouts.readMs}ms`,\n );\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n /**\n * Open a Server-Sent Events stream (`text/event-stream`) and yield parsed\n * events. Unlike {@link request}, no overall read budget applies (streams are\n * long-lived) — only `connectMs` bounds time-to-headers, and the consumer\n * breaking the iterator aborts the fetch. Like {@link requestRaw}, it does\n * NOT retry or re-auth on 401; a non-2xx maps to a typed error before the\n * stream begins.\n */\n async *requestStream(o: RequestOptions): AsyncIterable<SseEvent> {\n const log = this.opts.logger.child({ requestId: `req-${++requestSeq}` });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const token = await resolveToken(o.auth, this.opts.provider);\n const controller = new AbortController();\n const connectTimer = setTimeout(() => controller.abort(), this.opts.timeouts.connectMs);\n const headers = this.buildHeaders(o, token, false);\n headers[\"Accept\"] = \"text/event-stream\";\n let res: Response;\n try {\n res = await fetch(url, {\n method: o.method,\n headers,\n signal: controller.signal,\n ...(o.body !== undefined ? { body: JSON.stringify(o.body) } : {}),\n });\n } catch (err) {\n clearTimeout(connectTimer);\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(`${o.method} ${o.path} timed out opening stream`);\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n }\n clearTimeout(connectTimer);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw errorFromResponse(\n res.status,\n `${o.method} ${o.path} → ${res.status}`,\n text ? safeJson(text) : undefined,\n );\n }\n log.debug(\"http stream open\", { status: res.status });\n if (!res.body) return;\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n async function* readChunks(): AsyncIterable<string> {\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield decoder.decode(value, { stream: true });\n }\n } finally {\n controller.abort(); // cancel the fetch if the consumer breaks early\n }\n }\n yield* parseSseStream(readChunks());\n }\n}\n","{\n \"name\": \"@viu/emporix-sdk\",\n \"version\": \"4.5.0\",\n \"description\": \"TypeScript SDK for the Emporix Commerce Engine\",\n \"license\": \"MIT\",\n \"author\": {\n \"name\": \"viu\",\n \"url\": \"https://github.com/viuteam\"\n },\n \"homepage\": \"https://github.com/viuteam/emporix-sdk#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/viuteam/emporix-sdk.git\",\n \"directory\": \"packages/sdk\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/viuteam/emporix-sdk/issues\"\n },\n \"keywords\": [\n \"emporix\",\n \"ecommerce\",\n \"commerce\",\n \"sdk\",\n \"typescript\",\n \"storefront\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./customer\": {\n \"types\": \"./dist/customer.d.ts\",\n \"import\": \"./dist/customer.js\",\n \"require\": \"./dist/customer.cjs\"\n },\n \"./product\": {\n \"types\": \"./dist/product.d.ts\",\n \"import\": \"./dist/product.js\",\n \"require\": \"./dist/product.cjs\"\n },\n \"./category\": {\n \"types\": \"./dist/category.d.ts\",\n \"import\": \"./dist/category.js\",\n \"require\": \"./dist/category.cjs\"\n },\n \"./cart\": {\n \"types\": \"./dist/cart.d.ts\",\n \"import\": \"./dist/cart.js\",\n \"require\": \"./dist/cart.cjs\"\n },\n \"./checkout\": {\n \"types\": \"./dist/checkout.d.ts\",\n \"import\": \"./dist/checkout.js\",\n \"require\": \"./dist/checkout.cjs\"\n },\n \"./payment\": {\n \"types\": \"./dist/payment.d.ts\",\n \"import\": \"./dist/payment.js\",\n \"require\": \"./dist/payment.cjs\"\n },\n \"./price\": {\n \"types\": \"./dist/price.d.ts\",\n \"import\": \"./dist/price.js\",\n \"require\": \"./dist/price.cjs\"\n },\n \"./media\": {\n \"types\": \"./dist/media.d.ts\",\n \"import\": \"./dist/media.js\",\n \"require\": \"./dist/media.cjs\"\n },\n \"./segment\": {\n \"types\": \"./dist/segment.d.ts\",\n \"import\": \"./dist/segment.js\",\n \"require\": \"./dist/segment.cjs\"\n },\n \"./companies\": {\n \"types\": \"./dist/companies.d.ts\",\n \"import\": \"./dist/companies.js\",\n \"require\": \"./dist/companies.cjs\"\n },\n \"./contacts\": {\n \"types\": \"./dist/contacts.d.ts\",\n \"import\": \"./dist/contacts.js\",\n \"require\": \"./dist/contacts.cjs\"\n },\n \"./locations\": {\n \"types\": \"./dist/locations.d.ts\",\n \"import\": \"./dist/locations.js\",\n \"require\": \"./dist/locations.cjs\"\n },\n \"./customer-groups\": {\n \"types\": \"./dist/customer-groups.d.ts\",\n \"import\": \"./dist/customer-groups.js\",\n \"require\": \"./dist/customer-groups.cjs\"\n },\n \"./orders\": {\n \"types\": \"./dist/orders.d.ts\",\n \"import\": \"./dist/orders.js\",\n \"require\": \"./dist/orders.cjs\"\n },\n \"./availability\": {\n \"types\": \"./dist/availability.d.ts\",\n \"import\": \"./dist/availability.js\",\n \"require\": \"./dist/availability.cjs\"\n }\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run --coverage\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\",\n \"check:treeshake\": \"node scripts/check-treeshake.mjs\",\n \"fetch:specs\": \"tsx scripts/fetch-specs.ts\",\n \"generate\": \"tsx scripts/generate.ts\"\n },\n \"devDependencies\": {\n \"@hey-api/openapi-ts\": \"^0.97.3\",\n \"@types/node\": \"^24.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^8.0.0\",\n \"@typescript-eslint/parser\": \"^8.0.0\",\n \"@vitest/coverage-v8\": \"^4.1.11\",\n \"eslint\": \"^9.0.0\",\n \"msw\": \"^2.4.0\",\n \"prettier\": \"^3.3.0\",\n \"tsup\": \"^8.2.0\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^4.1.11\"\n }\n}\n","import { version } from \"../package.json\";\n\n/**\n * The published `@viu/emporix-sdk` version, surfaced on every log line as\n * `sdkVersion`. Read from `package.json` so it always matches the released\n * package; esbuild inlines the literal at build time (browser-safe — no\n * runtime filesystem access).\n */\nexport const SDK_VERSION: string = version;\n","import { validateConfig, type EmporixConfig, type ResolvedConfig } from \"./config\";\nimport {\n DefaultTokenProvider,\n CustomerRefreshRegistry,\n type TokenProvider,\n type CustomerTokenRefresher,\n} from \"./auth\";\nimport { HttpClient } from \"./http\";\nimport {\n LevelResolver,\n createConsoleLogger,\n createNoopLogger,\n type Logger,\n type LogLevel,\n type ServiceName,\n type LoggerObjectConfig,\n} from \"./logger\";\nimport type { ClientContext } from \"./context\";\nimport { SDK_VERSION } from \"../version\";\n\n/** The service-agnostic core shared by `EmporixClient` and `createEmporixClient`. */\nexport interface EmporixCore {\n readonly tenant: string;\n readonly config: ResolvedConfig;\n readonly tokenProvider: TokenProvider;\n setStorefrontContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n language?: string;\n }): void;\n setLogLevel(level: LogLevel, opts?: { service?: ServiceName; force?: boolean }): void;\n getLogLevel(service: ServiceName): LogLevel;\n setCustomerTokenRefresher(refresher: CustomerTokenRefresher | null): void;\n /** Internal: builds a per-service ClientContext (logger child + HttpClient). */\n mk(service: ServiceName): ClientContext;\n}\n\n/** Validates config and assembles the shared infrastructure (no services). */\nexport function createCore(config: EmporixConfig): EmporixCore {\n const cfg = validateConfig(config);\n\n let loggerObj: LoggerObjectConfig = {};\n let baseLogger: Logger | undefined;\n if (cfg.logger === false) {\n baseLogger = createNoopLogger();\n } else if (cfg.logger && typeof (cfg.logger as Logger).child === \"function\") {\n baseLogger = cfg.logger as Logger;\n } else if (cfg.logger) {\n loggerObj = cfg.logger as LoggerObjectConfig;\n }\n const resolver = new LevelResolver(loggerObj);\n const root =\n baseLogger ??\n createConsoleLogger(resolver, {\n sdk: \"emporix\",\n sdkVersion: SDK_VERSION,\n tenant: cfg.tenant,\n });\n\n const tokenProvider: TokenProvider = cfg.tokenProvider ?? new DefaultTokenProvider(cfg);\n const customerRefresh = new CustomerRefreshRegistry();\n const requestContext: { language?: string | undefined } = {\n language: cfg.credentials.storefront?.context?.language,\n };\n\n const mk = (service: ServiceName): ClientContext => ({\n tenant: cfg.tenant,\n tokenProvider,\n logger: root.child({ service }),\n http: new HttpClient({\n host: cfg.host,\n tenant: cfg.tenant,\n provider: tokenProvider,\n logger: root.child({ service: \"http\" }),\n retry: cfg.retry,\n timeouts: cfg.timeouts,\n customerRefresh,\n requestContext,\n // exactOptionalPropertyTypes: `{ fetch: undefined }` is a type error\n // against `fetch?: typeof globalThis.fetch`, so spread conditionally.\n ...(cfg.fetch !== undefined ? { fetch: cfg.fetch } : {}),\n ...(cfg.contentLanguage !== undefined ? { contentLanguage: cfg.contentLanguage } : {}),\n }),\n });\n\n return {\n tenant: cfg.tenant,\n config: cfg,\n tokenProvider,\n mk,\n setStorefrontContext(ctx) {\n if (ctx.language !== undefined) {\n requestContext.language = ctx.language || undefined;\n }\n const { language: _language, ...priceContext } = ctx;\n if (Object.keys(priceContext).length > 0) {\n tokenProvider.setAnonymousContext?.(priceContext);\n }\n },\n setLogLevel(level, opts = {}) {\n resolver.set(level, opts.service, opts.force ?? false);\n },\n getLogLevel(service) {\n return resolver.get(service);\n },\n setCustomerTokenRefresher(refresher) {\n customerRefresh.set(refresher);\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport type {\n Site,\n SiteInput,\n SiteCreated,\n SiteMixin,\n SiteMixins,\n SiteMixinCreated,\n} from \"./site-types\";\n\nexport type {\n Site,\n SiteAddress,\n SiteHomeBase,\n SiteInput,\n SiteCreated,\n SiteMixin,\n SiteMixins,\n SiteMixinCreated,\n} from \"./site-types\";\n\nconst ANON: AuthContext = auth.anonymous();\nconst SERVICE: AuthContext = auth.service();\n\n/**\n * Read-only access to the tenant's site catalog. List returns active sites\n * visible to the storefront context (the `site_manage` scope is only needed\n * to read inactive sites).\n */\nexport class SiteService {\n static readonly channel = \"site\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Lists active sites. */\n async list(authCtx: AuthContext = ANON): Promise<Site[]> {\n return this.ctx.http.request<Site[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites`,\n auth: authCtx,\n });\n }\n\n /** Retrieves one site by code. */\n async get(code: string, authCtx: AuthContext = ANON): Promise<Site> {\n return this.ctx.http.request<Site>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${code}`,\n auth: authCtx,\n });\n }\n\n /**\n * Returns the tenant's default site (the one with `default: true`).\n * Throws if no default is configured — a tenant should always have one.\n */\n async current(authCtx: AuthContext = ANON): Promise<Site> {\n const sites = await this.list(authCtx);\n const def = sites.find((s) => s.default);\n if (!def) {\n throw new Error(\n `SiteService.current: no default site for tenant \"${this.ctx.tenant}\"`,\n );\n }\n return def;\n }\n\n /** Lists just the tenant's site codes (`GET /siteslist`). Default auth: anonymous. */\n async listCodes(authCtx: AuthContext = ANON): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/siteslist`,\n auth: authCtx,\n });\n }\n\n // --- Admin writes. Default auth: service. ---\n\n /** Creates a site (`POST /sites`). Default auth: service. */\n async create(input: SiteInput, authCtx: AuthContext = SERVICE): Promise<SiteCreated> {\n return this.ctx.http.request<SiteCreated>({\n method: \"POST\",\n path: `/site/${this.ctx.tenant}/sites`,\n body: input,\n auth: authCtx,\n });\n }\n\n /**\n * Partially updates a site (`PATCH /sites/{siteCode}`). The endpoint responds\n * 200 without a defined body, so nothing is returned — re-read with\n * {@link get} when the updated site is needed. Default auth: service.\n */\n async update(siteCode: string, input: SiteInput, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n body: input,\n auth: authCtx,\n });\n }\n\n /**\n * Full-replaces a site (`PUT /sites/{siteCode}`). Like {@link update} it\n * returns nothing (200 with no defined body). `options.expand` is forwarded as\n * a query parameter. Default auth: service.\n */\n async replace(\n siteCode: string,\n input: SiteInput,\n options: { expand?: string } = {},\n authCtx: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n ...(options.expand === undefined ? {} : { query: { expand: options.expand } }),\n body: input,\n auth: authCtx,\n });\n }\n\n /** Deletes a site (`DELETE /sites/{siteCode}`). Default auth: service. */\n async delete(siteCode: string, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n auth: authCtx,\n });\n }\n\n /**\n * Site mixins (`/sites/{siteCode}/mixins`). Mixin content is an open map —\n * the spec defines no structure. Reads default to anonymous, writes to\n * service auth.\n */\n readonly mixins = {\n /** All mixin groups of a site, as a map of group name to content. */\n list: async (siteCode: string, authCtx: AuthContext = ANON): Promise<SiteMixins> =>\n this.ctx.http.request<SiteMixins>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins`,\n auth: authCtx,\n }),\n\n /** One mixin group's content by name. */\n get: async (siteCode: string, mixinName: string, authCtx: AuthContext = ANON): Promise<SiteMixin> =>\n this.ctx.http.request<SiteMixin>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n auth: authCtx,\n }),\n\n /** Adds a mixin to a site. Default auth: service. */\n create: async (\n siteCode: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<SiteMixinCreated> =>\n this.ctx.http.request<SiteMixinCreated>({\n method: \"POST\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins`,\n body: input,\n auth: authCtx,\n }),\n\n /**\n * Partially updates a mixin (PATCH). Responds 200 without a defined body,\n * so nothing is returned. Default auth: service.\n */\n update: async (\n siteCode: string,\n mixinName: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n body: input,\n auth: authCtx,\n });\n },\n\n /** Full-replaces a mixin (PUT). Returns nothing, like {@link update}. Default auth: service. */\n replace: async (\n siteCode: string,\n mixinName: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n body: input,\n auth: authCtx,\n });\n },\n\n /** Removes a mixin from a site. Default auth: service. */\n delete: async (siteCode: string, mixinName: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n auth: authCtx,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport type {\n SessionContext,\n SessionContextPatch,\n SessionAttributeInput,\n} from \"./session-context-types\";\n\nexport type {\n SessionContext,\n SessionContextPatch,\n SessionContextData,\n SessionAttributeInput,\n} from \"./session-context-types\";\n\nconst ANON: AuthContext = auth.anonymous();\n\n/**\n * Session-context binding for the current storefront session. Every method here\n * hits a `/me/context` path, so the session-id comes from the `Authorization`\n * token — no path or query parameter required.\n *\n * **The service's other half is intentionally not wrapped.** Emporix also exposes\n * the same four operations addressed by an explicit session id —\n * `GET`/`PUT /{sessionId}/context`, `POST`/`DELETE` on its attributes. Those are\n * administrative: they let a caller read and rewrite *someone else's* session,\n * which is not a storefront capability and needs a service token. Wrapping them\n * here would put an admin surface on the object a storefront holds. If you need\n * them, build the request directly — the generated types are in\n * `../generated/session-context`.\n */\nexport class SessionContextService {\n static readonly channel = \"session-context\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Retrieves the current session context, or `null` when the server returns\n * 404 (no session exists yet — the session-context is created server-side\n * only after the user creates a cart).\n */\n async get(authCtx: AuthContext = ANON): Promise<SessionContext | null> {\n try {\n return await this.ctx.http.request<SessionContext>({\n method: \"GET\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n auth: authCtx,\n });\n } catch (err) {\n if (isNotFound(err)) return null;\n throw err;\n }\n }\n\n /**\n * Partially updates the current session context. Returns `true` when the\n * PATCH was applied, `false` when there is no session context yet (the\n * server returned 404 on the version-lookup GET, so there is nothing to\n * update). Non-404 errors propagate.\n */\n async patch(input: SessionContextPatch, authCtx: AuthContext = ANON): Promise<boolean> {\n let version = input.version;\n if (version === undefined) {\n const current = await this.get(authCtx);\n if (current === null) return false;\n version = current.metadata?.version;\n if (version === undefined) {\n throw new Error(\n \"SessionContextService.patch: no metadata.version in server response\",\n );\n }\n }\n const { version: _v, ...fields } = input;\n void _v;\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n body: {\n ...fields,\n metadata: { version },\n },\n auth: authCtx,\n });\n return true;\n }\n\n /** Adds an attribute to the current session context. Default auth: anonymous. */\n async addAttribute(\n attribute: SessionAttributeInput,\n authCtx: AuthContext = ANON,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/session-context/${this.ctx.tenant}/me/context/attributes`,\n body: attribute,\n auth: authCtx,\n });\n }\n\n /** Removes a named attribute from the current session context. Default auth: anonymous. */\n async removeAttribute(name: string, authCtx: AuthContext = ANON): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/session-context/${this.ctx.tenant}/me/context/attributes/${encodeURIComponent(name)}`,\n auth: authCtx,\n });\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n if (err && typeof err === \"object\") {\n const status = (err as { status?: unknown }).status;\n if (typeof status === \"number\" && status === 404) return true;\n }\n return false;\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Configuration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nexport type { Configuration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Tenant-wide configuration (`/configuration/{tenant}/configurations`).\n * Requires the backend-only `configuration.configuration_view` /\n * `configuration.configuration_manage` scopes — default auth: service.\n * Server-side use only; the service token must never reach a browser.\n */\nexport class TenantConfigService {\n static readonly channel = \"configuration\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/configuration/${this.ctx.tenant}/configurations`;\n }\n\n /** List tenant configurations, optionally filtered by `keys`. */\n async list(opts: ListConfigOptions = {}, auth: AuthContext = SERVICE): Promise<Configuration[]> {\n const query = opts.keys && opts.keys.length > 0 ? { keys: opts.keys.join(\",\") } : undefined;\n return this.ctx.http.request<Configuration[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieve one tenant configuration by key. */\n async get<T = unknown>(key: string, auth: AuthContext = SERVICE): Promise<Configuration<T>> {\n return this.ctx.http.request<Configuration<T>>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /** Create one or more tenant configurations (array in, array out). */\n async create(drafts: ConfigurationDraft[], auth: AuthContext = SERVICE): Promise<Configuration[]> {\n return this.ctx.http.request<Configuration[]>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: drafts,\n });\n }\n\n /** Update one tenant configuration by key. */\n async update<T = unknown>(\n key: string,\n draft: ConfigurationDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<Configuration<T>> {\n return this.ctx.http.request<Configuration<T>>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete one tenant configuration by key. */\n async delete(key: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /**\n * List the platform-wide global configurations\n * (`GET /global-configurations`) — a separate resource from the tenant's own\n * `/configurations`.\n */\n async listGlobal<T = unknown>(auth: AuthContext = SERVICE): Promise<Configuration<T>[]> {\n return this.ctx.http.request<Configuration<T>[]>({\n method: \"GET\",\n path: `/configuration/${this.ctx.tenant}/global-configurations`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { ClientConfiguration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nexport type { ClientConfiguration } from \"./configuration-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Per-client configuration (`/configuration/{tenant}/clients/{client}/configurations`).\n * Requires the backend-only `configuration.configuration_view` /\n * `configuration.configuration_manage` scopes — default auth: service.\n * Server-side use only; the service token must never reach a browser.\n * The `client` arg is injected into each write body so callers don't repeat it.\n */\nexport class ClientConfigService {\n static readonly channel = \"configuration\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(client: string): string {\n return `/configuration/${this.ctx.tenant}/clients/${encodeURIComponent(client)}/configurations`;\n }\n\n /** List a client's configurations, optionally filtered by `keys`. */\n async list(\n client: string,\n opts: ListConfigOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration[]> {\n const query = opts.keys && opts.keys.length > 0 ? { keys: opts.keys.join(\",\") } : undefined;\n return this.ctx.http.request<ClientConfiguration[]>({\n method: \"GET\",\n path: this.base(client),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieve one client configuration by key. */\n async get<T = unknown>(\n client: string,\n key: string,\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration<T>> {\n return this.ctx.http.request<ClientConfiguration<T>>({\n method: \"GET\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /** Create one or more client configurations. Injects `client` into each item. */\n async create(\n client: string,\n drafts: ConfigurationDraft[],\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration[]> {\n const body = drafts.map((d) => ({ ...d, client }));\n return this.ctx.http.request<ClientConfiguration[]>({\n method: \"POST\",\n path: this.base(client),\n auth,\n body,\n });\n }\n\n /** Update one client configuration by key. Injects `client` into the body. */\n async update<T = unknown>(\n client: string,\n key: string,\n draft: ConfigurationDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration<T>> {\n return this.ctx.http.request<ClientConfiguration<T>>({\n method: \"PUT\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n body: { ...draft, client },\n });\n }\n\n /** Delete one client configuration by key. */\n async delete(client: string, key: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /**\n * List the client ids that have configurations (`GET /clients`). Note this\n * targets `/configuration/{tenant}/clients` directly — the private `base`\n * helper appends `/configurations` for a specific client.\n */\n async listClients(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `/configuration/${this.ctx.tenant}/clients`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\n\n/** A single shopping-list line item. */\nexport interface ShoppingListItem {\n id?: number;\n productId: string;\n quantity: number;\n cuttingOption?: string;\n servicePackagingOption?: string;\n comment?: string;\n mixins?: Record<string, unknown>;\n}\n\n/** A shopping list, normalized from the per-customer wire envelope. */\nexport interface ShoppingList {\n key: string;\n name: string;\n items: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n/** Input for create / replace. */\nexport interface ShoppingListDraft {\n name: string;\n items?: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n}\n\ninterface WireList {\n name?: string;\n items?: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nconst RESERVED = new Set([\"customerId\", \"metadata\"]);\n\n/** One per-customer wire envelope (`{ customerId, <listKey>: {…} }`) as a list array. */\nfunction toLists(env: Record<string, unknown>): ShoppingList[] {\n const out: ShoppingList[] = [];\n for (const [key, value] of Object.entries(env)) {\n if (RESERVED.has(key) || value === null || typeof value !== \"object\") continue;\n const v = value as WireList;\n out.push({\n key,\n name: v.name ?? key,\n items: v.items ?? [],\n ...(v.mixins ? { mixins: v.mixins } : {}),\n ...(v.metadata ? { metadata: v.metadata } : {}),\n });\n }\n return out;\n}\n\n/**\n * Per-customer shopping lists (`/shoppinglist/{tenant}/shopping-lists`).\n * `auth` is required: a customer token manages the caller's own lists;\n * a service token (employee scope) can act on any `customerId`. The Emporix\n * API has no item-level CRUD, so `addItem`/`removeItem`/`setItemQuantity`\n * read the list and `PUT` the full body — **last-write-wins**.\n */\nexport class ShoppingListService {\n static readonly channel = \"shopping-list\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/shoppinglist/${this.ctx.tenant}/shopping-lists`;\n }\n\n /**\n * The caller's lists, normalized to an array. With employee scope Emporix\n * returns **every customer's** lists and ignores `name` — read one customer's\n * with {@link getForCustomer} instead.\n */\n async list(auth: AuthContext, opts: { name?: string } = {}): Promise<ShoppingList[]> {\n const envelopes = await this.ctx.http.request<Array<Record<string, unknown>>>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n return (envelopes ?? []).flatMap(toLists);\n }\n\n /**\n * One customer's lists (`GET /shopping-lists/{customerId}`), normalized to an\n * array — the employee read; `name` narrows it to one list.\n */\n async getForCustomer(customerId: string, auth: AuthContext, opts: { name?: string } = {}): Promise<ShoppingList[]> {\n const envelope = await this.ctx.http.request<Record<string, unknown>>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n return envelope ? toLists(envelope) : [];\n }\n\n /** Create a list; returns the new list id. */\n async create(draft: ShoppingListDraft, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /** Replace the named list (low-level PUT). */\n async replace(customerId: string, draft: ShoppingListDraft, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete the named list, or all the customer's lists when `name` is omitted. */\n async delete(customerId: string, auth: AuthContext, opts: { name?: string } = {}): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n }\n\n private async loadList(customerId: string, listName: string, auth: AuthContext): Promise<ShoppingList> {\n // A service token reads the target customer's lists: through `list()` it\n // would get every customer's, with `name` ignored, and the first match\n // could belong to someone else — whose items would then be written here.\n const lists =\n auth.kind === \"service\"\n ? await this.getForCustomer(customerId, auth, { name: listName })\n : await this.list(auth, { name: listName });\n const found = lists.find((l) => l.name === listName);\n if (!found) throw new EmporixNotFoundError(`Shopping list \"${listName}\" not found`, 404);\n return found;\n }\n\n private async put(customerId: string, list: ShoppingList, items: ShoppingListItem[], auth: AuthContext): Promise<void> {\n await this.replace(\n customerId,\n { name: list.name, items, ...(list.mixins ? { mixins: list.mixins } : {}) },\n auth,\n );\n }\n\n /** Add/replace an item by `productId` (read-modify-write, last-write-wins). */\n async addItem(customerId: string, listName: string, item: ShoppingListItem, auth: AuthContext): Promise<void> {\n const list = await this.loadList(customerId, listName, auth);\n const items = [...list.items.filter((i) => i.productId !== item.productId), item];\n await this.put(customerId, list, items, auth);\n }\n\n /** Remove an item by `productId` (no-op if absent). */\n async removeItem(customerId: string, listName: string, productId: string, auth: AuthContext): Promise<void> {\n const list = await this.loadList(customerId, listName, auth);\n const items = list.items.filter((i) => i.productId !== productId);\n await this.put(customerId, list, items, auth);\n }\n\n /** Set an item's quantity; `quantity <= 0` removes it. Adds the item if absent. */\n async setItemQuantity(customerId: string, listName: string, productId: string, quantity: number, auth: AuthContext): Promise<void> {\n if (quantity <= 0) return this.removeItem(customerId, listName, productId, auth);\n const list = await this.loadList(customerId, listName, auth);\n let items = list.items.map((i) => (i.productId === productId ? { ...i, quantity } : i));\n if (!items.some((i) => i.productId === productId)) items = [...items, { productId, quantity }];\n await this.put(customerId, list, items, auth);\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { MetadataFilter, RagType } from \"./ai-rag-indexer-types\";\n\nexport type { MetadataFilter, RagType } from \"./ai-rag-indexer-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * AI RAG Indexer (`/ai-rag-indexer/{tenant}/{type}`). Read which fields the RAG\n * index embeds / can filter on, and trigger a full asynchronous rebuild.\n *\n * Requires the backend-only `ai.agent_read` (reads) / `ai.agent_manage`\n * (`reindex`) scopes — default auth: service. **Server-side use only**; the\n * service token must never reach a browser.\n *\n * Quirks: only `PRODUCT` exists today (the `type` arg defaults to it);\n * `reindex` is a **full** rebuild (no delta), runs **asynchronously**, returns\n * `204` once *scheduled* (not on completion), has **no status endpoint** to\n * poll, and is costly — call it sparingly. The set of embedded fields is\n * configured in the AI Service, not here.\n */\nexport class RagIndexerService {\n static readonly channel = \"ai-rag-indexer\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(type: RagType): string {\n return `/ai-rag-indexer/${this.ctx.tenant}/${encodeURIComponent(type)}`;\n }\n\n /** The indexable embedding field names for `type` (default `\"PRODUCT\"`). */\n async ragMetadata(type: RagType = \"PRODUCT\", auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `${this.base(type)}/rag-metadata`,\n auth,\n });\n }\n\n /** The filterable metadata fields for `type` (default `\"PRODUCT\"`). */\n async filterMetadata(\n type: RagType = \"PRODUCT\",\n auth: AuthContext = SERVICE,\n ): Promise<MetadataFilter[]> {\n return this.ctx.http.request<MetadataFilter[]>({\n method: \"GET\",\n path: `${this.base(type)}/filter-metadata`,\n auth,\n });\n }\n\n /**\n * Schedule a full asynchronous re-index for `type` (default `\"PRODUCT\"`).\n * Resolves once the rebuild is *scheduled* (HTTP 204); there is no progress\n * to await or poll. Costly — avoid calling on a hot path.\n * @deprecated since 2026-06-18, removal 2026-12-01 — use the indexing service:\n * `client.indexing.createReindexJob({ entityType: \"PRODUCT\", rag: true })`.\n */\n async reindex(type: RagType = \"PRODUCT\", auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base(type)}/reindex`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n SequenceSchema,\n SequenceSchemaCreate,\n NextIdCommandRequest,\n NextIdResponse,\n NextIdOptions,\n NextIdsBatchRequest,\n NextIdsBatchResponse,\n} from \"./sequential-id-types\";\n\nexport type {\n SequenceSchema,\n SequenceSchemaCreate,\n NextIdCommandRequest,\n NextIdResponse,\n NextIdOptions,\n BatchNextIdEntry,\n NextIdsBatchRequest,\n NextIdsBatchResponse,\n} from \"./sequential-id-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Sequential ID Service (`/sequential-id/{tenant}/…`): server-managed,\n * gap-free sequential identifiers (order/invoice numbers, etc.) driven by\n * tenant-defined sequence schemas.\n *\n * Requires the backend-only `sequentialid.schema_view` (read + next-id) /\n * `sequentialid.schema_manage` (CRUD + set-active) scopes — default auth:\n * service. Server-side use only; the service token must never reach a browser.\n *\n * Schemas are immutable upstream (no PATCH/PUT): to change one, `deleteSchema`\n * then `createSchema`. The `maxValue` is a hard cap with no auto-reset, and\n * only one schema may be active per type.\n */\nexport class SequentialIdService {\n static readonly channel = \"sequential-id\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/sequential-id/${this.ctx.tenant}/schemas`;\n }\n\n /** List all sequence schemas for the tenant. */\n async listSchemas(auth: AuthContext = SERVICE): Promise<SequenceSchema[]> {\n return this.ctx.http.request<SequenceSchema[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n });\n }\n\n /** Retrieve one sequence schema by id. */\n async getSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}`,\n auth,\n });\n }\n\n /** Create a sequence schema. Schemas are immutable — there is no update. */\n async createSchema(\n schema: SequenceSchemaCreate,\n auth: AuthContext = SERVICE,\n ): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: schema,\n });\n }\n\n /** Delete a sequence schema by id. */\n async deleteSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}`,\n auth,\n });\n }\n\n /** Mark a schema active for its type (only one schema may be active per type). */\n async setActiveSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}/setActive`,\n auth,\n });\n }\n\n /** Get the active schema for a given schema type. */\n async listSchemasByType(schemaType: string, auth: AuthContext = SERVICE): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"GET\",\n path: `${this.base()}/types/${encodeURIComponent(schemaType)}`,\n auth,\n });\n }\n\n /**\n * Generate the next id for a schema type. `body` carries an optional\n * `sequenceKey` (independent sub-pool counter) and `placeholders`.\n * `opts.siteCode` derives time/country placeholders from the site's settings.\n */\n async nextId(\n schemaType: string,\n body: NextIdCommandRequest = {},\n opts: NextIdOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<NextIdResponse> {\n const query = opts.siteCode ? { siteCode: opts.siteCode } : undefined;\n return this.ctx.http.request<NextIdResponse>({\n method: \"POST\",\n path: `${this.base()}/types/${encodeURIComponent(schemaType)}/nextId`,\n auth,\n body,\n ...(query ? { query } : {}),\n });\n }\n\n /**\n * Generate next ids for multiple schema types in one call. NOTE: the batch\n * endpoint path omits the `{tenant}` segment — the service derives the\n * tenant from the token.\n */\n async nextIdsBatch(\n req: NextIdsBatchRequest,\n auth: AuthContext = SERVICE,\n ): Promise<NextIdsBatchResponse> {\n return this.ctx.http.request<NextIdsBatchResponse>({\n method: \"POST\",\n path: `/sequential-id/sequenceSchemaBatch/nextIds`,\n auth,\n body: req,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { splitQuery } from \"../core/search\";\nimport type {\n Fee,\n ItemFee,\n FeeDraft,\n ItemFeeDraft,\n ItemFeeSearch,\n ItemFeeSearchByProductId,\n ItemFeeSearchByProductIds,\n ListFeesQuery,\n SetItemFeesOptions,\n} from \"./fee-types\";\n\nexport type {\n Fee,\n ItemFee,\n FeeDraft,\n ItemFeeDraft,\n ItemFeeSearch,\n ItemFeeSearchByProductId,\n ItemFeeSearchByProductIds,\n ListFeesQuery,\n SetItemFeesOptions,\n} from \"./fee-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Fee Service (`/fee/{tenant}/…`): fee definitions plus the\n * item/product mappings that attach them. Writes require a backend-only scope\n * (`fee.fee_*` / `fee.item_*`); GETs need a token but no scope. Default auth:\n * service. Server-side use only — the service token must never reach a browser.\n *\n * Quirks (server behavior, not handled here): a payment-type fee's `code` must\n * equal the payment-mode code or the fee is silently ignored; a wrong/missing\n * `siteCode` filters to an empty array rather than erroring; an expired\n * `activeTimespan` silently disables the fee; `setItemFees`/`setProductFees`\n * replace the whole mapping unless `partial` is set.\n */\nexport class FeeService {\n static readonly channel = \"fee\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private feesBase(): string {\n return `/fee/${this.ctx.tenant}/fees`;\n }\n\n private itemFeesBase(): string {\n return `/fee/${this.ctx.tenant}/itemFees`;\n }\n\n private productFeesBase(): string {\n return `/fee/${this.ctx.tenant}/productFees`;\n }\n\n // --- Fee definitions ---\n\n /**\n * List fee definitions, wrapped in the shared {@link PaginatedItems}\n * envelope (same heuristic as `media.list`: `hasNextPage` is true when the\n * returned page is full). Defaults match Emporix server defaults\n * (`pageNumber: 1`, `pageSize: 60`).\n */\n async list(query: ListFeesQuery = {}, auth: AuthContext = SERVICE): Promise<PaginatedItems<Fee>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // Destructured out because the rest is spread into the query string — see\n // `media.list` for the same note.\n const { totalCount, ...rest } = query;\n return requestPage<Fee>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.feesBase(),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /** Retrieve one fee definition by id. */\n async get(id: string, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"GET\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a fee definition. */\n async create(draft: FeeDraft, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"POST\",\n path: this.feesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Update a fee definition by id. */\n async update(id: string, draft: FeeDraft, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"PUT\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a fee definition by id. */\n async delete(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n // --- Item-fee mappings ---\n\n /** List all item-fee mappings. */\n async listItemFees(auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: this.itemFeesBase(),\n auth,\n });\n }\n\n /** Fee mappings for one item YRN. */\n async getItemFees(itemYrn: string, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`,\n auth,\n });\n }\n\n /** Create an item-fee mapping. */\n async createItemFee(draft: ItemFeeDraft, auth: AuthContext = SERVICE): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"POST\",\n path: this.itemFeesBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Set the fee list for an item YRN. Destructive replace by default; pass\n * `{ partial: true }` to merge (`?partial=true`).\n */\n async setItemFees(\n itemYrn: string,\n feeIds: string[],\n opts: SetItemFeesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"PUT\",\n path: `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`,\n auth,\n body: { feeIds },\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /**\n * Delete item-fee mappings for a YRN. Without `feeId`, removes all mappings\n * for the YRN; with `feeId`, removes that single fee from the mapping.\n */\n async deleteItemFees(itemYrn: string, feeId?: string, auth: AuthContext = SERVICE): Promise<void> {\n const base = `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`;\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: feeId ? `${base}/${encodeURIComponent(feeId)}` : base,\n auth,\n });\n }\n\n /** Search item-fee mappings by item YRNs + site. */\n async searchItemFees(search: ItemFeeSearch, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/search`,\n auth,\n body: search,\n });\n }\n\n // --- Product-fee mappings ---\n\n /** Fee mappings for a product id. */\n async getProductFees(productId: string, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n });\n }\n\n /**\n * Set the fee list for a product id. Destructive replace by default; pass\n * `{ partial: true }` to merge (`?partial=true`).\n */\n async setProductFees(\n productId: string,\n feeIds: string[],\n opts: SetItemFeesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"PUT\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n body: { feeIds },\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /** Delete all fee mappings for a product id. */\n async deleteProductFees(productId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n });\n }\n\n /**\n * Removes **one** fee from a product\n * (`DELETE /productFees/{productId}/fees/{feeId}`). Use\n * {@link deleteProductFees} to clear every fee of a product.\n */\n async deleteProductFee(\n productId: string,\n feeId: string,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees/${encodeURIComponent(feeId)}`,\n auth,\n });\n }\n\n /**\n * Finds item fees for one product across several sites\n * (`POST /itemFees/searchByProductId`).\n */\n async searchItemFeesByProductId(\n search: ItemFeeSearchByProductId,\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/searchByProductId`,\n auth,\n body: search,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Finds item fees for several products on one site\n * (`POST /itemFees/searchByProductIds`). Note the upstream asymmetry:\n * `productIds` is a comma-separated **string** and `siteCode` is singular.\n * `siteFallback` goes in the query string, everything else in the body.\n */\n async searchItemFeesByProductIds(\n search: ItemFeeSearchByProductIds,\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/searchByProductIds`,\n auth,\n ...splitQuery(search, [\"siteFallback\"]),\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\n\n/** Options for {@link CloudFunctionsService.invoke}. */\nexport interface InvokeCloudFunctionOptions<TReq = unknown> {\n /** HTTP method. Default: \"POST\" (the canonical invoke). */\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n /** Optional sub-path the function exposes (leading slash optional). */\n path?: string;\n /** Request body (arbitrary JSON). */\n body?: TReq;\n /** Query-string params. */\n query?: Record<string, string | number | undefined>;\n /** Extra request headers (Content-Type: application/json is the default). */\n headers?: Record<string, string>;\n}\n\n/**\n * Invokes Emporix-hosted cloud functions. Request/response shapes are\n * caller-defined (generic) — there is no schema. Auth may be service,\n * customer, anonymous, or raw; the default is anonymous.\n */\nexport class CloudFunctionsService {\n static readonly channel = \"cloud-functions\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/cloud-functions/${this.ctx.tenant}/functions`;\n }\n\n async invoke<TRes = unknown, TReq = unknown>(\n functionId: string,\n options: InvokeCloudFunctionOptions<TReq> = {},\n authCtx: AuthContext = auth.anonymous(),\n ): Promise<TRes> {\n const sub = options.path ? `/${options.path.replace(/^\\//, \"\")}` : \"\";\n return this.ctx.http.request<TRes>({\n method: options.method ?? \"POST\",\n path: `${this.base()}/${functionId}${sub}`,\n auth: authCtx,\n ...(options.body !== undefined ? { body: options.body } : {}),\n ...(options.query ? { query: options.query } : {}),\n ...(options.headers ? { headers: options.headers } : {}),\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n WebhookSubscription,\n WebhookSubscriptionUpdateItem,\n WebhookSubscriptionUpdateResultItem,\n WebhookConfig,\n WebhookConfigDraft,\n WebhookConfigPatch,\n WebhookConfigCreated,\n WebhookStatistics,\n WebhookDashboardAccess,\n WebhookStatisticsQuery,\n DeleteConfigOptions,\n} from \"./webhook-types\";\n\nexport type {\n WebhookSubscription,\n WebhookSubscriptionUpdateItem,\n WebhookSubscriptionUpdateResultItem,\n WebhookConfig,\n WebhookConfigDraft,\n WebhookConfigPatch,\n WebhookConfigCreated,\n WebhookStatistics,\n WebhookDashboardAccess,\n WebhookStatisticsQuery,\n DeleteConfigOptions,\n} from \"./webhook-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Webhook administration (`/webhook/{tenant}/…`): the event-subscription\n * catalog and batch toggle, delivery-config CRUD, statistics, and Svix\n * dashboard access. Requires the backend-only `webhook.subscription_read` /\n * `webhook.subscription_manage` scopes — default auth: service. Server-side\n * use only; the service token must never reach a browser.\n */\nexport class WebhookService {\n static readonly channel = \"webhook\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/webhook/${this.ctx.tenant}`;\n }\n\n /** List the event-subscription catalog with each event's on/off state. */\n async listEventSubscriptions(auth: AuthContext = SERVICE): Promise<WebhookSubscription[]> {\n return this.ctx.http.request<WebhookSubscription[]>({\n method: \"GET\",\n path: `${this.base()}/event-subscriptions`,\n auth,\n });\n }\n\n /**\n * Batch subscribe/unsubscribe events. Returns the **207** per-item result\n * array verbatim — the batch can partially fail, so inspect each element's\n * `code`/`status` (e.g. `results.filter(r => (r.code ?? 0) >= 400)`). Does\n * NOT throw on a 207 with failed items; only a non-2xx HTTP status throws.\n */\n async updateEventSubscriptions(\n items: WebhookSubscriptionUpdateItem[],\n auth: AuthContext = SERVICE,\n ): Promise<WebhookSubscriptionUpdateResultItem[]> {\n return this.ctx.http.request<WebhookSubscriptionUpdateResultItem[]>({\n method: \"PATCH\",\n path: `${this.base()}/event-subscriptions`,\n auth,\n body: items,\n });\n }\n\n /** List delivery configurations. */\n async listConfigs(auth: AuthContext = SERVICE): Promise<WebhookConfig[]> {\n return this.ctx.http.request<WebhookConfig[]>({\n method: \"GET\",\n path: `${this.base()}/config`,\n auth,\n });\n }\n\n /** Retrieve one delivery configuration by code. */\n async getConfig(code: string, auth: AuthContext = SERVICE): Promise<WebhookConfig> {\n return this.ctx.http.request<WebhookConfig>({\n method: \"GET\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a delivery configuration. Returns the server-assigned `{ code }`. */\n async createConfig(\n draft: WebhookConfigDraft,\n auth: AuthContext = SERVICE,\n ): Promise<WebhookConfigCreated> {\n return this.ctx.http.request<WebhookConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/config`,\n auth,\n body: draft,\n });\n }\n\n /** Replace a delivery configuration by code (204). */\n async replaceConfig(\n code: string,\n draft: WebhookConfigDraft,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Partially update a delivery configuration by code (204). The body is an\n * **array** of `{ op, path, value }` operations (UPSERT / REMOVE).\n */\n async patchConfig(\n code: string,\n patches: WebhookConfigPatch[],\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n body: patches,\n });\n }\n\n /**\n * Delete a delivery configuration by code. Pass `{ force: true }` to delete\n * the currently-active config (the server otherwise rejects it).\n */\n async deleteConfig(\n code: string,\n opts: DeleteConfigOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n ...(opts.force === true ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /** Read delivery statistics over an optional `YYYY-MM` range. */\n async getStatistics(\n query: WebhookStatisticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<WebhookStatistics> {\n const q: Record<string, string> = {};\n if (query.fromYearMonth) q.fromYearMonth = query.fromYearMonth;\n if (query.toYearMonth) q.toYearMonth = query.toYearMonth;\n return this.ctx.http.request<WebhookStatistics>({\n method: \"GET\",\n path: `${this.base()}/statistics`,\n auth,\n ...(Object.keys(q).length > 0 ? { query: q } : {}),\n });\n }\n\n /** Obtain Svix dashboard access (URL / token). */\n async getDashboardAccess(auth: AuthContext = SERVICE): Promise<WebhookDashboardAccess> {\n return this.ctx.http.request<WebhookDashboardAccess>({\n method: \"GET\",\n path: `${this.base()}/dashboard-access`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Schema,\n SchemaDraft,\n SchemaUpdate,\n SchemaTypeName,\n ListSchemasQuery,\n CustomEntity,\n CustomEntityDraft,\n CustomInstance,\n CustomInstanceDraft,\n ListInstancesQuery,\n ListCustomEntitiesOptions,\n InstanceSearchBody,\n SearchInstancesQuery,\n BulkPatchInstanceItem,\n BulkInstanceResult,\n SchemaReference,\n SchemaReferenceInput,\n SchemaReferenceUpdateInput,\n SchemaReferenceCreated,\n SchemaInstanceBulkCreateItem,\n SchemaInstanceBulkUpsertItem,\n SchemaExport,\n SchemaImportInput,\n ListSchemaReferencesQuery,\n} from \"./schema-types\";\n\nexport type {\n Schema,\n SchemaAttribute,\n SchemaTypeName,\n SchemaDraft,\n SchemaUpdate,\n CustomEntity,\n CustomInstance,\n CustomEntityDraft,\n CustomInstanceDraft,\n ListSchemasQuery,\n ListInstancesQuery,\n ListCustomEntitiesOptions,\n InstanceSearchBody,\n SearchInstancesQuery,\n BulkPatchInstanceItem,\n BulkInstanceResult,\n SchemaReference,\n SchemaReferenceInput,\n SchemaReferenceUpdateInput,\n SchemaReferenceCreated,\n SchemaInstanceBulkCreateItem,\n SchemaInstanceBulkUpsertItem,\n SchemaExport,\n SchemaImportInput,\n ListSchemaReferencesQuery,\n} from \"./schema-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** Passes a `Blob` through; serializes a plain object into a JSON blob. */\nfunction toJsonBlob(file: Blob | Record<string, unknown>): Blob {\n return file instanceof Blob\n ? file\n : new Blob([JSON.stringify(file)], { type: \"application/json\" });\n}\n\n/**\n * Schema Service (`/schema/{tenant}/…`): schemas, entity types, custom\n * entities and their instances. Requires the backend-only `schema.schema_*`\n * / `schema.custominstance_*` scopes — default auth: service. Server-side use\n * only; the service token must never reach a browser.\n */\nexport class SchemaService {\n static readonly channel = \"schema\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private schemasBase(): string {\n return `/schema/${this.ctx.tenant}/schemas`;\n }\n\n private entitiesBase(): string {\n return `/schema/${this.ctx.tenant}/custom-entities`;\n }\n\n private instancesBase(type: string): string {\n return `${this.entitiesBase()}/${encodeURIComponent(type)}/instances`;\n }\n\n private referencesBase(): string {\n return `/schema/${this.ctx.tenant}/references`;\n }\n\n // --- (A) Schemas ---------------------------------------------------------\n\n /**\n * List schemas, wrapped in the shared {@link PaginatedItems} envelope.\n * `hasNextPage` is the standard SDK heuristic (`items.length === pageSize`).\n * Pagination defaults match the rest of the SDK (`pageNumber: 1`,\n * `pageSize: 60`).\n */\n async listSchemas(\n query: ListSchemasQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<Schema>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.q) q.q = query.q;\n if (query.type) q.type = query.type;\n return requestPage<Schema>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.schemasBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Retrieve one schema by id. */\n async getSchema(id: string, auth: AuthContext = SERVICE): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"GET\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a schema. */\n async createSchema(draft: SchemaDraft, auth: AuthContext = SERVICE): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"POST\",\n path: this.schemasBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Update a schema. The upstream API requires `draft.metadata.version`; a\n * stale version yields 409 Conflict (propagated as the standard conflict\n * error).\n */\n async updateSchema(\n id: string,\n draft: SchemaUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"PUT\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a schema by id. */\n async deleteSchema(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Validate a schema document without persisting it (`POST /schemas/file`).\n * Returns the server's validation result verbatim.\n */\n async validateSchemaFile<R = unknown>(\n body: SchemaDraft,\n auth: AuthContext = SERVICE,\n ): Promise<R> {\n return this.ctx.http.request<R>({\n method: \"POST\",\n path: `${this.schemasBase()}/file`,\n auth,\n body,\n });\n }\n\n // --- (B) Types -----------------------------------------------------------\n\n /** List entity types that currently have at least one schema. */\n async listTypes(auth: AuthContext = SERVICE): Promise<SchemaTypeName[]> {\n return this.ctx.http.request<SchemaTypeName[]>({\n method: \"GET\",\n path: `/schema/${this.ctx.tenant}/types`,\n auth,\n });\n }\n\n /** Set the entity types a schema applies to (`PUT /schemas/{id}/types`). */\n async setSchemaTypes(\n id: string,\n types: SchemaTypeName[],\n auth: AuthContext = SERVICE,\n ): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"PUT\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}/types`,\n auth,\n body: { types },\n });\n }\n\n // --- (C) Custom entities -------------------------------------------------\n\n /** List custom-entity definitions. `expandSchemas` inlines each schema body. */\n async listCustomEntities(\n opts: ListCustomEntitiesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntity[]> {\n return this.ctx.http.request<CustomEntity[]>({\n method: \"GET\",\n path: this.entitiesBase(),\n auth,\n ...(opts.expandSchemas ? { query: { expandSchemas: \"true\" } } : {}),\n });\n }\n\n /** Retrieve one custom-entity definition by id. */\n async getCustomEntity(id: string, auth: AuthContext = SERVICE): Promise<CustomEntity> {\n return this.ctx.http.request<CustomEntity>({\n method: \"GET\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a custom-entity definition. */\n async createCustomEntity(\n draft: CustomEntityDraft,\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntity> {\n return this.ctx.http.request<CustomEntity>({\n method: \"POST\",\n path: this.entitiesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Update a custom-entity definition. */\n async updateCustomEntity(\n id: string,\n draft: CustomEntityDraft,\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntity> {\n return this.ctx.http.request<CustomEntity>({\n method: \"PUT\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Delete a custom-entity definition. The server rejects with 409 if\n * instances or schemas still reference it (propagated as the standard\n * conflict error).\n */\n async deleteCustomEntity(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n // --- (D) Custom instances ------------------------------------------------\n\n /**\n * List a custom entity's instances, wrapped in {@link PaginatedItems}.\n * `type` is the custom-entity type and is always the first argument.\n */\n async listInstances<T = Record<string, unknown>>(\n type: string,\n query: ListInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<CustomInstance<T>>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // `totalCount` is an SDK-side flag, not an Emporix query parameter — it\n // becomes a request header in requestPage. Sending it in the query too\n // would be a stray `?totalCount=true` on every call.\n const { totalCount, ...rest } = query;\n return requestPage<CustomInstance<T>>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.instancesBase(type),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /**\n * Async-iterates every instance of a type.\n *\n * Not built on `iterateAll`: that helper drives pagination by page number, and\n * the server ignores `pageNumber` the moment a cursor is in play. This follows\n * `nextCursor` while the server offers one and falls back to `pageNumber + 1`\n * when it does not — so it is correct whether or not the tenant's deployment\n * emits cursor headers on a request that carries no cursor.\n */\n async *listAllInstances<T = Record<string, unknown>>(\n type: string,\n // Takes the full query type rather than an `Omit<…>`: `ListInstancesQuery`\n // has an index signature, so `Omit` would not actually forbid `next` — it\n // would only look like it did. The overrides below win regardless.\n query: ListInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): AsyncIterable<CustomInstance<T>> {\n let cursor: string | undefined;\n let pageNumber = 1;\n for (;;) {\n const page = await this.listInstances<T>(\n type,\n { ...query, pageNumber, ...(cursor === undefined ? {} : { next: cursor }) },\n auth,\n );\n for (const item of page.items) yield item;\n if (!page.hasNextPage) return;\n cursor = page.nextCursor;\n // Only advances while there is no cursor. Once cursor mode takes over the\n // server ignores pageNumber anyway, so leaving it pinned keeps the two\n // modes from interfering.\n if (cursor === undefined) pageNumber += 1;\n }\n }\n\n /** Retrieve one instance by id. */\n async getInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"GET\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create an instance of a custom entity. */\n async createInstance<T = Record<string, unknown>>(\n type: string,\n draft: CustomInstanceDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"POST\",\n path: this.instancesBase(type),\n auth,\n body: draft,\n });\n }\n\n /** Replace an instance (full `PUT`). */\n async replaceInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n draft: CustomInstanceDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"PUT\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Partially update an instance (`PATCH`). */\n async patchInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n patch: Partial<CustomInstanceDraft<T>>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"PATCH\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n body: patch,\n });\n }\n\n /**\n * Patch up to 200 custom instances of `type` in one call\n * (`PATCH /custom-entities/{type}/instances/bulk`). Returns a 207 envelope:\n * a per-item result array — a 207 is success, individual failures live in\n * each item's `code`/`status`.\n */\n async bulkPatchInstances(\n type: string,\n items: BulkPatchInstanceItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"PATCH\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Create multiple instances in one request\n * (`POST /custom-entities/{type}/instances/bulk`). Returns a 207 envelope:\n * a per-item result array — a 207 is success, individual failures live in\n * each item's `code`/`status`.\n */\n async bulkCreateInstances(\n type: string,\n items: SchemaInstanceBulkCreateItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"POST\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Upsert multiple instances in one request\n * (`PUT /custom-entities/{type}/instances/bulk`). Each item carries its `id`.\n * Returns the same 207 per-item envelope as {@link bulkCreateInstances}.\n */\n async bulkUpsertInstances(\n type: string,\n items: SchemaInstanceBulkUpsertItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"PUT\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Delete multiple instances by id\n * (`DELETE /custom-entities/{type}/instances/bulk`). Returns the same 207\n * per-item envelope as {@link bulkCreateInstances}.\n *\n * **Note:** the OpenAPI schema declares no request body for this operation,\n * but its description mandates one — \"The IDs of items should be defined in\n * the request body as an array of strings\" (example\n * `[\"firstId\", \"secondId\"]`). The SDK follows the description and sends the\n * id array. Unverified against the live API.\n */\n async bulkDeleteInstances(\n type: string,\n ids: string[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"DELETE\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: ids,\n });\n }\n\n /**\n * Export custom entities and their schemas\n * (`POST /custom-entities/export`). Pass the entity types to include; the\n * result carries a base64 `data` payload plus `exportedAt`.\n */\n async exportCustomEntities(types: string[], auth: AuthContext = SERVICE): Promise<SchemaExport> {\n return this.ctx.http.request<SchemaExport>({\n method: \"POST\",\n path: `${this.entitiesBase()}/export`,\n auth,\n body: types,\n });\n }\n\n /**\n * Import custom entities and their schemas\n * (`POST /custom-entities/import`) from the base64 `data` produced by\n * {@link exportCustomEntities}.\n */\n async importCustomEntities(input: SchemaImportInput, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.entitiesBase()}/import`,\n auth,\n body: input,\n });\n }\n\n /** Delete an instance by id. */\n async deleteInstance(type: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Structured search over a custom entity's instances\n * (`POST /instances/search`), wrapped in {@link PaginatedItems}.\n *\n * The `query` parameter is third and `auth` fourth. This used to forward no\n * query parameters at all and report a hard-coded `hasNextPage: false`, so a\n * search could only ever return the server's default first page.\n */\n async searchInstances<T = Record<string, unknown>>(\n type: string,\n body: InstanceSearchBody,\n query: SearchInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<CustomInstance<T>>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const { totalCount, ...rest } = query;\n return requestPage<CustomInstance<T>>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `${this.instancesBase(type)}/search`,\n auth,\n body,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n // --- (E) References ------------------------------------------------------\n\n /**\n * Reference entities (`/references`) — a schema plus an uploaded JSON file.\n * Create/update are `multipart/form-data` (parts `file` and `body`), like\n * the media service's blob upload. Default auth: service.\n */\n readonly references = {\n /**\n * List references, wrapped in {@link PaginatedItems}. Pagination defaults\n * match the rest of this service (`pageNumber: 1`, `pageSize: 60`).\n */\n list: async (\n query: ListSchemaReferencesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SchemaReference>> => {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.sort) q.sort = query.sort;\n if (query.q) q.q = query.q;\n if (query.fields) q.fields = query.fields;\n if (query.type) q.type = query.type;\n return requestPage<SchemaReference>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.referencesBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n },\n\n /** Retrieve one reference by id. */\n get: async (id: string, auth: AuthContext = SERVICE): Promise<SchemaReference> =>\n this.ctx.http.request<SchemaReference>({\n method: \"GET\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n auth,\n }),\n\n /**\n * Create a reference. `file` is the reference's JSON content — pass a\n * `Blob` to upload as-is, or a plain object to have it serialized into a\n * JSON blob. `body` carries the metadata.\n */\n create: async (\n input: { file: Blob | Record<string, unknown>; body: SchemaReferenceInput },\n auth: AuthContext = SERVICE,\n ): Promise<SchemaReferenceCreated> => {\n const fd = new FormData();\n fd.set(\"file\", toJsonBlob(input.file));\n fd.set(\"body\", JSON.stringify(input.body));\n return this.ctx.http.request<SchemaReferenceCreated>({\n method: \"POST\",\n path: this.referencesBase(),\n auth,\n body: fd,\n });\n },\n\n /**\n * Update a reference (multipart, like {@link create}). `options.version`\n * enables optimistic locking — the server answers 409 on a stale version.\n */\n update: async (\n id: string,\n input: { file: Blob | Record<string, unknown>; body: SchemaReferenceUpdateInput },\n options: { version?: number } = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> => {\n const fd = new FormData();\n fd.set(\"file\", toJsonBlob(input.file));\n fd.set(\"body\", JSON.stringify(input.body));\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n ...(options.version === undefined ? {} : { query: { version: options.version } }),\n auth,\n body: fd,\n });\n },\n\n /** Delete a reference by id. */\n delete: async (id: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchQuery,\n Created,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n} from \"./ai-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * A symmetric CRUD resource over an agentic sub-collection (`tools`,\n * `mcp-servers`, `tokens`, `oauths`). All six operations share the upstream\n * shape; only the base path and the Read/Write types differ. Server-side only\n * — every call defaults to the SERVICE (backend) token.\n */\nexport class AgenticCrudResource<Read, Write> {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string,\n ) {}\n\n private item(id: string): string {\n return `${this.path}/${encodeURIComponent(id)}`;\n }\n\n /** List the collection (`GET {path}`). Optional `q`/paging/sort/fields/expand. */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<Read[]> {\n return this.ctx.http.request<Read[]>({ method: \"GET\", path: this.path, auth, query: { ...query } });\n }\n\n /** Structured search (`POST {path}/search`): `q` in the body, paging/sort/fields in the query. */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<Read[]> {\n return this.ctx.http.request<Read[]>({ method: \"POST\", path: `${this.path}/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n\n /** Retrieve one entry by id (`GET {path}/{id}`). */\n get(id: string, opts: GetOptions = {}, auth: AuthContext = SERVICE): Promise<Read> {\n return this.ctx.http.request<Read>({ method: \"GET\", path: this.item(id), auth, query: { ...opts } });\n }\n\n /**\n * Create-or-replace by id (`PUT {path}/{id}`). Resolves to `{ id }` on create\n * (HTTP 201) and `undefined` on update (HTTP 204). `{ force: true }`\n * cascade-disables dependents.\n */\n upsert(\n id: string,\n body: Write,\n opts: MutateOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Created | undefined> {\n return this.ctx.http.request<Created | undefined>({\n method: \"PUT\",\n path: this.item(id),\n auth,\n body,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /**\n * Partial update with an op array (`PATCH {path}/{id}`, 204). `ops` use the\n * upstream UPPERCASE enum (`ADD | REMOVE | REPLACE`), sent verbatim.\n */\n async patch(id: string, ops: AgenticPatchOp[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.item(id), auth, body: ops });\n }\n\n /** Delete by id (`DELETE {path}/{id}`). `{ force: true }` removes even if referenced. */\n async delete(id: string, opts: MutateOptions = {}, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: this.item(id),\n auth,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n}\n\n/**\n * AI async jobs (`/ai-service/{tenant}/jobs`). NOTE: not under `/agentic`.\n * `chatAsync` returns a `jobId`; poll/list/delete it here.\n */\nexport class JobsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly base: string,\n ) {}\n\n /** List jobs (`GET /jobs`). */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<Job[]> {\n return this.ctx.http.request<Job[]>({ method: \"GET\", path: `${this.base}/jobs`, auth, query: { ...query } });\n }\n /** Structured job search (`POST /jobs/search`). */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<Job[]> {\n return this.ctx.http.request<Job[]>({ method: \"POST\", path: `${this.base}/jobs/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /** Retrieve one job (`GET /jobs/{jobId}`). */\n get(jobId: string, auth: AuthContext = SERVICE): Promise<Job> {\n return this.ctx.http.request<Job>({ method: \"GET\", path: `${this.base}/jobs/${encodeURIComponent(jobId)}`, auth });\n }\n /** Delete one job (`DELETE /jobs/{jobId}`). */\n async delete(jobId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: `${this.base}/jobs/${encodeURIComponent(jobId)}`, auth });\n }\n}\n\n/** Agent templates (`/agentic/templates`). `list · search · clone`. */\nexport class TemplatesResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/templates`\n ) {}\n\n /** List available templates (`GET /agentic/templates`). */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentTemplate[]> {\n return this.ctx.http.request<AgentTemplate[]>({ method: \"GET\", path: this.path, auth, query: { ...query } });\n }\n /** Structured template search (`POST /agentic/templates/search`). */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentTemplate[]> {\n return this.ctx.http.request<AgentTemplate[]>({ method: \"POST\", path: `${this.path}/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /**\n * Instantiate a new agent from a template\n * (`POST /agentic/templates/{templateId}/agents`, HTTP 201). Returns the\n * created agent's id.\n */\n clone(templateId: string, body: AgentFromTemplate, auth: AuthContext = SERVICE): Promise<Created> {\n return this.ctx.http.request<Created>({\n method: \"POST\",\n path: `${this.path}/${encodeURIComponent(templateId)}/agents`,\n auth,\n body,\n });\n }\n}\n\n/** Agent logs (`/agentic/logs`): request logs and session logs. */\nexport class LogsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/logs`\n ) {}\n\n /** List request logs (`GET /agentic/logs/requests`). */\n listRequests(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentRequestLog[]> {\n return this.ctx.http.request<AgentRequestLog[]>({ method: \"GET\", path: `${this.path}/requests`, auth, query: { ...query } });\n }\n /** Retrieve one request log (`GET /agentic/logs/requests/{requestId}`). */\n getRequest(requestId: string, auth: AuthContext = SERVICE): Promise<AgentRequestLog> {\n return this.ctx.http.request<AgentRequestLog>({ method: \"GET\", path: `${this.path}/requests/${encodeURIComponent(requestId)}`, auth });\n }\n /** Structured request-log search (`POST /agentic/logs/requests/search`). */\n searchRequests(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentRequestLog[]> {\n return this.ctx.http.request<AgentRequestLog[]>({ method: \"POST\", path: `${this.path}/requests/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /** List session logs (`GET /agentic/logs/sessions`). */\n listSessions(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentSessionLog[]> {\n return this.ctx.http.request<AgentSessionLog[]>({ method: \"GET\", path: `${this.path}/sessions`, auth, query: { ...query } });\n }\n /** Retrieve one session log (`GET /agentic/logs/sessions/{sessionId}`). */\n getSession(sessionId: string, auth: AuthContext = SERVICE): Promise<AgentSessionLog> {\n return this.ctx.http.request<AgentSessionLog>({ method: \"GET\", path: `${this.path}/sessions/${encodeURIComponent(sessionId)}`, auth });\n }\n /** Structured session-log search (`POST /agentic/logs/sessions/search`). */\n searchSessions(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentSessionLog[]> {\n return this.ctx.http.request<AgentSessionLog[]>({ method: \"POST\", path: `${this.path}/sessions/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n}\n\n/** Agent analytics (`/agentic/analytics`). */\nexport class AnalyticsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/analytics`\n ) {}\n\n /** Aggregated metrics (`GET /agentic/analytics`); scope with `agentId`. */\n get(opts: AnalyticsQuery = {}, auth: AuthContext = SERVICE): Promise<AgentAnalytics> {\n return this.ctx.http.request<AgentAnalytics>({ method: \"GET\", path: this.path, auth, query: { ...opts } });\n }\n /** Per-agent execution counts (`GET /agentic/analytics/executions`). `agentIds` required. */\n executions(query: ExecutionsQuery, auth: AuthContext = SERVICE): Promise<AgentExecutions> {\n return this.ctx.http.request<AgentExecutions>({ method: \"GET\", path: `${this.path}/executions`, auth, query: { ...query } });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport {\n AgenticCrudResource,\n JobsResource,\n TemplatesResource,\n LogsResource,\n AnalyticsResource,\n} from \"./ai-resources\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n TextRequest,\n TextResponse,\n CompletionRequest,\n CompletionResponse,\n Agent,\n AgentInput,\n AgentPatchOp,\n AgentSearchQuery,\n ChatRequest,\n ChatResponse,\n JobIdResponse,\n DeleteAgentOptions,\n ChatOptions,\n Conversation,\n ConversationSearchQuery,\n Created,\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchQuery,\n OAuthConfig,\n OAuthInput,\n Tool,\n ToolInput,\n Token,\n TokenInput,\n McpServer,\n McpServerInput,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n ProviderModels,\n CommerceEvents,\n Attachment,\n AttachmentOptions,\n AttachmentReuseOptions,\n AgentsExport,\n AgentsExportRequest,\n AgentsImport,\n AgentsImportRequest,\n} from \"./ai-types\";\n\nexport type {\n TextRequest,\n TextResponse,\n CompletionMessage,\n CompletionRequest,\n CompletionResponse,\n Agent,\n AgentInput,\n AgentPatchOp,\n AgentSearchQuery,\n ChatRequest,\n ChatResponse,\n JobIdResponse,\n DeleteAgentOptions,\n ChatOptions,\n ChatStreamOptions,\n Conversation,\n ConversationSearchQuery,\n Created,\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchPaging,\n SearchQuery,\n OAuthConfig,\n OAuthInput,\n Tool,\n ToolInput,\n Token,\n TokenInput,\n McpServer,\n McpServerInput,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n ProviderModels,\n CommerceEvents,\n Attachment,\n AttachmentOptions,\n AttachmentReuseOptions,\n AgentsExport,\n AgentsExportRequest,\n AgentsImport,\n AgentsImportRequest,\n} from \"./ai-types\";\n\nexport type {\n AgenticCrudResource,\n AnalyticsResource,\n JobsResource,\n LogsResource,\n TemplatesResource,\n} from \"./ai-resources\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * `chat` and `chatAsync` took `auth` second until 4.0.0; now options come\n * second and `auth` third, as on `chatStream`. An old call would otherwise have\n * its auth context read as options and run on the default service token —\n * silently, in plain JavaScript — so it throws instead.\n */\nfunction assertChatOptions(opts: ChatOptions, method: string): void {\n if (typeof opts === \"object\" && opts !== null && \"kind\" in opts) {\n throw new Error(\n `ai.${method}: the second argument is { sessionId? } since 4.0.0 — pass the auth context third`,\n );\n }\n}\n\nfunction sessionHeader(opts: ChatOptions): { headers?: Record<string, string> } {\n return opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {};\n}\n\nconst AUTH_KINDS = new Set([\"service\", \"anonymous\", \"customer\", \"raw\"]);\n\n/**\n * `listAgents` and `listConversations` took only `auth` before they could page.\n * Tells that original call apart from `(query, auth)`, so an auth context is\n * never sent as query parameters — which would put a customer token in the URL.\n */\nfunction isAuthContext(value: ListQuery | AuthContext): value is AuthContext {\n return AUTH_KINDS.has(String((value as { kind?: unknown }).kind));\n}\n\n/**\n * Emporix AI Service (`/ai-service/{tenant}/…`): text generation, chat\n * completions, and the agentic layer (agent CRUD + synchronous/asynchronous\n * chat). Every endpoint requires a backend-only `ai.*` scope and the\n * **service (clientCredentials) token** — default auth: service.\n *\n * Server-side use only; the service token must never reach a browser. A\n * storefront chat (scope `ai.agentexecution_manage_own`) would require a\n * BFF / token-proxy — out of scope for this SDK.\n *\n * The model is server-fixed per tenant; there is no `model` parameter.\n */\nexport class AiService {\n static readonly channel = \"ai\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/ai-service/${this.ctx.tenant}`;\n }\n\n // --- Agentic building blocks (CRUD sub-resources) ----------------------\n\n private _oauths?: AgenticCrudResource<OAuthConfig, OAuthInput>;\n /** OAuth 2.0 client-credentials configs (`/agentic/oauths`). CRUD sub-resource. */\n get oauths(): AgenticCrudResource<OAuthConfig, OAuthInput> {\n return (this._oauths ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/oauths`));\n }\n\n private _tools?: AgenticCrudResource<Tool, ToolInput>;\n /** Agentic tools (`/agentic/tools`). CRUD sub-resource. */\n get tools(): AgenticCrudResource<Tool, ToolInput> {\n return (this._tools ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/tools`));\n }\n\n private _tokens?: AgenticCrudResource<Token, TokenInput>;\n /** Stored tokens (`/agentic/tokens`) — an OAuth config's client secret. CRUD sub-resource. */\n get tokens(): AgenticCrudResource<Token, TokenInput> {\n return (this._tokens ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/tokens`));\n }\n\n private _mcpServers?: AgenticCrudResource<McpServer, McpServerInput>;\n /** MCP-server configs (`/agentic/mcp-servers`). CRUD sub-resource. */\n get mcpServers(): AgenticCrudResource<McpServer, McpServerInput> {\n return (this._mcpServers ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/mcp-servers`));\n }\n\n private _jobs?: JobsResource;\n /** AI async jobs (`/jobs`). `list · search · get · delete`. */\n get jobs(): JobsResource {\n return (this._jobs ??= new JobsResource(this.ctx, this.base()));\n }\n\n private _templates?: TemplatesResource;\n /** Agent templates (`/agentic/templates`). `list · search · clone`. */\n get templates(): TemplatesResource {\n return (this._templates ??= new TemplatesResource(this.ctx, `${this.base()}/agentic/templates`));\n }\n\n private _logs?: LogsResource;\n /** Agent logs (`/agentic/logs`): request + session logs. */\n get logs(): LogsResource {\n return (this._logs ??= new LogsResource(this.ctx, `${this.base()}/agentic/logs`));\n }\n\n private _analytics?: AnalyticsResource;\n /** Agent analytics (`/agentic/analytics`). `get · executions`. */\n get analytics(): AnalyticsResource {\n return (this._analytics ??= new AnalyticsResource(this.ctx, `${this.base()}/agentic/analytics`));\n }\n\n /** Generate text from a single prompt (`POST /texts`). Honors `maxTokens`. */\n async generateText(input: TextRequest, auth: AuthContext = SERVICE): Promise<TextResponse> {\n return this.ctx.http.request<TextResponse>({\n method: \"POST\",\n path: `${this.base()}/texts`,\n auth,\n body: input,\n });\n }\n\n /** Run a chat completion over a message list (`POST /completions`). No `maxTokens`. */\n async complete(\n input: CompletionRequest,\n auth: AuthContext = SERVICE,\n ): Promise<CompletionResponse> {\n return this.ctx.http.request<CompletionResponse>({\n method: \"POST\",\n path: `${this.base()}/completions`,\n auth,\n body: input,\n });\n }\n\n /**\n * List agents (`GET /agentic/agents`). `q`, `pageNumber`, `pageSize`, `sort`,\n * `fields` and `expand` go in the query string; without paging keys the\n * server returns its first page. The original `listAgents(auth)` still works.\n */\n listAgents(auth?: AuthContext): Promise<Agent[]>;\n listAgents(query: ListQuery, auth?: AuthContext): Promise<Agent[]>;\n async listAgents(queryOrAuth: ListQuery | AuthContext = {}, auth: AuthContext = SERVICE): Promise<Agent[]> {\n const [query, ctx]: [ListQuery, AuthContext] = isAuthContext(queryOrAuth)\n ? [{}, queryOrAuth]\n : [queryOrAuth, auth];\n return this.ctx.http.request<Agent[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/agents`,\n auth: ctx,\n query: { ...query },\n });\n }\n\n /** Retrieve one agent by id. */\n async getAgent(id: string, auth: AuthContext = SERVICE): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"GET\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create-or-replace an agent by id (`PUT`). Takes the agent write shape. */\n async upsertAgent(id: string, agent: AgentInput, auth: AuthContext = SERVICE): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"PUT\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n body: agent,\n });\n }\n\n /**\n * Patch an agent with an op array (`PATCH`). `ops` use the upstream\n * UPPERCASE enum (`ADD | REMOVE | REPLACE`) and are sent verbatim — this is\n * NOT RFC-6902 JSON-Patch.\n */\n async patchAgent(\n id: string,\n ops: AgentPatchOp[],\n auth: AuthContext = SERVICE,\n ): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"PATCH\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n body: ops,\n });\n }\n\n /**\n * Delete an agent by id. Pass `{ force: true }` to delete an agent that is\n * still referenced elsewhere (`?force=true`).\n */\n async deleteAgent(\n id: string,\n auth: AuthContext = SERVICE,\n opts: DeleteAgentOptions = {},\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /**\n * Server-side agent search (`POST /agentic/agents/search`). `q` goes in the\n * body; `pageNumber`, `pageSize`, `sort` and `fields` in the query string.\n */\n async searchAgents(query: AgentSearchQuery, auth: AuthContext = SERVICE): Promise<Agent[]> {\n return this.ctx.http.request<Agent[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n });\n }\n\n /**\n * Synchronous agent chat (`POST /agentic/chat`). Returns the response\n * ARRAY verbatim (the upstream contract is an array, not a single object).\n *\n * `opts.sessionId` is sent as the `session-id` header. It carries the\n * conversation — continuity needs it plus `enabledMemory` on the agent — and\n * it is how a chat reaches an attachment: pass the `sessionId` the upload or\n * reuse returned, and list the file under `input.attachments`.\n */\n async chat(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ChatResponse[]> {\n assertChatOptions(opts, \"chat\");\n return this.ctx.http.request<ChatResponse[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/chat`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n }\n\n /**\n * Fire-and-forget agent chat (`POST /agentic/chat-async`, HTTP 201).\n * Returns the job-id ARRAY verbatim. `opts` as for {@link chat}.\n */\n async chatAsync(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<JobIdResponse[]> {\n assertChatOptions(opts, \"chatAsync\");\n return this.ctx.http.request<JobIdResponse[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/chat-async`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n }\n\n /**\n * Streaming agent chat (`POST /agentic/chat-stream`, `text/event-stream`).\n * Yields each SSE `data` payload verbatim — the upstream contract types the\n * stream body as an opaque string, so chunks are raw strings, not parsed\n * objects. Consume with `for await`. `opts` as for {@link chat}.\n */\n async *chatStream(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): AsyncIterable<string> {\n assertChatOptions(opts, \"chatStream\");\n const events = this.ctx.http.requestStream({\n method: \"POST\",\n path: `${this.base()}/agentic/chat-stream`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n for await (const ev of events) yield ev.data;\n }\n\n /**\n * List stored agentic conversations (`GET /agentic/conversations`), paged\n * like {@link listAgents}. The original `listConversations(auth)` still works.\n */\n listConversations(auth?: AuthContext): Promise<Conversation[]>;\n listConversations(query: ListQuery, auth?: AuthContext): Promise<Conversation[]>;\n async listConversations(\n queryOrAuth: ListQuery | AuthContext = {},\n auth: AuthContext = SERVICE,\n ): Promise<Conversation[]> {\n const [query, ctx]: [ListQuery, AuthContext] = isAuthContext(queryOrAuth)\n ? [{}, queryOrAuth]\n : [queryOrAuth, auth];\n return this.ctx.http.request<Conversation[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/conversations`,\n auth: ctx,\n query: { ...query },\n });\n }\n\n /** Server-side conversation search (`POST /agentic/conversations/search`), paged like {@link searchAgents}. */\n async searchConversations(\n query: ConversationSearchQuery,\n auth: AuthContext = SERVICE,\n ): Promise<Conversation[]> {\n return this.ctx.http.request<Conversation[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/conversations/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n });\n }\n\n // --- Standalone agentic reads / bulk operations ------------------------\n\n /** List models available to the tenant, grouped by provider (`GET /agentic/models`). */\n async listModels(auth: AuthContext = SERVICE): Promise<ProviderModels[]> {\n return this.ctx.http.request<ProviderModels[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/models`,\n auth,\n });\n }\n\n /** List commerce events available to agent triggers (`GET /agentic/commerce-events`). */\n async listCommerceEvents(auth: AuthContext = SERVICE): Promise<CommerceEvents> {\n return this.ctx.http.request<CommerceEvents>({\n method: \"GET\",\n path: `${this.base()}/agentic/commerce-events`,\n auth,\n });\n }\n\n /**\n * Upload a chat attachment for an agent\n * (`POST /agentic/{agentId}/attachments`, multipart, HTTP 201). The response\n * `sessionId` must be threaded into subsequent chat calls to bind the file.\n * Pass `opts.sessionId` to attach to an existing session.\n *\n * The endpoint takes exactly one of `attachment` or `attachmentId` — both or\n * neither is a `400`. This method always sends the file; to point a second\n * agent at a file already in the session, use {@link reuseAttachment}.\n */\n async uploadAttachment(\n agentId: string,\n attachment: Blob | File,\n opts: AttachmentOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Attachment> {\n const form = new FormData();\n form.append(\"attachment\", attachment);\n return this.ctx.http.request<Attachment>({\n method: \"POST\",\n path: `${this.base()}/agentic/${encodeURIComponent(agentId)}/attachments`,\n auth,\n body: form,\n ...(opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {}),\n });\n }\n\n /**\n * Assign an existing media asset to an agent as a chat attachment\n * (`POST /agentic/{agentId}/attachments` with the `attachmentId` form field,\n * HTTP 200). Resolves to the attachment `id` and the `sessionId` to send on\n * the following chat calls.\n *\n * Use it to hand a second agent the same file instead of uploading it twice.\n * Pass `opts.sessionId` to attach to an existing chat session; without it the\n * service opens a new one and returns its id — thread that into the chat, or\n * the agent never sees the file. With `ai.agentexecution_manage` the asset may\n * be any media asset, not only one uploaded to this session.\n *\n * ```ts\n * const { id, sessionId } = await client.ai.uploadAttachment(\"agent-a\", file);\n * await client.ai.reuseAttachment(\"agent-b\", id!, { sessionId: sessionId! });\n * ```\n */\n async reuseAttachment(\n agentId: string,\n attachmentId: string,\n opts: AttachmentReuseOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Attachment> {\n const form = new FormData();\n form.append(\"attachmentId\", attachmentId);\n return this.ctx.http.request<Attachment>({\n method: \"POST\",\n path: `${this.base()}/agentic/${encodeURIComponent(agentId)}/attachments`,\n auth,\n body: form,\n ...(opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {}),\n });\n }\n\n /** Export agents + components as a base64/checksum blob (`POST /agentic/agents/export`). */\n async exportAgents(body: AgentsExportRequest, auth: AuthContext = SERVICE): Promise<AgentsExport> {\n return this.ctx.http.request<AgentsExport>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/export`,\n auth,\n body,\n });\n }\n\n /** Import previously-exported agents (`POST /agentic/agents/import`). */\n async importAgents(body: AgentsImportRequest, auth: AuthContext = SERVICE): Promise<AgentsImport> {\n return this.ctx.http.request<AgentsImport>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/import`,\n auth,\n body,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n TaxConfig,\n TaxConfigInput,\n TaxConfigUpdate,\n TaxConfigCreated,\n TaxCalculationRequest,\n TaxCalculationResult,\n} from \"./tax-types\";\n\nexport type {\n TaxClass,\n TaxLocation,\n TaxConfig,\n TaxConfigInput,\n TaxConfigUpdate,\n TaxConfigCreated,\n TaxCalculationInput,\n TaxCalculationRequest,\n TaxCalculationResult,\n} from \"./tax-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Tax Service (`/tax/{tenant}/…`): CRUD over per-location tax\n * configurations and the net/gross tax-calculation command. Every endpoint\n * requires a backend `tax.tax_read` / `tax.tax_manage` scope and the\n * **service (clientCredentials) token** — default auth: service.\n *\n * Server-side use only; the service token must never reach a browser.\n */\nexport class TaxService {\n static readonly channel = \"tax\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/tax/${this.ctx.tenant}`;\n }\n\n /** List all per-location tax configurations. */\n async listTaxConfigs(auth: AuthContext = SERVICE): Promise<TaxConfig[]> {\n return this.ctx.http.request<TaxConfig[]>({\n method: \"GET\",\n path: `${this.base()}/taxes`,\n auth,\n });\n }\n\n /** Retrieve one tax configuration by its location (country) code. */\n async getTaxConfig(locationCode: string, auth: AuthContext = SERVICE): Promise<TaxConfig> {\n return this.ctx.http.request<TaxConfig>({\n method: \"GET\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n });\n }\n\n /** Create a tax configuration (`POST`). Returns the created `{ locationCode }`. */\n async createTaxConfig(\n input: TaxConfigInput,\n auth: AuthContext = SERVICE,\n ): Promise<TaxConfigCreated> {\n return this.ctx.http.request<TaxConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/taxes`,\n auth,\n body: input,\n });\n }\n\n /**\n * Update a tax configuration by location code (`PUT`). `metadata.version` is\n * required (optimistic locking — a stale version yields 409).\n */\n async updateTaxConfig(\n locationCode: string,\n input: TaxConfigUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<TaxConfig> {\n return this.ctx.http.request<TaxConfig>({\n method: \"PUT\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a tax configuration by location code. */\n async deleteTaxConfig(locationCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n });\n }\n\n /**\n * Calculate net/gross values for a price (`PUT /taxes/calculation-commands`).\n * Single command in, single result out.\n */\n async calculateTax(\n request: TaxCalculationRequest,\n auth: AuthContext = SERVICE,\n ): Promise<TaxCalculationResult> {\n return this.ctx.http.request<TaxCalculationResult>({\n method: \"PUT\",\n path: `${this.base()}/taxes/calculation-commands`,\n auth,\n body: request,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n CouponList,\n Coupon,\n CouponInput,\n CouponUpdate,\n CouponCreated,\n Redemption,\n RedemptionInput,\n RedemptionCreated,\n ReferralCoupon,\n} from \"./coupon-types\";\n\nexport type {\n Coupon,\n CouponList,\n CouponInput,\n CouponUpdate,\n CouponCreated,\n Redemption,\n RedemptionInput,\n RedemptionCreated,\n ReferralCoupon,\n} from \"./coupon-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Coupon Service (`/coupon/{tenant}/…`): coupon CRUD, validation,\n * redemptions, and referral coupons.\n *\n * Every method defaults to the **service (clientCredentials) token**. For\n * customer-driven validation/redemption, pass `auth.customer(token)` as the\n * trailing argument (the React hooks do this with the browser context). The\n * service token must never reach a browser.\n */\nexport class CouponService {\n static readonly channel = \"coupon\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/coupon/${this.ctx.tenant}`;\n }\n\n /** List coupons by criteria. Returns a plain array. */\n async listCoupons(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CouponList> {\n return this.ctx.http.request<CouponList>({\n method: \"GET\",\n path: `${this.base()}/coupons`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one coupon by code. */\n async getCoupon(code: string, auth: AuthContext = SERVICE): Promise<Coupon> {\n return this.ctx.http.request<Coupon>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a coupon (`POST`, HTTP 201). Returns the created resource's `{ id?, yrn? }`. */\n async createCoupon(input: CouponInput, auth: AuthContext = SERVICE): Promise<CouponCreated> {\n return this.ctx.http.request<CouponCreated>({\n method: \"POST\",\n path: `${this.base()}/coupons`,\n auth,\n body: input,\n });\n }\n\n /** Replace a coupon by code (`PUT`). Resolves once the update is accepted. */\n async updateCoupon(code: string, input: CouponUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a coupon by code (`PATCH` merge body). */\n async patchCoupon(code: string, patch: CouponUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a coupon by code. */\n async deleteCoupon(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /**\n * Check whether a coupon can be redeemed (`POST /validation`). Resolves when\n * redeemable; throws an `EmporixError` otherwise (no response body).\n */\n async validateCoupon(\n code: string,\n redemption: RedemptionInput,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/validation`,\n auth,\n body: redemption,\n });\n }\n\n /** List a coupon's redemptions by criteria. */\n async listRedemptions(\n code: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<Redemption[]> {\n return this.ctx.http.request<Redemption[]>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Redeem a coupon by creating a redemption (`POST`, HTTP 201). Returns the resource location. */\n async redeemCoupon(\n code: string,\n redemption: RedemptionInput,\n auth: AuthContext = SERVICE,\n ): Promise<RedemptionCreated> {\n return this.ctx.http.request<RedemptionCreated>({\n method: \"POST\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions`,\n auth,\n body: redemption,\n });\n }\n\n /** Retrieve one redemption by id. */\n async getRedemption(code: string, id: string, auth: AuthContext = SERVICE): Promise<Redemption> {\n return this.ctx.http.request<Redemption>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Delete a redemption by id. */\n async deleteRedemption(code: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Retrieve a customer's referral coupon (resolves to an empty body when none exists). */\n async getReferralCoupon(customerNumber: string, auth: AuthContext = SERVICE): Promise<ReferralCoupon> {\n return this.ctx.http.request<ReferralCoupon>({\n method: \"GET\",\n path: `${this.base()}/referral-coupons/${encodeURIComponent(customerNumber)}`,\n auth,\n });\n }\n\n /** Create a referral coupon code for a customer (no request body). */\n async createReferralCoupon(\n customerNumber: string,\n auth: AuthContext = SERVICE,\n ): Promise<ReferralCoupon> {\n return this.ctx.http.request<ReferralCoupon>({\n method: \"POST\",\n path: `${this.base()}/referral-coupons/${encodeURIComponent(customerNumber)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\nimport type {\n CustomerSummaryBatch,\n PointsSummary,\n NewPointsEntry,\n AddedPoints,\n RedeemedPoints,\n RedeemOption,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"./reward-points-types\";\n\nexport type {\n CustomerSummaryBatch,\n PointsSummary,\n NewPointsEntry,\n AddedPoints,\n RedeemedPoints,\n RedeemOption,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"./reward-points-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Reward Points Service (`/reward-points/…`): admin customer-points\n * management, the signed-in customer's own points, and redeem options.\n *\n * Auth differs per group: admin and redeem-option management default to the\n * **service token**; the `/public/*` methods require a **customer token** (they\n * accept only `CustomerAccessToken`). Note the mixed base paths — customer/\n * public/batch endpoints omit `{tenant}`, redeem options include it. A point\n * balance (`getCustomerPoints` / `getMyPoints`) is returned as a bare `number`.\n */\nexport class RewardPointsService {\n static readonly channel = \"reward-points\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Base without tenant (customer / public / batch endpoints). */\n private base(): string {\n return `/reward-points`;\n }\n\n /** Tenant-scoped base (redeem options only). */\n private tenantBase(): string {\n return `/reward-points/${this.ctx.tenant}`;\n }\n\n // --- Admin: customer points management (service token) ---\n\n /** Batch summary across all customers. */\n async listAllSummaries(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CustomerSummaryBatch> {\n return this.ctx.http.request<CustomerSummaryBatch>({\n method: \"GET\",\n path: `${this.base()}/summaryBatch`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one customer's reward-points balance. */\n async getCustomerPoints(customerId: string, auth: AuthContext = SERVICE): Promise<number> {\n return this.ctx.http.request<number>({\n method: \"GET\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Create a reward-points entry for a customer. */\n async createCustomerPoints(\n customerId: string,\n input: NewPointsEntry,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a customer's reward points. */\n async deleteCustomerPoints(customerId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Retrieve a reward-points summary for one customer. */\n async getCustomerSummary(customerId: string, auth: AuthContext = SERVICE): Promise<PointsSummary> {\n return this.ctx.http.request<PointsSummary>({\n method: \"GET\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/summary`,\n auth,\n });\n }\n\n /** Add reward points for a customer. */\n async addPoints(customerId: string, input: AddedPoints, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/addPoints`,\n auth,\n body: input,\n });\n }\n\n /** Redeem a customer's reward points (on behalf). */\n async redeemPoints(customerId: string, input: RedeemedPoints, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/redeemPoints`,\n auth,\n body: input,\n });\n }\n\n // --- Storefront: the signed-in customer's own points (customer token required) ---\n\n /** The signed-in customer's reward-points balance. Requires a customer `auth`. */\n async getMyPoints(auth: AuthContext): Promise<number> {\n // A customer who has never earned points has no entry, and Emporix answers\n // 404 \"No reward points found\" — for the signed-in customer that simply\n // means zero points, so map it to 0 rather than surfacing an error.\n try {\n return await this.ctx.http.request<number>({\n method: \"GET\",\n path: `${this.base()}/public/customer`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError) return 0;\n throw err;\n }\n }\n\n /** The signed-in customer's reward-points summary. Requires a customer `auth`. */\n async getMySummary(auth: AuthContext): Promise<PointsSummary> {\n // Same as getMyPoints: a 404 means the signed-in customer has no entry yet,\n // i.e. an empty summary (zero active points, no history), not an error.\n try {\n return await this.ctx.http.request<PointsSummary>({\n method: \"GET\",\n path: `${this.base()}/public/customer/summary`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError) {\n return { activePoints: 0, summary: { addedPointsList: [] } };\n }\n throw err;\n }\n }\n\n /**\n * Redeem the signed-in customer's points for a coupon code. Requires a\n * customer `auth`. Returns the issued coupon `{ code }`.\n */\n async redeemMyPoints(input: RedeemMyPointsInput, auth: AuthContext): Promise<RedeemCouponResult> {\n return this.ctx.http.request<RedeemCouponResult>({\n method: \"POST\",\n path: `${this.base()}/public/customer/redeem`,\n auth,\n body: input,\n });\n }\n\n // --- Redeem options (tenant-scoped; read open to customer, management service-only) ---\n\n /** List redeem options. Defaults to the service token; pass a customer `auth` for storefront reads. */\n async listRedeemOptions(auth: AuthContext = SERVICE): Promise<RedeemOptionList> {\n return this.ctx.http.request<RedeemOptionList>({\n method: \"GET\",\n path: `${this.tenantBase()}/redeemOptions`,\n auth,\n });\n }\n\n /** Create a redeem option. Returns the updated options list. */\n async createRedeemOption(input: RedeemOption, auth: AuthContext = SERVICE): Promise<RedeemOptionList> {\n return this.ctx.http.request<RedeemOptionList>({\n method: \"POST\",\n path: `${this.tenantBase()}/redeemOptions`,\n auth,\n body: input,\n });\n }\n\n /** Update a redeem option by id. Resolves once accepted (no response body). */\n async updateRedeemOption(\n redeemOptionId: string,\n input: RedeemOption,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.tenantBase()}/redeemOptions/${encodeURIComponent(redeemOptionId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a redeem option by id. */\n async deleteRedeemOption(redeemOptionId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.tenantBase()}/redeemOptions/${encodeURIComponent(redeemOptionId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Brand, BrandList, BrandInput, BrandUpdate } from \"./brand-types\";\n\nexport type { Brand, BrandList, BrandInput, BrandUpdate } from \"./brand-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Brand Service (`/brand/brands`): CRUD over brands. Server-side;\n * defaults to the service token (reads also work with an anonymous token).\n * The path carries no `{tenant}` segment — the tenant comes from the token.\n */\nexport class BrandService {\n static readonly channel = \"brand\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/brand/brands`;\n }\n\n /** List all brands. */\n async listBrands(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<BrandList> {\n return this.ctx.http.request<BrandList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one brand by id. */\n async getBrand(brandId: string, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n });\n }\n\n /** Create a brand. */\n async createBrand(input: BrandInput, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a brand by id. */\n async updateBrand(brandId: string, input: BrandUpdate, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a brand by id. */\n async patchBrand(brandId: string, patch: BrandUpdate, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a brand by id. */\n async deleteBrand(brandId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Label, LabelList, LabelInput, LabelUpdate } from \"./label-types\";\n\nexport type { Label, LabelList, LabelInput, LabelUpdate } from \"./label-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Label Service (`/label/labels`): CRUD over product labels (e.g.\n * \"Sale\", \"New\"). Server-side; defaults to the service token. The path carries\n * no `{tenant}` segment — the tenant comes from the token.\n */\nexport class LabelService {\n static readonly channel = \"label\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/label/labels`;\n }\n\n /** List all labels. */\n async listLabels(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<LabelList> {\n return this.ctx.http.request<LabelList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one label by id. */\n async getLabel(labelId: string, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n });\n }\n\n /** Create a label. */\n async createLabel(input: LabelInput, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a label by id. */\n async updateLabel(labelId: string, input: LabelUpdate, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a label by id. */\n async patchLabel(labelId: string, patch: LabelUpdate, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a label by id. */\n async deleteLabel(labelId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Country, CountryList, CountryUpdate, Region, RegionList } from \"./country-types\";\n\nexport type { Country, CountryList, CountryUpdate, Region, RegionList } from \"./country-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Country Service (`/country/{tenant}/…`): countries and regions\n * master data. Server-side; defaults to the service token (reads also work\n * with an anonymous token). Countries are predefined — list/get/patch only\n * (no create/delete).\n */\nexport class CountryService {\n static readonly channel = \"country\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/country/${this.ctx.tenant}`;\n }\n\n /** List all countries. */\n async listCountries(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CountryList> {\n return this.ctx.http.request<CountryList>({\n method: \"GET\",\n path: `${this.base()}/countries`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one country by code. */\n async getCountry(countryCode: string, auth: AuthContext = SERVICE): Promise<Country> {\n return this.ctx.http.request<Country>({\n method: \"GET\",\n path: `${this.base()}/countries/${encodeURIComponent(countryCode)}`,\n auth,\n });\n }\n\n /** Partially update a country by code. Resolves once accepted (no response body). */\n async patchCountry(countryCode: string, patch: CountryUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/countries/${encodeURIComponent(countryCode)}`,\n auth,\n body: patch,\n });\n }\n\n /** List all regions. */\n async listRegions(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<RegionList> {\n return this.ctx.http.request<RegionList>({\n method: \"GET\",\n path: `${this.base()}/regions`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one region by code. */\n async getRegion(regionCode: string, auth: AuthContext = SERVICE): Promise<Region> {\n return this.ctx.http.request<Region>({\n method: \"GET\",\n path: `${this.base()}/regions/${encodeURIComponent(regionCode)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Currency,\n CurrencyList,\n CurrencyInput,\n CurrencyUpdate,\n CurrencyCreated,\n ExchangeRate,\n ExchangeRateList,\n ExchangeRateInput,\n ExchangeRateUpdate,\n ExchangeRateCreated,\n} from \"./currency-types\";\n\nexport type {\n Currency,\n CurrencyList,\n CurrencyInput,\n CurrencyUpdate,\n CurrencyCreated,\n ExchangeRate,\n ExchangeRateList,\n ExchangeRateInput,\n ExchangeRateUpdate,\n ExchangeRateCreated,\n} from \"./currency-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Currency Service (`/currency/{tenant}/…`): currencies and exchange\n * rates. Server-side; defaults to the service token.\n */\nexport class CurrencyService {\n static readonly channel = \"currency\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/currency/${this.ctx.tenant}`;\n }\n\n // --- Currencies ---\n\n /** List all currencies. */\n async listCurrencies(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CurrencyList> {\n return this.ctx.http.request<CurrencyList>({\n method: \"GET\",\n path: `${this.base()}/currencies`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one currency by code. */\n async getCurrency(code: string, auth: AuthContext = SERVICE): Promise<Currency> {\n return this.ctx.http.request<Currency>({\n method: \"GET\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a currency. */\n async createCurrency(input: CurrencyInput, auth: AuthContext = SERVICE): Promise<CurrencyCreated> {\n return this.ctx.http.request<CurrencyCreated>({\n method: \"POST\",\n path: `${this.base()}/currencies`,\n auth,\n body: input,\n });\n }\n\n /** Update a currency by code. */\n async updateCurrency(code: string, input: CurrencyUpdate, auth: AuthContext = SERVICE): Promise<Currency> {\n return this.ctx.http.request<Currency>({\n method: \"PUT\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a currency by code. */\n async deleteCurrency(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n // --- Exchange rates ---\n\n /** List all exchange rates. */\n async listExchangeRates(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ExchangeRateList> {\n return this.ctx.http.request<ExchangeRateList>({\n method: \"GET\",\n path: `${this.base()}/exchanges`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one exchange rate by code. */\n async getExchangeRate(code: string, auth: AuthContext = SERVICE): Promise<ExchangeRate> {\n return this.ctx.http.request<ExchangeRate>({\n method: \"GET\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create an exchange rate. */\n async createExchangeRate(input: ExchangeRateInput, auth: AuthContext = SERVICE): Promise<ExchangeRateCreated> {\n return this.ctx.http.request<ExchangeRateCreated>({\n method: \"POST\",\n path: `${this.base()}/exchanges`,\n auth,\n body: input,\n });\n }\n\n /** Update an exchange rate by code. */\n async updateExchangeRate(code: string, input: ExchangeRateUpdate, auth: AuthContext = SERVICE): Promise<ExchangeRate> {\n return this.ctx.http.request<ExchangeRate>({\n method: \"PUT\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete an exchange rate by code. */\n async deleteExchangeRate(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Site,\n SiteList,\n FindSiteInput,\n Zone,\n ZoneList,\n ShippingMethod,\n ShippingMethodList,\n ShippingGroup,\n ShippingGroupList,\n CgRelation,\n CgRelationList,\n QuoteInput,\n QuoteResult,\n QuoteSlotInput,\n ShippingFee,\n MinimumFee,\n ResourceCreated,\n DeliveryWindowList,\n DeliveryWindowValidation,\n DeliveryTime,\n DeliveryTimeList,\n DeliveryTimeInput,\n DeliveryTimeUpdate,\n DeliverySlot,\n DeliverySlotList,\n DeliveryCycleInput,\n ShippingPatch,\n DeliveryCreated,\n} from \"./shipping-types\";\n\nexport type {\n Site,\n SiteList,\n FindSiteInput,\n Zone,\n ZoneList,\n ShippingMethod,\n ShippingMethodList,\n ShippingGroup,\n ShippingGroupList,\n CgRelation,\n CgRelationList,\n QuoteInput,\n QuoteResult,\n QuoteSlotInput,\n ShippingFee,\n MinimumFee,\n ResourceCreated,\n DeliveryWindow,\n DeliveryWindowList,\n DeliveryWindowValidation,\n DeliveryTime,\n DeliveryTimeList,\n DeliveryTimeInput,\n DeliveryTimeUpdate,\n DeliverySlot,\n DeliverySlotList,\n DeliveryCycleInput,\n ShippingPatch,\n DeliveryCreated,\n} from \"./shipping-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * The zone whose `shipTo` covers `country`, else the default zone, else the first.\n *\n * Pure — no client, no request. Pair it with `listZones(site, { expand:\n * \"methods,fees\" })` to turn a zone list into the one zone a checkout should\n * offer.\n *\n * The `?? []` guards a field the generated schema marks required. Emporix'\n * schema has been wrong about optionality before, and a storefront that throws\n * on an unexpected shape is worse than one that finds no zone.\n */\nexport function resolveZone(zones: ZoneList | undefined, country: string): Zone | undefined {\n if (!zones || zones.length === 0) return undefined;\n const c = country.trim().toUpperCase();\n const byCountry = c\n ? zones.find((z) => (z.shipTo ?? []).some((s) => s.country?.toUpperCase() === c))\n : undefined;\n return byCountry ?? zones.find((z) => z.default) ?? zones[0];\n}\n\n/**\n * The applicable fee: the highest `minOrderValue` at or below `cartTotal`, else\n * the first fee.\n *\n * `<=`, not `<`: a total that exactly meets a free-shipping threshold gets free\n * shipping.\n */\nexport function pickFee(fees: ShippingFee[] | undefined, cartTotal: number): ShippingFee | undefined {\n if (!fees || fees.length === 0) return undefined;\n const eligible = fees\n .filter((f) => (f.minOrderValue?.amount ?? 0) <= cartTotal)\n .sort((a, b) => (b.minOrderValue?.amount ?? 0) - (a.minOrderValue?.amount ?? 0));\n return eligible[0] ?? fees[0];\n}\n\n/**\n * Emporix Shipping Service (`/shipping/{tenant}/…`), Phase 1 — config: sites,\n * zones, methods, cost/quote, groups, customer-group relations. Server-side;\n * defaults to the service token. Most methods are site-scoped and take `site`\n * first; `findSites` is tenant-level. Delivery scheduling is Phase 2.\n */\nexport class ShippingService {\n static readonly channel = \"shipping\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/shipping/${this.ctx.tenant}`;\n }\n\n private siteBase(site: string): string {\n return `${this.base()}/${encodeURIComponent(site)}`;\n }\n\n // --- Sites ---\n\n /** Find shipping-related sites by postal code (`POST /findSite`). */\n async findSites(input: FindSiteInput, auth: AuthContext = SERVICE): Promise<SiteList> {\n return this.ctx.http.request<SiteList>({\n method: \"POST\",\n path: `${this.base()}/findSite`,\n auth,\n body: input,\n });\n }\n\n // --- Zones ---\n\n /** List shipping zones for a site. */\n async listZones(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ZoneList> {\n return this.ctx.http.request<ZoneList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping zone. */\n async getZone(site: string, zoneId: string, auth: AuthContext = SERVICE): Promise<Zone> {\n return this.ctx.http.request<Zone>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n });\n }\n\n /** Create a shipping zone. */\n async createZone(site: string, zone: Zone, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/zones`,\n auth,\n body: zone,\n });\n }\n\n /** Replace a shipping zone. */\n async updateZone(site: string, zoneId: string, zone: Zone, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n body: zone,\n });\n }\n\n /** Partially update a shipping zone. */\n async patchZone(site: string, zoneId: string, patch: Zone, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a shipping zone. */\n async deleteZone(site: string, zoneId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n });\n }\n\n // --- Methods (per zone) ---\n\n /** List shipping methods of a zone. */\n async listMethods(\n site: string,\n zoneId: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ShippingMethodList> {\n return this.ctx.http.request<ShippingMethodList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping method. */\n async getMethod(site: string, zoneId: string, methodId: string, auth: AuthContext = SERVICE): Promise<ShippingMethod> {\n return this.ctx.http.request<ShippingMethod>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n });\n }\n\n /** Create a shipping method in a zone. */\n async createMethod(site: string, zoneId: string, method: ShippingMethod, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods`,\n auth,\n body: method,\n });\n }\n\n /** Replace a shipping method. */\n async updateMethod(site: string, zoneId: string, methodId: string, method: ShippingMethod, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n body: method,\n });\n }\n\n /** Partially update a shipping method. */\n async patchMethod(site: string, zoneId: string, methodId: string, patch: ShippingMethod, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a shipping method. */\n async deleteMethod(site: string, zoneId: string, methodId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n });\n }\n\n // --- Cost / quote ---\n\n /** Calculate the final shipping cost (`POST /quote`). */\n async quote(site: string, input: QuoteInput, auth: AuthContext = SERVICE): Promise<QuoteResult> {\n return this.ctx.http.request<QuoteResult>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote`,\n auth,\n body: input,\n });\n }\n\n /** Calculate the minimum shipping cost (`POST /quote/minimum`). */\n async quoteMinimum(site: string, input: QuoteInput, auth: AuthContext = SERVICE): Promise<MinimumFee> {\n return this.ctx.http.request<MinimumFee>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote/minimum`,\n auth,\n body: input,\n });\n }\n\n /** Calculate the shipping cost for a given slot (`POST /quote/slot`). */\n async quoteSlot(site: string, input: QuoteSlotInput, auth: AuthContext = SERVICE): Promise<MinimumFee> {\n return this.ctx.http.request<MinimumFee>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote/slot`,\n auth,\n body: input,\n });\n }\n\n // --- Groups ---\n\n /** List shipping groups for a site. */\n async listGroups(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ShippingGroupList> {\n return this.ctx.http.request<ShippingGroupList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/groups`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping group. */\n async getGroup(site: string, groupId: string, auth: AuthContext = SERVICE): Promise<ShippingGroup> {\n return this.ctx.http.request<ShippingGroup>({\n method: \"GET\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n });\n }\n\n /** Create a shipping group. */\n async createGroup(site: string, group: ShippingGroup, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/groups`,\n auth,\n body: group,\n });\n }\n\n /** Replace a shipping group. */\n async updateGroup(site: string, groupId: string, group: ShippingGroup, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n body: group,\n });\n }\n\n /** Delete a shipping group. */\n async deleteGroup(site: string, groupId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n });\n }\n\n // --- Customer-group relations ---\n\n /** List customer-group relations for a site. */\n async listCgRelations(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CgRelationList> {\n return this.ctx.http.request<CgRelationList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/cgrelations`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a customer's customer-group relations. */\n async getCgRelations(site: string, customerId: string, auth: AuthContext = SERVICE): Promise<CgRelation> {\n return this.ctx.http.request<CgRelation>({\n method: \"GET\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Create a customer-group relation. */\n async createCgRelation(site: string, relation: CgRelation, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/cgrelations`,\n auth,\n body: relation,\n });\n }\n\n /** Update a customer's customer-group relations. */\n async updateCgRelations(site: string, customerId: string, relation: CgRelation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n body: relation,\n });\n }\n\n /** Delete a customer's customer-group relation. */\n async deleteCgRelation(site: string, customerId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n // --- Phase 2: delivery windows ---\n\n /** Retrieve delivery windows for a delivery area + cart. */\n async getAreaDeliveryWindows(deliveryAreaId: string, cartId: string, auth: AuthContext = SERVICE): Promise<DeliveryWindowList> {\n return this.ctx.http.request<DeliveryWindowList>({\n method: \"GET\",\n path: `${this.base()}/areaDeliveryTimes/${encodeURIComponent(deliveryAreaId)}/${encodeURIComponent(cartId)}`,\n auth,\n });\n }\n\n /** Retrieve delivery windows for a cart. */\n async getCartDeliveryWindows(cartId: string, auth: AuthContext = SERVICE): Promise<DeliveryWindowList> {\n return this.ctx.http.request<DeliveryWindowList>({\n method: \"GET\",\n path: `${this.base()}/actualDeliveryWindows/${encodeURIComponent(cartId)}`,\n auth,\n });\n }\n\n /** Increment the delivery-window counter. */\n async incrementDeliveryWindowCounter(input: DeliveryWindowValidation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/actualDeliveryWindows/incrementCounter`,\n auth,\n body: input,\n });\n }\n\n /** Validate a delivery window. Resolves when valid; throws otherwise. */\n async validateDeliveryWindow(input: DeliveryWindowValidation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/deliveryWindowValidation`,\n auth,\n body: input,\n });\n }\n\n // --- Phase 2: delivery times ---\n\n /** List all delivery times. */\n async listDeliveryTimes(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<DeliveryTimeList> {\n return this.ctx.http.request<DeliveryTimeList>({\n method: \"GET\",\n path: `${this.base()}/delivery-times`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one delivery time. */\n async getDeliveryTime(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<DeliveryTime> {\n return this.ctx.http.request<DeliveryTime>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n });\n }\n\n /** Create a delivery time. */\n async createDeliveryTime(input: DeliveryTimeInput, auth: AuthContext = SERVICE): Promise<DeliveryCreated> {\n return this.ctx.http.request<DeliveryCreated>({\n method: \"POST\",\n path: `${this.base()}/delivery-times`,\n auth,\n body: input,\n });\n }\n\n /** Create multiple delivery times (`POST /delivery-times/bulk`). */\n async createDeliveryTimesBulk(inputs: DeliveryTimeInput[], auth: AuthContext = SERVICE): Promise<DeliveryCreated[]> {\n return this.ctx.http.request<DeliveryCreated[]>({\n method: \"POST\",\n path: `${this.base()}/delivery-times/bulk`,\n auth,\n body: inputs,\n });\n }\n\n /** Replace a delivery time. */\n async updateDeliveryTime(deliveryTimeId: string, input: DeliveryTimeUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a delivery time (JSON-Patch op array). */\n async patchDeliveryTime(deliveryTimeId: string, ops: ShippingPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a delivery time. */\n async deleteDeliveryTime(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n });\n }\n\n // --- Phase 2: delivery time slots ---\n\n /** List slots of a delivery time. */\n async listSlots(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<DeliverySlotList> {\n return this.ctx.http.request<DeliverySlotList>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n });\n }\n\n /** Retrieve one slot. */\n async getSlot(deliveryTimeId: string, slotId: string, auth: AuthContext = SERVICE): Promise<DeliverySlot> {\n return this.ctx.http.request<DeliverySlot>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n });\n }\n\n /** Create a slot in a delivery time. */\n async createSlot(deliveryTimeId: string, input: DeliverySlot, auth: AuthContext = SERVICE): Promise<DeliveryCreated> {\n return this.ctx.http.request<DeliveryCreated>({\n method: \"POST\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n body: input,\n });\n }\n\n /** Replace a slot. */\n async updateSlot(deliveryTimeId: string, slotId: string, input: DeliverySlot, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a slot (JSON-Patch op array). */\n async patchSlot(deliveryTimeId: string, slotId: string, ops: ShippingPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a slot. */\n async deleteSlot(deliveryTimeId: string, slotId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n });\n }\n\n /** Delete all slots of a delivery time. */\n async deleteAllSlots(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n });\n }\n\n // --- Phase 2: delivery cycles ---\n\n /** Generate a delivery cycle (`POST /delivery-cycles/generate`). Returns the cycle id. */\n async generateDeliveryCycle(input: DeliveryCycleInput, auth: AuthContext = SERVICE): Promise<string> {\n return this.ctx.http.request<string>({\n method: \"POST\",\n path: `${this.base()}/delivery-cycles/generate`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { InvoiceJobDraft, InvoiceJobCreated, InvoiceJob } from \"./invoice-types\";\n\nexport type { InvoiceJobDraft, InvoiceJobCreated, InvoiceJob } from \"./invoice-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Invoice Service (`/invoice/{tenant}/…`): create invoice-generation jobs and\n * poll their status. Backend-only — default auth: service.\n */\nexport class InvoiceService {\n static readonly channel = \"invoice\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/invoice/${this.ctx.tenant}/jobs/invoices`;\n }\n\n /** Create an invoice-generation job (`POST …/jobs/invoices`, 201). */\n async createJob(draft: InvoiceJobDraft, auth: AuthContext = SERVICE): Promise<InvoiceJobCreated> {\n return this.ctx.http.request<InvoiceJobCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /** Retrieve a job and its per-order results (`GET …/jobs/invoices/{jobId}`). */\n async getJob(jobId: string, auth: AuthContext = SERVICE): Promise<InvoiceJob> {\n return this.ctx.http.request<InvoiceJob>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(jobId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { errorFromResponse } from \"../core/errors\";\nimport type {\n Quote,\n QuoteDraft,\n QuoteCreated,\n QuoteUpdate,\n QuoteHistory,\n ListQuotesQuery,\n QuoteReason,\n QuoteReasonDraft,\n QuoteReasonUpdate,\n QuoteReasonCreated,\n ListQuoteReasonsQuery,\n} from \"./quote-types\";\n\nexport type {\n Quote,\n QuoteDraft,\n QuoteCreated,\n QuoteUpdate,\n QuoteHistory,\n ListQuotesQuery,\n QuoteReason,\n QuoteReasonDraft,\n QuoteReasonUpdate,\n QuoteReasonCreated,\n ListQuoteReasonsQuery,\n} from \"./quote-types\";\n\n/**\n * Quote Service (`/quote/{tenant}/…`): B2B quotes and quote reasons. Quotes are\n * customer-owned and never anonymous, so every method takes a REQUIRED `auth`:\n * pass `auth.customer(token)` for a customer's own quotes, or `auth.service()`\n * (an admin token) for `quote_manage`-scoped ops (`delete`, reason mutations).\n */\nexport class QuoteService {\n static readonly channel = \"quote\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private quotesBase(): string {\n return `/quote/${this.ctx.tenant}/quotes`;\n }\n\n private _reasons?: QuoteReasonsResource;\n /** Quote reasons config (`/quote-reasons`). CRUD sub-resource. */\n get reasons(): QuoteReasonsResource {\n return (this._reasons ??= new QuoteReasonsResource(this.ctx));\n }\n\n /** List quotes, wrapped in {@link PaginatedItems}. Pass `{}` for no filter. */\n async list(query: ListQuotesQuery, auth: AuthContext): Promise<PaginatedItems<Quote>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.q) q.q = query.q;\n if (query.sort) q.sort = query.sort;\n return requestPage<Quote>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.quotesBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Create a quote (`POST /quotes`, 201). */\n async create(draft: QuoteDraft, auth: AuthContext): Promise<QuoteCreated> {\n return this.ctx.http.request<QuoteCreated>({\n method: \"POST\",\n path: this.quotesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Retrieve one quote by id. */\n async get(quoteId: string, auth: AuthContext): Promise<Quote> {\n return this.ctx.http.request<Quote>({\n method: \"GET\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n });\n }\n\n /** Apply an update-op array to a quote (`PATCH /quotes/{id}`, 204). */\n async update(quoteId: string, update: QuoteUpdate, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n body: update,\n });\n }\n\n /** Delete a quote (`DELETE /quotes/{id}`). Requires the admin `quote_manage` scope. */\n async delete(quoteId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n });\n }\n\n /** Retrieve a quote's change history (`GET /quotes/{id}/history`). */\n async history(quoteId: string, auth: AuthContext): Promise<QuoteHistory> {\n return this.ctx.http.request<QuoteHistory>({\n method: \"GET\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}/history`,\n auth,\n });\n }\n\n /**\n * Generate a quote PDF (`POST /quotes/{id}/pdf`). Returns the raw PDF bytes.\n * Uses `requestRaw` (no typed-error mapping) — a non-2xx is thrown explicitly.\n */\n async generatePdf(quoteId: string, auth: AuthContext): Promise<Blob> {\n const path = `${this.quotesBase()}/${encodeURIComponent(quoteId)}/pdf`;\n const res = await this.ctx.http.requestRaw({ method: \"POST\", path, auth });\n if (!res.ok) {\n const body = await res.text();\n throw errorFromResponse(res.status, `POST ${path} failed: ${res.status}`, body);\n }\n return await res.blob();\n }\n}\n\n/**\n * Quote reasons (`/quote/{tenant}/quote-reasons`). Config data. Like the rest\n * of the quote domain, every method takes a REQUIRED `auth`: reads accept a\n * customer or admin token; `create`/`update`/`delete` need the admin\n * `quote.quote_manage` scope (`auth.service()`).\n */\nexport class QuoteReasonsResource {\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/quote/${this.ctx.tenant}/quote-reasons`;\n }\n\n /** List reasons, wrapped in {@link PaginatedItems}. Pass `{}` for no paging override. */\n async list(query: ListQuoteReasonsQuery, auth: AuthContext): Promise<PaginatedItems<QuoteReason>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n return requestPage<QuoteReason>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n auth,\n query: { pageNumber, pageSize },\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Retrieve one reason by id. */\n async get(reasonId: string, auth: AuthContext): Promise<QuoteReason> {\n return this.ctx.http.request<QuoteReason>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n });\n }\n\n /** Create a reason (`POST /quote-reasons`). Requires the admin `quote_manage` scope. */\n async create(draft: QuoteReasonDraft, auth: AuthContext): Promise<QuoteReasonCreated> {\n return this.ctx.http.request<QuoteReasonCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Replace a reason (`PUT /quote-reasons/{id}`, 204). `draft.metadata.version`\n * is required for optimistic locking. Requires the admin `quote_manage` scope.\n */\n async update(reasonId: string, draft: QuoteReasonUpdate, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a reason (`DELETE /quote-reasons/{id}`). Requires the admin `quote_manage` scope. */\n async delete(reasonId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Return, ReturnList, ReturnInput, ReturnUpdate, ReturnPatch, ReturnCreated } from \"./returns-types\";\n\nexport type { Return, ReturnList, ReturnInput, ReturnUpdate, ReturnPatch, ReturnCreated } from \"./returns-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Returns Service (`/return/{tenant}/returns`): CRUD over returns\n * (RMA). Defaults to the service token; for customer self-service (own returns)\n * pass `auth.customer(token)` (the React hooks do this).\n */\nexport class ReturnsService {\n static readonly channel = \"returns\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/return/${this.ctx.tenant}/returns`;\n }\n\n /** List returns (paged; supports `pageSize`/`pageNumber`/`sort`/`q`). */\n async listReturns(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ReturnList> {\n return this.ctx.http.request<ReturnList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one return by id. */\n async getReturn(returnId: string, auth: AuthContext = SERVICE): Promise<Return> {\n return this.ctx.http.request<Return>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n });\n }\n\n /** Create a return. Returns the created `{ id }`. */\n async createReturn(input: ReturnInput, auth: AuthContext = SERVICE): Promise<ReturnCreated> {\n return this.ctx.http.request<ReturnCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a return by id (`PUT`). */\n async updateReturn(returnId: string, input: ReturnUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a return by id (`PATCH`, JSON-Patch op-array). */\n async patchReturn(returnId: string, ops: ReturnPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a return by id. */\n async deleteReturn(returnId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n IndexConfig,\n IndexConfigCreated,\n IndexPublicConfig,\n ReindexInput,\n ReindexJob,\n ReindexJobInput,\n} from \"./indexing-types\";\n\nexport type {\n IndexConfig,\n IndexConfigCreated,\n IndexPublicConfig,\n ReindexInput,\n ReindexJob,\n ReindexJobInput,\n ReindexEntityType,\n ReindexJobStatus,\n} from \"./indexing-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** Options for {@link IndexingService.listReindexJobs}. */\nexport interface ListReindexJobsOptions {\n pageNumber?: number;\n pageSize?: number;\n /** Raw Emporix `q` filter string. */\n q?: string;\n /** Emporix sort syntax, e.g. `\"metadata.createdAt:desc\"`. */\n sort?: string;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/**\n * Emporix Indexing Service (`/indexing/{tenant}/…`): search-index provider\n * configurations and reindex. Server-side; defaults to the service token.\n *\n * On the `BATTERY_INCLUDED` provider every write validates the stored\n * `indexName`/`writeKey` against the search backend *before* it takes effect:\n * invalid credentials fail with `400` and when that validation is itself\n * unreachable the call fails with `502`. Either way nothing is written — so a\n * `400` from these methods can mean the credentials are wrong rather than the\n * request body.\n */\nexport class IndexingService {\n static readonly channel = \"indexing\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/indexing/${this.ctx.tenant}`;\n }\n\n /** List indexing configurations. */\n async listConfigurations(auth: AuthContext = SERVICE): Promise<IndexConfig[]> {\n return this.ctx.http.request<IndexConfig[]>({ method: \"GET\", path: `${this.base()}/configurations`, auth });\n }\n\n /** Get a configuration by provider name. */\n async getConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<IndexConfig> {\n return this.ctx.http.request<IndexConfig>({\n method: \"GET\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /** Create a configuration. Nothing is stored if credential validation fails. */\n async createConfiguration(input: IndexConfig, auth: AuthContext = SERVICE): Promise<IndexConfigCreated> {\n return this.ctx.http.request<IndexConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/configurations`,\n auth,\n body: input,\n });\n }\n\n /** Update a configuration. Left unchanged if credential validation fails. */\n async updateConfiguration(provider: string, input: IndexConfig, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a configuration by provider name. */\n async deleteConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /** List public indexing configurations. */\n async listPublicConfigurations(auth: AuthContext = SERVICE): Promise<IndexPublicConfig[]> {\n return this.ctx.http.request<IndexPublicConfig[]>({ method: \"GET\", path: `${this.base()}/public/configurations`, auth });\n }\n\n /** Get a public configuration by provider name. */\n async getPublicConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<IndexPublicConfig> {\n return this.ctx.http.request<IndexPublicConfig>({\n method: \"GET\",\n path: `${this.base()}/public/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /**\n * Create a reindex job (replaces {@link reindex}). A `FULL` reindex of the\n * given `entityType`; set `rag: true` to also rebuild the RAG vector index\n * (PRODUCT only). Resolves to the created job (`201`) or, when a job for that\n * `entityType` is already `IN_PROGRESS`, that running job (`200`).\n *\n * On `BATTERY_INCLUDED` with `entityType: \"PRODUCT\"` the stored credentials\n * are validated first; no job is created on the `400`/`502` cases above.\n */\n async createReindexJob(input: ReindexJobInput, auth: AuthContext = SERVICE): Promise<ReindexJob> {\n return this.ctx.http.request<ReindexJob>({\n method: \"POST\",\n path: `${this.base()}/reindex-jobs`,\n auth,\n body: input,\n });\n }\n\n /** List reindex jobs (paginated). */\n async listReindexJobs(\n opts: ListReindexJobsOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<ReindexJob>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = { pageNumber, pageSize };\n if (opts.q !== undefined) query.q = opts.q;\n if (opts.sort !== undefined) query.sort = opts.sort;\n return requestPage<ReindexJob>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `${this.base()}/reindex-jobs`,\n query,\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /** Fetch one reindex job by id. */\n async getReindexJob(reindexJobId: string, auth: AuthContext = SERVICE): Promise<ReindexJob> {\n return this.ctx.http.request<ReindexJob>({\n method: \"GET\",\n path: `${this.base()}/reindex-jobs/${encodeURIComponent(reindexJobId)}`,\n auth,\n });\n }\n\n /**\n * Trigger a reindex. On `BATTERY_INCLUDED` the same credential validation\n * runs first, so this can fail with `400`/`502` before any job starts.\n * @deprecated since 2026-06-18, removal 2026-12-01 — use {@link createReindexJob}\n * (`createReindexJob({ entityType: \"PRODUCT\" })`), which returns a trackable job.\n */\n async reindex(input: ReindexInput, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"POST\", path: `${this.base()}/reindex`, auth, body: input });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage, type PageParams } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n FilterNode,\n IndexField,\n IndexJob,\n IndexRequest,\n JobId,\n QueryNode,\n SavedQuery,\n SavedQueryId,\n SavedQueryRequest,\n SearchHit as GenSearchHit,\n SearchIndex as GenSearchIndex,\n SearchPost,\n} from \"../generated/search-service\";\n\n/** A matching document. Stored fields come back as stored, plus `id` and `_score`. */\nexport type SearchHit = GenSearchHit;\n/**\n * Body of {@link SearchService.search}: a direct search (`index` plus `queries`,\n * `filters` or both) or a saved-search call (`searchQueryId` plus `query`).\n */\nexport type SearchInput = SearchPost;\n/** One query node: an `and` group, an `or` group, or one query. */\nexport type SearchQueryNode = QueryNode;\n/** One filter node: an `and` group, an `or` group, or one comparison. */\nexport type SearchFilterNode = FilterNode;\n/** A stored saved search. The request field `index` comes back as `indexId`. */\nexport type SavedSearch = SavedQuery;\n/** Body of {@link SearchService.upsertSavedSearch}. */\nexport type SavedSearchInput = SavedQueryRequest;\n/** `201` response of {@link SearchService.upsertSavedSearch}. */\nexport type SavedSearchCreated = SavedQueryId;\n/** A search index on one custom schema type. */\nexport type SearchIndex = GenSearchIndex;\n/** Body of {@link SearchService.upsertIndex}. */\nexport type SearchIndexInput = IndexRequest;\n/** One field of a search index. */\nexport type SearchIndexField = IndexField;\n/** An index build or deletion job. */\nexport type SearchIndexJob = IndexJob;\n/** The id of the job an index write started. */\nexport type SearchIndexJobRef = JobId;\n\n/** Paging, sort, filter and projection for the list reads. */\nexport interface SearchListOptions {\n pageNumber?: number;\n /** Defaults to 60, the server's default. */\n pageSize?: number;\n /** `field`, `field:ASC` or `field:DESC`, comma-separated. Default: `metadata.createdAt` descending. */\n sort?: string;\n /** Raw Emporix `q` filter string. */\n q?: string;\n /** Comma-separated properties to return. */\n fields?: string;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Options for {@link SearchService.listSavedSearches} and {@link SearchService.listIndexes}. */\nexport interface SearchTypeListOptions extends SearchListOptions {\n /** One custom schema type. Omitted, the list spans every custom schema type, and each item carries `type`. */\n type?: string;\n}\n\n/**\n * Options for {@link SearchService.search}. Without `sort`, hits are ordered by\n * relevance; without `fields`, each hit carries `_score`.\n */\nexport type SearchOptions = Omit<SearchListOptions, \"q\">;\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction pageQuery(opts: SearchListOptions): { query: Record<string, string | number>; page: PageParams } {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 60;\n const query: Record<string, string | number> = { pageNumber, pageSize };\n if (opts.sort !== undefined) query.sort = opts.sort;\n if (opts.q !== undefined) query.q = opts.q;\n if (opts.fields !== undefined) query.fields = opts.fields;\n const page: PageParams = {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n };\n return { query, page };\n}\n\n/**\n * Emporix Search Service (`/search/{tenant}/…`, **preview**): searches the\n * documents of a custom schema type, stores saved searches, and manages the\n * search indexes and the jobs that build them. Only custom schema types are\n * supported so far. Server-side; defaults to the service token.\n *\n * Scopes: `search.search_read` for every read and for `search`,\n * `search.search_manage` for every write. Searching also needs read access to\n * the documents themselves (`schema.custominstance_read`, `custom.{type}_read`\n * or `custom.{type}_read_own`), or it answers `403`.\n */\nexport class SearchService {\n static readonly channel = \"search\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/search/${this.ctx.tenant}`;\n }\n\n /**\n * Search the documents of one custom schema type. Paging, `sort` and\n * `fields` travel as query parameters, not in the body.\n *\n * Filter and sort fields must be indexed on the index the search uses, or the\n * call answers `400`. A saved-search call (`{ searchQueryId, query }`) answers\n * `404` when no saved search has that id for `type`, and `502` means the\n * Schema Service could not confirm that `type` is a custom entity.\n *\n * @example\n * const hits = await client.search.search(\"vehicle\", {\n * index: \"vehicles\",\n * queries: [{ type: \"TEXT\", query: \"diesel\", field: \"name.en\" }],\n * filters: { field: \"status\", operator: \"EQ\", value: \"ACTIVE\" },\n * });\n */\n async search(\n type: string,\n input: SearchInput,\n opts: SearchOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SearchHit>> {\n const { query, page } = pageQuery(opts);\n return requestPage<SearchHit>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `${this.base()}/search/${encodeURIComponent(type)}`,\n auth,\n query,\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n },\n page,\n );\n }\n\n /** List saved searches of one custom schema type (`opts.type`), or of every type. */\n async listSavedSearches(\n opts: SearchTypeListOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SavedSearch>> {\n const { query, page } = pageQuery(opts);\n const t = opts.type;\n return requestPage<SavedSearch>(\n this.ctx.http,\n {\n method: \"GET\",\n path: t === undefined ? `${this.base()}/search/queries` : `${this.base()}/search/${encodeURIComponent(t)}/queries`,\n auth,\n query,\n },\n page,\n );\n }\n\n /** Fetch one saved search. */\n async getSavedSearch(\n type: string,\n id: string,\n opts: { fields?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<SavedSearch> {\n return this.ctx.http.request<SavedSearch>({\n method: \"GET\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n\n /**\n * Create or replace a saved search. Resolves to `{ id }` when it was created\n * (`201`) and to `undefined` when it replaced an existing one (`204`).\n *\n * A replace needs the stored `metadata.version` — `400` without it, `409`\n * when it is stale. `index` must already exist for `type` (`404`\n * otherwise). Saving does not start an index build.\n */\n async upsertSavedSearch(\n type: string,\n id: string,\n input: SavedSearchInput,\n auth: AuthContext = SERVICE,\n ): Promise<SavedSearchCreated | undefined> {\n return this.ctx.http.request<SavedSearchCreated | undefined>({\n method: \"PUT\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a saved search. Does not start an index build. */\n async deleteSavedSearch(type: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List search indexes of one custom schema type (`opts.type`), or of every type. */\n async listIndexes(\n opts: SearchTypeListOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SearchIndex>> {\n const { query, page } = pageQuery(opts);\n const t = opts.type;\n return requestPage<SearchIndex>(\n this.ctx.http,\n {\n method: \"GET\",\n path: t === undefined ? `${this.base()}/search/indexes` : `${this.base()}/search/${encodeURIComponent(t)}/indexes`,\n auth,\n query,\n },\n page,\n );\n }\n\n /** Fetch one search index. */\n async getIndex(\n type: string,\n id: string,\n opts: { fields?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<SearchIndex> {\n return this.ctx.http.request<SearchIndex>({\n method: \"GET\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n\n /**\n * Create or update a search index. Resolves to the id of the job that builds\n * it (`202`) — for a new index, a changed field list, or an index whose\n * status is `building` or `failed` — and to `undefined` (`204`) when the\n * index is `ready` and its fields are unchanged; `name` and `description`\n * still change then. Track the job with {@link getJob}.\n *\n * An update needs the stored `metadata.version` (`400` without it). `409`\n * means a job for this index is already running, or the version is stale.\n */\n async upsertIndex(\n type: string,\n id: string,\n input: SearchIndexInput,\n auth: AuthContext = SERVICE,\n ): Promise<SearchIndexJobRef | undefined> {\n return this.ctx.http.request<SearchIndexJobRef | undefined>({\n method: \"PUT\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n body: input,\n });\n }\n\n /**\n * Start deleting a search index. Resolves to the id of the job that removes\n * it (`202`); `409` means a job for this index is already running.\n */\n async deleteIndex(type: string, id: string, auth: AuthContext = SERVICE): Promise<SearchIndexJobRef> {\n return this.ctx.http.request<SearchIndexJobRef>({\n method: \"DELETE\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List index jobs of the tenant. */\n async listJobs(opts: SearchListOptions = {}, auth: AuthContext = SERVICE): Promise<PaginatedItems<SearchIndexJob>> {\n const { query, page } = pageQuery(opts);\n return requestPage<SearchIndexJob>(\n this.ctx.http,\n { method: \"GET\", path: `${this.base()}/jobs`, auth, query },\n page,\n );\n }\n\n /** Fetch one index job. */\n async getJob(id: string, opts: { fields?: string } = {}, auth: AuthContext = SERVICE): Promise<SearchIndexJob> {\n return this.ctx.http.request<SearchIndexJob>({\n method: \"GET\",\n path: `${this.base()}/jobs/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { SseEvent } from \"../core/sse\";\nimport type { Page } from \"../generated/import-service\";\nimport type {\n ImportCancelResult,\n ImportConfig,\n ImportHealthThresholds,\n ImportJobGroup,\n ImportLicense,\n ImportStats,\n ImportStatsQuery,\n ImportErrorRecord,\n ImportPage,\n ImportRecordOutcome,\n ImportRun,\n ImportRunDetail,\n ImportRunEvent,\n ImportRunDiagnostics,\n ImportRunDiagnosticsQuery,\n ImportRunInput,\n ImportRunStream,\n ImportSchedule,\n ImportStream,\n ImportStreamOrder,\n ImportedRecord,\n} from \"./imports-types\";\n\nexport type {\n ImportCancelResult,\n ImportConfig,\n ImportDiagnosticKind,\n ImportDiagnosticRecord,\n ImportErrorRecord,\n ImportHealthThresholds,\n ImportJobGroup,\n ImportLicense,\n ImportPage,\n ImportRecordOutcome,\n ImportRun,\n ImportRunDetail,\n ImportRunDiagnostics,\n ImportRunDiagnosticsQuery,\n ImportRunEvent,\n ImportRunInput,\n ImportRunMode,\n ImportRunStatus,\n ImportRunStream,\n ImportSchedule,\n ImportStats,\n ImportStatsQuery,\n ImportStream,\n ImportStreamOrder,\n ImportedRecord,\n} from \"./imports-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\nconst DEFAULT_PAGE_SIZE = 50;\n\n/** One-based paging options, shared by every paginated import endpoint. */\nexport interface ImportPageOptions {\n /** One-based page number. Default `1`. */\n pageNumber?: number;\n /** Page size. Default `50`. The service may clamp this — the result echoes what it used. */\n pageSize?: number;\n}\n\n/** Options for {@link ImportService.searchRecords}. `type` is required. */\nexport interface SearchImportedRecordsOptions extends ImportPageOptions {\n /** The target type to search, one of {@link ImportService.listDataTypes}. */\n type: string;\n /**\n * Case-insensitive substring match on the record's natural key. This is NOT\n * the Emporix query language — `field:value`, comparisons and boolean logic\n * are not supported here.\n */\n search?: string;\n /** Filter by import outcome. Omit for records of all outcomes. */\n outcome?: ImportRecordOutcome;\n}\n\n/** Options for {@link ImportService.searchStreamRecords}. */\nexport type SearchStreamRecordsOptions = Omit<SearchImportedRecordsOptions, \"type\">;\n\n/** The wire shape of a paginated import response. */\ntype WirePage<T> = Page & { content?: T[] };\n\nfunction pageArgs(opts: ImportPageOptions): { pageNumber: number; pageSize: number } {\n return { pageNumber: opts.pageNumber ?? 1, pageSize: opts.pageSize ?? DEFAULT_PAGE_SIZE };\n}\n\n/**\n * Spring page → {@link ImportPage}. `pageNumber` / `pageSize` prefer the\n * server's echo over what was requested, because the service clamps `size`;\n * reporting the requested value would misdescribe the page you actually got.\n */\nfunction toPage<T>(\n wire: WirePage<T>,\n requested: { pageNumber: number; pageSize: number },\n): ImportPage<T> {\n const totalPages = wire.totalPages ?? 0;\n const pageNumber = (wire.number ?? requested.pageNumber - 1) + 1;\n return {\n items: wire.content ?? [],\n pageNumber,\n pageSize: wire.size ?? requested.pageSize,\n hasNextPage: pageNumber < totalPages,\n totalElements: wire.totalElements ?? 0,\n totalPages,\n };\n}\n\n/**\n * One SSE frame → one typed event. Anything unparseable, non-object or under an\n * event name this SDK does not model becomes `unknown` instead of throwing: a\n * preview service is allowed to grow event types, and a run in flight must not\n * die because of one frame we cannot read.\n */\nfunction toRunEvent(ev: SseEvent): ImportRunEvent {\n let payload: unknown;\n try {\n payload = JSON.parse(ev.data);\n } catch {\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n if (typeof payload !== \"object\" || payload === null) {\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n switch (ev.event) {\n case \"snapshot\": {\n const detail = payload as ImportRunDetail;\n return { type: \"snapshot\", run: detail.run, streams: detail.streams ?? [] };\n }\n case \"stream\":\n return { type: \"stream\", stream: payload as ImportRunStream };\n case \"run\":\n return { type: \"run\", run: payload as ImportRun };\n default:\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n}\n\n/**\n * Emporix Import Service (`/importtool/{tenant}/…`): import configurations,\n * their streams and schedules, run control, and the records an import produced.\n *\n * **Service-account only.** Every operation requires the\n * `importtool.import_trigger` scope on the client credentials, and the service\n * has no customer or anonymous variant — which is why `@viu/emporix-sdk-react`\n * ships no hooks for it. Call it from a server (Node, a Next Route Handler or\n * Server Action), never from a browser bundle.\n *\n * **Paging is one-based here, zero-based on the wire.** The facade takes\n * `pageNumber` starting at 1 and sends `page = pageNumber - 1`, matching the\n * rest of the SDK.\n *\n * **Upstream marks every operation as preview**: the contract may change without\n * a major version bump, and nearly every response field is optional in the spec.\n * Treat run counters and status as possibly absent.\n */\nexport class ImportService {\n static readonly channel = \"import\" as const;\n\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/importtool/${this.ctx.tenant}`;\n }\n\n /** List every import configuration of the tenant. */\n async listConfigs(auth: AuthContext = SERVICE): Promise<ImportConfig[]> {\n return this.ctx.http.request<ImportConfig[]>({\n method: \"GET\",\n path: `${this.base()}/configs`,\n auth,\n });\n }\n\n /** Fetch one configuration by id. */\n async getConfig(id: string, auth: AuthContext = SERVICE): Promise<ImportConfig> {\n return this.ctx.http.request<ImportConfig>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List the streams of one configuration. */\n async listStreams(configId: string, auth: AuthContext = SERVICE): Promise<ImportStream[]> {\n return this.ctx.http.request<ImportStream[]>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/streams`,\n auth,\n });\n }\n\n /** Fetch one stream by id. */\n async getStream(id: string, auth: AuthContext = SERVICE): Promise<ImportStream> {\n return this.ctx.http.request<ImportStream>({\n method: \"GET\",\n path: `${this.base()}/streams/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * The order in which a configuration's streams run, and the dependencies\n * behind it. Read it here instead of deriving it from the stream definitions:\n * mapping transformations add dependencies that no single stream shows, so a\n * self-computed order can differ from the one used at run time.\n *\n * The result lists stream **names**, while {@link triggerRun}'s `streamIds`\n * takes stream **ids** — map through {@link listStreams} before passing a\n * subset back.\n */\n async getStreamOrder(configId: string, auth: AuthContext = SERVICE): Promise<ImportStreamOrder> {\n return this.ctx.http.request<ImportStreamOrder>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/stream-order`,\n auth,\n });\n }\n\n /**\n * Fetch a configuration's schedule. Resolves to `null` when none is\n * configured — the service answers `204`, not `404`, so an absent schedule is\n * a normal result rather than an error.\n */\n async getSchedule(\n configId: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportSchedule | null> {\n const res = await this.ctx.http.request<ImportSchedule | undefined>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n auth,\n });\n return res ?? null;\n }\n\n /**\n * Create or replace a configuration's schedule.\n *\n * **`cron` is a six-field Spring expression** (`second minute hour\n * day-of-month month day-of-week`). The familiar five-field `\"0 * * * *\"` is\n * not «hourly» here, it is invalid, and the service answers `400` rather than\n * storing it — which it used to do, leaving a schedule that silently never\n * fired.\n *\n * A `404` means no configuration with that id, so there is nothing to\n * schedule. Use {@link deleteSchedule} to clear a schedule that outlived its\n * configuration.\n */\n async setSchedule(\n configId: string,\n input: ImportSchedule,\n auth: AuthContext = SERVICE,\n ): Promise<ImportSchedule> {\n return this.ctx.http.request<ImportSchedule>({\n method: \"PUT\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n body: input,\n auth,\n });\n }\n\n /**\n * Remove a configuration's schedule. It then runs only when triggered.\n *\n * **Idempotent, and deliberately not gated on the configuration existing.**\n * Removing a schedule that is not there also resolves — and unlike\n * {@link setSchedule}, this does not require the configuration to exist. That\n * is the point: a schedule left behind by a deleted configuration is exactly\n * what needs removing, so refusing those would leave them with no way out.\n *\n * The service answers `204`, so this resolves to `void` rather than to the\n * removed schedule.\n */\n async deleteSchedule(configId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n auth,\n });\n }\n\n /**\n * Trigger a run. `mode` defaults to `DELTA` server-side; `dryRun: true` maps\n * and validates without writing to the target.\n *\n * A dry run can also hand back what it *would* have written: pass\n * `sampleSize` (1–100, default 25) and read the run's `dryRunSample`. Set\n * `origin` to name what asked for the run — `trigger` only distinguishes\n * `MANUAL` from `SCHEDULED`, so without it a dashboard click and an\n * integration scenario are indistinguishable in the history. Note the service\n * **rejects** an `origin` over 40 characters instead of shortening it.\n *\n * `streamIds` runs a subset — see {@link ImportRunInput} for what is rejected,\n * and note it takes ids where {@link getStreamOrder} reports names.\n *\n * A run executes each stream's **published** mappings. Publishing needs\n * `importtool.import_manage` and is not part of the public API, so it happens\n * in the Management Dashboard's Import Tool rather than through this SDK; a dry\n * run with `mappings: \"draft\"` checks unpublished changes first. A stream whose\n * mappings were never published is `ABORTED` in the run details, and the run\n * finishes `PARTIAL`.\n *\n * **A refused run still resolves.** When `streamIds` names such a stream, or\n * every enabled stream is in that state, the service answers `200` with the\n * run anyway, and the run then finishes `ABORTED` with a `message` naming the\n * streams. Read it back with {@link getRun}, or follow it with\n * {@link streamRun}, before treating a resolved call as a started import.\n *\n * Not retried on a 5xx: a POST that timed out may already have queued a run.\n *\n * @example\n * ```ts\n * // Preview the mapping without writing anything.\n * const run = await client.imports.triggerRun(configId, {\n * dryRun: true,\n * sampleSize: 5,\n * origin: \"Dashboard\",\n * });\n * for (const row of run.dryRunSample ?? []) {\n * console.log(row.stream, row.targetType, row.key, row.fields);\n * }\n * ```\n */\n async triggerRun(\n configId: string,\n input: ImportRunInput = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportRun> {\n return this.ctx.http.request<ImportRun>({\n method: \"POST\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/runs`,\n body: input,\n auth,\n });\n }\n\n /** List a configuration's runs, newest first. */\n async listRuns(\n configId: string,\n opts: ImportPageOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportRun>> {\n const args = pageArgs(opts);\n const wire = await this.ctx.http.request<WirePage<ImportRun>>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/runs`,\n query: { page: args.pageNumber - 1, size: args.pageSize },\n auth,\n });\n return toPage(wire, args);\n }\n\n /** Fetch one run with its per-stream progress. */\n async getRun(runId: string, auth: AuthContext = SERVICE): Promise<ImportRunDetail> {\n return this.ctx.http.request<ImportRunDetail>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}`,\n auth,\n });\n }\n\n /**\n * Stream a run's progress as Server-Sent Events: an initial `snapshot`, then a\n * `stream` event per processed batch, then a final `run` event when the run\n * finishes. The iterator ends when the service closes the stream; breaking out\n * of the `for await` aborts the request.\n *\n * Two ways this differs from every other method here. It does not re-auth: a\n * `401` while opening the stream throws instead of minting a fresh token and\n * retrying once, so a long-lived consumer should be ready to re-open (or fall\n * back to polling {@link getRun}). And frames this SDK version cannot read\n * arrive as `{ type: \"unknown\" }` rather than throwing — see\n * {@link ImportRunEvent}.\n */\n async *streamRun(\n runId: string,\n auth: AuthContext = SERVICE,\n ): AsyncIterable<ImportRunEvent> {\n const frames = this.ctx.http.requestStream({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/events`,\n auth,\n });\n for await (const frame of frames) yield toRunEvent(frame);\n }\n\n /**\n * Request cancellation of a run. `force: true` hard-stops it immediately;\n * without it the run stops at the next safe point. The service answers `202`\n * with `accepted: false` when the run is unknown or already finished — that is\n * a result, not an error. A state conflict may instead come back as a `409`,\n * which does throw.\n */\n async cancelRun(\n runId: string,\n opts: { force?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportCancelResult> {\n const query: Record<string, string | number | undefined> = {};\n if (opts.force) query.force = \"true\";\n return this.ctx.http.request<ImportCancelResult>({\n method: \"POST\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/cancel`,\n query,\n auth,\n });\n }\n\n /** List the errors recorded during a run. */\n async listRunErrors(\n runId: string,\n opts: ImportPageOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportErrorRecord>> {\n const args = pageArgs(opts);\n const wire = await this.ctx.http.request<WirePage<ImportErrorRecord>>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/errors`,\n query: { page: args.pageNumber - 1, size: args.pageSize },\n auth,\n });\n return toPage(wire, args);\n }\n\n /**\n * The rows behind a run's feed-quality counters: source rows that repeated a\n * natural key (`kind: \"REPEATED_KEY\"`, counted as `duplicateKeys`) and child\n * lines with no parent to attach to (`\"UNRESOLVED_PARENT\"`, counted as\n * `unresolvedParents`). Neither is a failure, which is why these rows are not\n * in {@link listRunErrors}.\n *\n * **A capped sample** — see {@link ImportRunDiagnostics} before reading\n * `rows.length` as the size of the problem. `limit` defaults to 500 here\n * (1–50 000); {@link downloadRunDiagnosticsCsv} defaults to 50 000.\n */\n async listRunDiagnostics(\n runId: string,\n query: ImportRunDiagnosticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportRunDiagnostics> {\n return this.ctx.http.request<ImportRunDiagnostics>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/diagnostics`,\n query: { ...query },\n auth,\n });\n }\n\n /**\n * The same rows as {@link listRunDiagnostics}, as CSV text for a spreadsheet\n * or a ticket. Comment lines above the header record whether `limit` or the\n * recording cap cut rows off, so the file keeps that context when shared on\n * its own. `limit` defaults to 50 000 here, not 500.\n *\n * Every value is quoted, and a value starting with `=`, `+`, `-` or `@` is\n * prefixed with an apostrophe so spreadsheet software does not evaluate source\n * data as a formula. Strip it if you parse the file instead of opening it.\n */\n async downloadRunDiagnosticsCsv(\n runId: string,\n query: ImportRunDiagnosticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<string> {\n // `request` falls back to the raw text when a body is not JSON, and a CSV\n // with a quoted multi-column header never is.\n return this.ctx.http.request<string>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/diagnostics/csv`,\n query: { ...query },\n auth,\n });\n }\n\n /** List the target types that hold imported records — the valid `type` values for {@link searchRecords}. */\n async listDataTypes(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `${this.base()}/data/types`,\n auth,\n });\n }\n\n /** Search imported records of one target type. */\n async searchRecords(\n opts: SearchImportedRecordsOptions,\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportedRecord>> {\n const args = pageArgs(opts);\n const query: Record<string, string | number | undefined> = {\n type: opts.type,\n page: args.pageNumber - 1,\n size: args.pageSize,\n };\n if (opts.search !== undefined) query.search = opts.search;\n if (opts.outcome !== undefined) query.outcome = opts.outcome;\n const wire = await this.ctx.http.request<WirePage<ImportedRecord>>({\n method: \"GET\",\n path: `${this.base()}/data/records`,\n query,\n auth,\n });\n return toPage(wire, args);\n }\n\n /** Search the imported records produced by one stream. */\n async searchStreamRecords(\n streamId: string,\n opts: SearchStreamRecordsOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportedRecord>> {\n const args = pageArgs(opts);\n const query: Record<string, string | number | undefined> = {\n page: args.pageNumber - 1,\n size: args.pageSize,\n };\n if (opts.search !== undefined) query.search = opts.search;\n if (opts.outcome !== undefined) query.outcome = opts.outcome;\n const wire = await this.ctx.http.request<WirePage<ImportedRecord>>({\n method: \"GET\",\n path: `${this.base()}/data/streams/${encodeURIComponent(streamId)}/records`,\n query,\n auth,\n });\n return toPage(wire, args);\n }\n\n // ─── Analytics and retry (upstream release 2026-08-26) ─────────────────────\n\n /**\n * Aggregated import analytics.\n *\n * Every section is optional in the response, and `sections` is what decides\n * which the service computes — asking for all of them on a tenant with a long\n * history is the expensive call, so name the ones you render.\n *\n * `from` / `to` are ISO timestamps. Omitted, the service picks its own window;\n * do not assume it is «everything».\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async stats(\n query: ImportStatsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportStats> {\n return this.ctx.http.request<ImportStats>({\n method: \"GET\",\n path: `${this.base()}/stats`,\n query: { ...query },\n auth,\n });\n }\n\n /**\n * The dashboard's job groups: configurations with their runs grouped under\n * them.\n *\n * Named after the path rather than the summary («Retrieving job groups»)\n * because the resource lives under `/dashboard` and is shaped for that view —\n * a caller wanting plain run history wants {@link listRuns}.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async listJobGroups(auth: AuthContext = SERVICE): Promise<ImportJobGroup[]> {\n return this.ctx.http.request<ImportJobGroup[]>({\n method: \"GET\",\n path: `${this.base()}/dashboard/job-groups`,\n auth,\n });\n }\n\n /**\n * The tenant's health thresholds — the error rates above which a stream counts\n * as degraded or failing in {@link stats}.\n *\n * Read-only here: changing them needs `importtool.import_manage`, which this\n * service does not cover.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async getHealthThresholds(\n auth: AuthContext = SERVICE,\n ): Promise<ImportHealthThresholds> {\n return this.ctx.http.request<ImportHealthThresholds>({\n method: \"GET\",\n path: `${this.base()}/settings/health-thresholds`,\n auth,\n });\n }\n\n /**\n * The tenant's import limits and current consumption.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async getLicense(auth: AuthContext = SERVICE): Promise<ImportLicense> {\n return this.ctx.http.request<ImportLicense>({\n method: \"GET\",\n path: `${this.base()}/license`,\n auth,\n });\n }\n\n /**\n * Retry only the failed records of a finished run.\n *\n * Returns a **new** run — the retry is its own run with `retry: true`, not a\n * mutation of the original. Poll it with {@link getRun} or follow it with\n * {@link streamRun} exactly as you would a triggered run. Like one, it runs the\n * published mappings and can finish `ABORTED`.\n *\n * Not retried on a 5xx, for the same reason {@link triggerRun} is not: a POST\n * that timed out may already have queued the retry.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async retryRun(runId: string, auth: AuthContext = SERVICE): Promise<ImportRun> {\n return this.ctx.http.request<ImportRun>({\n method: \"POST\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/retry`,\n auth,\n });\n }\n\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { ChangelogHistoryResponse } from \"../generated/audit-logs-changelog\";\nimport type { AuditLogPage, AuditLogQuery } from \"./audit-log-types\";\n\nexport type {\n AuditLogChangeType,\n AuditLogEntry,\n AuditLogPage,\n AuditLogPathChange,\n AuditLogQuery,\n AuditLogRelatedEntity,\n} from \"./audit-log-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * The body envelope → {@link AuditLogPage}. `pageNumber` / `pageSize` come from\n * the server's echo rather than from what was requested, so the page describes\n * what actually came back.\n */\nfunction toPage(wire: ChangelogHistoryResponse): AuditLogPage {\n const pageNumber = wire.page ?? 1;\n const totalPages = wire.totalPages ?? 0;\n return {\n items: wire.items ?? [],\n pageNumber,\n pageSize: wire.size ?? 0,\n hasNextPage: pageNumber < totalPages,\n totalElements: wire.totalElements ?? 0,\n totalPages,\n };\n}\n\n/**\n * Emporix Audit Log Service, upstream «Audit Logs (Changelog) Service»\n * (`/changelog/{tenant}/changelogs`): tenant-wide change history for platform\n * entities — who changed what, when, and from which value to which.\n *\n * **Service-account only.** Reads need the `changelog.changelog_read` scope\n * (`changelog.changelog_manage` also grants it) on the client credentials. There\n * is no customer or anonymous variant, which is why `@viu/emporix-sdk-react`\n * ships no hooks for it — call it from a server, never from a browser bundle.\n *\n * **Upstream marks this service as preview**: the contract may change without a\n * major version bump, and nearly every field of an entry is optional in the\n * spec.\n */\nexport class AuditLogService {\n static readonly channel = \"audit-log\" as const;\n\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/changelog/${this.ctx.tenant}`;\n }\n\n /**\n * List changes across the tenant, newest occurrence first.\n *\n * **The window defaults to the last 30 days.** When `q` carries no\n * conjunctive `occurredAt` lower bound, the service silently applies a\n * trailing 30-day window — an unfiltered call is *not* «everything ever». Pass\n * an explicit top-level or `AND`-ed `occurredAt` range to widen it; an\n * `occurredAt` that appears only inside an `OR` arm does not lift the default.\n *\n * **`entityId` needs `entity`.** Filtering by id alone is a `400`, not an\n * empty page. There is no path-based history endpoint either — scoping to one\n * document means naming both in `q`:\n *\n * @example\n * ```ts\n * // The history of one order.\n * const page = await client.auditLogs.list({\n * q: `entity:order entityId:${orderId}`,\n * });\n * for (const entry of page.items) {\n * console.log(entry.at, entry.actor, entry.paths);\n * }\n *\n * // Everything a given person changed in June, across all entities.\n * await client.auditLogs.list({\n * q: 'actor:\"Jane Doe\" occurredAt:(>\"2026-06-01T00:00:00.000Z\" AND <\"2026-07-01T00:00:00.000Z\")',\n * pageSize: 100,\n * });\n * ```\n */\n async list(opts: AuditLogQuery = {}, auth: AuthContext = SERVICE): Promise<AuditLogPage> {\n const wire = await this.ctx.http.request<ChangelogHistoryResponse>({\n method: \"GET\",\n path: `${this.base()}/changelogs`,\n // Absent options are left off the wire entirely; the service applies its\n // own defaults (page 1, size 20) and sends back what it used.\n query: { q: opts.q, page: opts.pageNumber, size: opts.pageSize },\n auth,\n });\n return toPage(wire);\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Unit,\n UnitInput,\n UnitUpdate,\n UnitCreated,\n ConversionFactorInput,\n ConversionFactorResult,\n ConvertUnitInput,\n ConvertUnitResult,\n} from \"./unit-handling-types\";\n\nexport type {\n Unit,\n UnitInput,\n UnitUpdate,\n UnitCreated,\n ConversionFactorInput,\n ConversionFactorResult,\n ConvertUnitInput,\n ConvertUnitResult,\n} from \"./unit-handling-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Unit Handling Service (`/unit-handling/{tenant}/…`): units CRUD, unit\n * types, and conversion commands. Server-side; defaults to the service token.\n */\nexport class UnitHandlingService {\n static readonly channel = \"unit-handling\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/unit-handling/${this.ctx.tenant}`;\n }\n\n /** Find units (filter/sort/page). */\n async listUnits(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<Unit[]> {\n return this.ctx.http.request<Unit[]>({\n method: \"GET\",\n path: `${this.base()}/units`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a unit by code. */\n async getUnit(unitCode: string, auth: AuthContext = SERVICE): Promise<Unit> {\n return this.ctx.http.request<Unit>({\n method: \"GET\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n });\n }\n\n /** Add a new unit. */\n async createUnit(input: UnitInput, auth: AuthContext = SERVICE): Promise<UnitCreated> {\n return this.ctx.http.request<UnitCreated>({ method: \"POST\", path: `${this.base()}/units`, auth, body: input });\n }\n\n /** Update a unit by code. */\n async updateUnit(unitCode: string, input: UnitUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a unit by code. */\n async deleteUnit(unitCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n });\n }\n\n /** Delete multiple units by code (bulk). The codes are sent as the request body. */\n async deleteUnits(codes: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/units`,\n auth,\n body: codes,\n });\n }\n\n /** Fetch a conversion factor (`PUT /units/conversion-factor-commands`). */\n async getConversionFactor(input: ConversionFactorInput, auth: AuthContext = SERVICE): Promise<ConversionFactorResult> {\n return this.ctx.http.request<ConversionFactorResult>({\n method: \"PUT\",\n path: `${this.base()}/units/conversion-factor-commands`,\n auth,\n body: input,\n });\n }\n\n /** Convert a value between units (`PUT /units/convert-unit-commands`). */\n async convertUnit(input: ConvertUnitInput, auth: AuthContext = SERVICE): Promise<ConvertUnitResult> {\n return this.ctx.http.request<ConvertUnitResult>({\n method: \"PUT\",\n path: `${this.base()}/units/convert-unit-commands`,\n auth,\n body: input,\n });\n }\n\n /** List all unit types. */\n async listUnitTypes(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({ method: \"GET\", path: `${this.base()}/types`, auth });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Catalog, CatalogList, CatalogInput, CatalogUpdate, CatalogPatch, CatalogCreated } from \"./catalog-types\";\n\nexport type { Catalog, CatalogList, CatalogInput, CatalogUpdate, CatalogPatch, CatalogCreated } from \"./catalog-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Catalog Management (`/catalog/{tenant}/catalogs`): CRUD over catalogs.\n * Server-side; defaults to the service token. `updateCatalog` is an upsert (PUT).\n */\nexport class CatalogService {\n static readonly channel = \"catalog\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/catalog/${this.ctx.tenant}/catalogs`;\n }\n\n /** List catalogs (filtered/sorted). */\n async listCatalogs(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<CatalogList> {\n return this.ctx.http.request<CatalogList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a catalog by id. */\n async getCatalog(catalogId: string, auth: AuthContext = SERVICE): Promise<Catalog> {\n return this.ctx.http.request<Catalog>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n });\n }\n\n /** Retrieve all catalogs that contain a category. */\n async getCatalogsForCategory(categoryId: string, auth: AuthContext = SERVICE): Promise<CatalogList> {\n return this.ctx.http.request<CatalogList>({\n method: \"GET\",\n path: `${this.base()}/categories/${encodeURIComponent(categoryId)}`,\n auth,\n });\n }\n\n /** Create a catalog. */\n async createCatalog(input: CatalogInput, auth: AuthContext = SERVICE): Promise<CatalogCreated> {\n return this.ctx.http.request<CatalogCreated>({ method: \"POST\", path: this.base(), auth, body: input });\n }\n\n /** Upsert a catalog by id (`PUT`). */\n async updateCatalog(catalogId: string, input: CatalogUpdate, auth: AuthContext = SERVICE): Promise<CatalogCreated> {\n return this.ctx.http.request<CatalogCreated>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a catalog by id (`PATCH`). */\n async patchCatalog(catalogId: string, patch: CatalogPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Remove a catalog by id. */\n async deleteCatalog(catalogId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery } from \"../core/query\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n Vendor,\n VendorList,\n VendorInput,\n VendorUpdate,\n VendorCreated,\n VendorSearchQuery,\n VendorLocation,\n VendorLocationList,\n VendorLocationInput,\n VendorLocationUpdate,\n} from \"./vendor-types\";\n\nexport type {\n Vendor,\n VendorList,\n VendorInput,\n VendorUpdate,\n VendorCreated,\n VendorSearchQuery,\n VendorLocation,\n VendorLocationList,\n VendorLocationInput,\n VendorLocationUpdate,\n} from \"./vendor-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Vendor Service (`/vendor/{tenant}/…`): vendors and their locations.\n * Server-side; defaults to the service token. PUT methods are upserts. Vendor\n * locations are the vendor's own pickup/warehouse locations (distinct from the\n * customer-management `client.locations`).\n */\nexport class VendorService {\n static readonly channel = \"vendor\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/vendor/${this.ctx.tenant}`;\n }\n\n // --- Vendors ---\n\n /** List all vendors. */\n async listVendors(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<VendorList> {\n return this.ctx.http.request<VendorList>({\n method: \"GET\",\n path: `${this.base()}/vendors`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a vendor by id. */\n async getVendor(vendorId: string, auth: AuthContext = SERVICE): Promise<Vendor> {\n return this.ctx.http.request<Vendor>({\n method: \"GET\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n });\n }\n\n /**\n * Search vendors (`POST /vendors/search`). A built filter in `q` is resolved to\n * a string; paging, sort and fields go in the query string.\n */\n async searchVendors(query: VendorSearchQuery, auth: AuthContext = SERVICE): Promise<VendorList> {\n const input =\n query.q !== undefined\n ? { ...query, q: resolveQuery(query.q, { compoundLogicalQuery: false }) }\n : query;\n return this.ctx.http.request<VendorList>({\n method: \"POST\",\n path: `${this.base()}/vendors/search`,\n auth,\n ...splitQuery(input, SEARCH_PAGING),\n });\n }\n\n /** Create a vendor. */\n async createVendor(input: VendorInput, auth: AuthContext = SERVICE): Promise<VendorCreated> {\n return this.ctx.http.request<VendorCreated>({ method: \"POST\", path: `${this.base()}/vendors`, auth, body: input });\n }\n\n /** Upsert a vendor by id (`PUT`). */\n async updateVendor(vendorId: string, input: VendorUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a vendor by id. */\n async deleteVendor(vendorId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n });\n }\n\n // --- Vendor locations ---\n\n /** List all vendor locations. */\n async listVendorLocations(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<VendorLocationList> {\n return this.ctx.http.request<VendorLocationList>({\n method: \"GET\",\n path: `${this.base()}/locations`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a vendor location by id. */\n async getVendorLocation(locationId: string, auth: AuthContext = SERVICE): Promise<VendorLocation> {\n return this.ctx.http.request<VendorLocation>({\n method: \"GET\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n });\n }\n\n /** Create a vendor location. */\n async createVendorLocation(input: VendorLocationInput, auth: AuthContext = SERVICE): Promise<VendorCreated> {\n return this.ctx.http.request<VendorCreated>({ method: \"POST\", path: `${this.base()}/locations`, auth, body: input });\n }\n\n /** Upsert a vendor location by id (`PUT`). */\n async updateVendorLocation(locationId: string, input: VendorLocationUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a vendor location by id. */\n async deleteVendorLocation(locationId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery } from \"../core/query\";\nimport { splitQuery } from \"../core/search\";\nimport type {\n AdminCustomer,\n AdminCustomerList,\n AdminCustomerInput,\n AdminCustomerUpdate,\n AdminCustomerPatch,\n AdminCustomerCreated,\n AdminCustomerSearchQuery,\n AdminCustomerAddress,\n AdminCustomerAddressList,\n AdminCustomerAddressInput,\n AdminCustomerAddressUpdate,\n AdminPasswordMigrationRetention,\n AdminPasswordMigrationRetentionInput,\n AdminCustomerImport,\n AdminCustomerImportResult,\n} from \"./customer-admin-types\";\n\nexport type {\n AdminCustomer,\n AdminCustomerList,\n AdminCustomerInput,\n AdminCustomerUpdate,\n AdminCustomerPatch,\n AdminCustomerCreated,\n AdminCustomerSearchQuery,\n AdminCustomerAddress,\n AdminCustomerAddressList,\n AdminCustomerAddressInput,\n AdminCustomerAddressUpdate,\n AdminPasswordMigrationRetention,\n AdminPasswordMigrationRetentionInput,\n AdminCustomerImport,\n AdminCustomerImportAccount,\n AdminCustomerLegacyAuth,\n AdminCustomerImportResult,\n} from \"./customer-admin-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Customer Service — tenant/seller-managed customer profiles and\n * addresses (`/customer/{tenant}/customers`). Server-side; defaults to the\n * service token. Distinct from the storefront `client.customers`.\n */\nexport class CustomerAdminService {\n static readonly channel = \"customer-admin\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer/${this.ctx.tenant}/customers`;\n }\n\n private customerPath(customerNumber: string): string {\n return `${this.base()}/${encodeURIComponent(customerNumber)}`;\n }\n\n private configPath(): string {\n return `/customer/${this.ctx.tenant}/config/password-migration-retention`;\n }\n\n private addressPath(customerNumber: string, addressId: string): string {\n return `${this.customerPath(customerNumber)}/addresses/${encodeURIComponent(addressId)}`;\n }\n\n // --- Customers ---\n\n /** List customers. */\n async listCustomers(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<AdminCustomerList> {\n return this.ctx.http.request<AdminCustomerList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /**\n * Search customers (`POST /customers/search`). A built filter in `q` is resolved\n * to a string; `pageNumber`, `pageSize`, `sort` and `expand` go in the query string.\n */\n async searchCustomers(query: AdminCustomerSearchQuery, auth: AuthContext = SERVICE): Promise<AdminCustomerList> {\n const input =\n query.q !== undefined\n ? { ...query, q: resolveQuery(query.q, { compoundLogicalQuery: false }) }\n : query;\n return this.ctx.http.request<AdminCustomerList>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth,\n ...splitQuery(input, [\"pageNumber\", \"pageSize\", \"sort\", \"expand\"]),\n });\n }\n\n /** Retrieve a customer profile by number. */\n async getCustomer(customerNumber: string, auth: AuthContext = SERVICE): Promise<AdminCustomer> {\n return this.ctx.http.request<AdminCustomer>({ method: \"GET\", path: this.customerPath(customerNumber), auth });\n }\n\n /** Create a customer. */\n async createCustomer(input: AdminCustomerInput, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"POST\", path: this.base(), auth, body: input });\n }\n\n /** Upsert a customer profile by number (`PUT`). */\n async upsertCustomer(customerNumber: string, input: AdminCustomerUpdate, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"PUT\", path: this.customerPath(customerNumber), auth, body: input });\n }\n\n /** Partially update a customer profile (`PATCH`). */\n async patchCustomer(customerNumber: string, patch: AdminCustomerPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.customerPath(customerNumber), auth, body: patch });\n }\n\n /** Delete a customer profile. */\n async deleteCustomer(customerNumber: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.customerPath(customerNumber), auth });\n }\n\n // --- Addresses ---\n\n /** List a customer's addresses. */\n async listAddresses(customerNumber: string, auth: AuthContext = SERVICE): Promise<AdminCustomerAddressList> {\n return this.ctx.http.request<AdminCustomerAddressList>({\n method: \"GET\",\n path: `${this.customerPath(customerNumber)}/addresses`,\n auth,\n });\n }\n\n /** Retrieve one address. */\n async getAddress(customerNumber: string, addressId: string, auth: AuthContext = SERVICE): Promise<AdminCustomerAddress> {\n return this.ctx.http.request<AdminCustomerAddress>({ method: \"GET\", path: this.addressPath(customerNumber, addressId), auth });\n }\n\n /** Add an address. */\n async addAddress(customerNumber: string, input: AdminCustomerAddressInput, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({\n method: \"POST\",\n path: `${this.customerPath(customerNumber)}/addresses`,\n auth,\n body: input,\n });\n }\n\n /** Upsert an address by id (`PUT`). */\n async upsertAddress(customerNumber: string, addressId: string, input: AdminCustomerAddressUpdate, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"PUT\", path: this.addressPath(customerNumber, addressId), auth, body: input });\n }\n\n /** Partially update an address by id (`PATCH`). */\n async patchAddress(customerNumber: string, addressId: string, patch: AdminCustomerAddressUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.addressPath(customerNumber, addressId), auth, body: patch });\n }\n\n /** Delete an address by id. */\n async deleteAddress(customerNumber: string, addressId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.addressPath(customerNumber, addressId), auth });\n }\n\n /** Add tags to an address (`?tags=` query). */\n async addAddressTags(customerNumber: string, addressId: string, tags: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.addressPath(customerNumber, addressId)}/tags`,\n auth,\n query: { tags: tags.join(\",\") },\n });\n }\n\n /** Remove tags from an address (`?tags=` query). */\n async removeAddressTags(customerNumber: string, addressId: string, tags: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.addressPath(customerNumber, addressId)}/tags`,\n auth,\n query: { tags: tags.join(\",\") },\n });\n }\n\n // --- Password-migration retention ---\n\n /**\n * Retrieves the tenant's password-migration retention config. Requires the\n * `customer.import_read` scope. An unconfigured tenant answers with an empty\n * object rather than a 404.\n */\n async getPasswordMigrationRetention(auth: AuthContext = SERVICE): Promise<AdminPasswordMigrationRetention> {\n return this.ctx.http.request<AdminPasswordMigrationRetention>({\n method: \"GET\",\n path: this.configPath(),\n auth,\n });\n }\n\n /**\n * Creates or updates the retention config (`POST`). Requires the\n * `customer.import_manage` scope. **Call this before importing customers with\n * `legacyAuth`** — that import is rejected without an active config. Re-POST with\n * an earlier `retentionEndDate` to shorten a running window.\n */\n async configurePasswordMigrationRetention(\n input: AdminPasswordMigrationRetentionInput,\n auth: AuthContext = SERVICE,\n ): Promise<AdminPasswordMigrationRetention> {\n return this.ctx.http.request<AdminPasswordMigrationRetention>({\n method: \"POST\",\n path: this.configPath(),\n auth,\n body: input,\n });\n }\n\n /**\n * Removes the retention config. Requires the `customer.import_manage` scope.\n * Intended for after the migration window: when the window ends, unmigrated\n * accounts need a password reset and their legacy credentials are cleared.\n */\n async deletePasswordMigrationRetention(auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.configPath(), auth });\n }\n\n // --- Bulk import ---\n\n /**\n * Bulk-imports customers (`POST /customers/import`). Requires the\n * `customer.import_manage` scope.\n *\n * Responds **207 Multi-Status**: per-item failures do **not** throw — inspect each\n * entry's `code`. Each item must carry exactly one of `account.passwordHash` or\n * `account.legacyAuth`, and importing `legacyAuth` requires an active retention\n * config (see `configurePasswordMigrationRetention`).\n */\n async importCustomers(\n input: AdminCustomerImport[],\n auth: AuthContext = SERVICE,\n ): Promise<AdminCustomerImportResult[]> {\n return this.ctx.http.request<AdminCustomerImportResult[]>({\n method: \"POST\",\n path: `${this.base()}/import`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n ApprovalPermittedInput,\n ApprovalPermittedResult,\n ApprovalUsersQuery,\n ApprovalUsersResult,\n} from \"./approval-types\";\n\nexport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n ApprovalPermittedInput,\n ApprovalPermittedResult,\n ApprovalUsersQuery,\n ApprovalUsersResult,\n} from \"./approval-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Approval Service (`/approval/{tenant}/…`): B2B cart/quote approval\n * workflows — list/view approvals, create an approval request, approve or reject\n * via JSON-Patch, plus permitted-checks and approver search.\n *\n * Every endpoint is **CustomerAccessToken-only**. The trailing `auth` keeps the\n * SDK's uniform method shape, but a customer token is required in practice — pass\n * `auth.customer(token)` (the React hooks supply the browser context). The\n * service token will be rejected by Emporix.\n */\nexport class ApprovalService {\n static readonly channel = \"approval\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/approval/${this.ctx.tenant}`;\n }\n\n /** List approvals (paged via `pageNumber`/`pageSize`/`sort`/`q`). Returns an array. */\n async listApprovals(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalList> {\n return this.ctx.http.request<ApprovalList>({\n method: \"GET\",\n path: `${this.base()}/approvals`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a single approval by id. */\n async getApproval(approvalId: string, auth: AuthContext = SERVICE): Promise<Approval> {\n return this.ctx.http.request<Approval>({\n method: \"GET\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n });\n }\n\n /** Create an approval request (cart or quote). Returns the created `{ id }`. */\n async createApproval(input: ApprovalInput, auth: AuthContext = SERVICE): Promise<ApprovalCreated> {\n return this.ctx.http.request<ApprovalCreated>({\n method: \"POST\",\n path: `${this.base()}/approvals`,\n auth,\n body: input,\n });\n }\n\n /** Approve/reject/amend an approval via a JSON-Patch op-array (`PATCH`). */\n async updateApproval(\n approvalId: string,\n ops: ApprovalPatch,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete an approval by id. */\n async deleteApproval(approvalId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n });\n }\n\n /** Check whether an operation on a resource is permitted / needs approval. */\n async checkPermitted(\n input: ApprovalPermittedInput,\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalPermittedResult> {\n return this.ctx.http.request<ApprovalPermittedResult>({\n method: \"POST\",\n path: `${this.base()}/approval/permitted`,\n auth,\n body: input,\n });\n }\n\n /** Search for users eligible to approve a resource. Returns an array. */\n async searchApprovers(\n input: ApprovalUsersQuery,\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalUsersResult> {\n return this.ctx.http.request<ApprovalUsersResult>({\n method: \"POST\",\n path: `${this.base()}/search/users`,\n auth,\n body: input,\n });\n }\n}\n\n/** The status transitions a client can request. `PENDING` and `EXPIRED` are set by Emporix. */\nexport type ApprovalDecision = \"APPROVED\" | \"DECLINED\" | \"CLOSED\";\n\n/**\n * Builds the JSON-Patch for an approval decision, with both measured quirks baked in.\n *\n * Two things about this patch are counter-intuitive, both measured against tenant\n * `viu` on 2026-08-18:\n *\n * 1. **`replace` is lowercase.** The upstream spec shipped the enum uppercase and the\n * live API answers `REPLACE` with 400. That is repaired at the spec level (see\n * `scripts/spec-patches.ts`), so the type now guides you correctly.\n * 2. **The approver comment needs `add`, not `replace`.** `approverComment` does not\n * exist on a fresh approval, and `replace` on an absent field answers\n * `APPROVAL-400010` «Missing field \"approverComment\"». Because PATCH is atomic,\n * that failure takes the status change down with it — the decision silently does\n * not happen. `add` creates the field and overwrites it on a second decision, so\n * it is correct in both cases. The upstream spec's own «Add comment by the\n * approver» example agrees; only its enum did not.\n *\n * Status and comment travel in one request on purpose: since PATCH is atomic, a\n * rejection can never land without its reason.\n *\n * @example\n * await client.approvals.updateApproval(id, approvalStatusPatch(\"DECLINED\", \"Over budget\"), auth);\n */\nexport function approvalStatusPatch(\n status: ApprovalDecision,\n approverComment?: string,\n): ApprovalPatch {\n const comment = approverComment?.trim() ?? \"\";\n return [\n { op: \"replace\", path: \"/status\", value: status },\n // `as const` on both fields: the generated type narrows `path` to an enum too, so\n // a widened `string` from the spread would not be assignable.\n ...(comment !== \"\"\n ? [{ op: \"add\" as const, path: \"/approverComment\" as const, value: comment }]\n : []),\n ];\n}\n","import type { EmporixConfig, ResolvedConfig } from \"./core/config\";\nimport type { TokenProvider, CustomerTokenRefresher } from \"./core/auth\";\nimport type { LogLevel, ServiceName } from \"./core/logger\";\nimport { createCore, type EmporixCore } from \"./core/create-core\";\nimport { CustomerService } from \"./services/customer\";\nimport { ProductService } from \"./services/product\";\nimport { CategoryService } from \"./services/category\";\nimport { CartService } from \"./services/cart\";\nimport { CheckoutService } from \"./services/checkout\";\nimport { PaymentGatewayService } from \"./services/payment\";\nimport { PriceService } from \"./services/price\";\nimport { MediaService } from \"./services/media\";\nimport { SegmentService } from \"./services/segment\";\nimport { SiteService } from \"./services/site\";\nimport { SessionContextService } from \"./services/session-context\";\nimport { CompaniesService } from \"./services/companies\";\nimport { ContactsService } from \"./services/contacts\";\nimport { LocationsService } from \"./services/locations\";\nimport { CustomerGroupsService } from \"./services/customer-groups\";\nimport { IamService } from \"./services/iam\";\nimport { OrdersService, SalesOrdersService } from \"./services/orders\";\nimport { AvailabilityService } from \"./services/availability\";\nimport { TenantConfigService } from \"./services/tenant-config\";\nimport { ClientConfigService } from \"./services/client-config\";\nimport { ShoppingListService } from \"./services/shopping-list\";\nimport { RagIndexerService } from \"./services/ai-rag-indexer\";\nimport { SequentialIdService } from \"./services/sequential-id\";\nimport { FeeService } from \"./services/fee\";\nimport { CloudFunctionsService } from \"./services/cloud-functions\";\nimport { WebhookService } from \"./services/webhook\";\nimport { SchemaService } from \"./services/schema\";\nimport { AiService } from \"./services/ai\";\nimport { TaxService } from \"./services/tax\";\nimport { CouponService } from \"./services/coupon\";\nimport { RewardPointsService } from \"./services/reward-points\";\nimport { BrandService } from \"./services/brand\";\nimport { LabelService } from \"./services/label\";\nimport { CountryService } from \"./services/country\";\nimport { CurrencyService } from \"./services/currency\";\nimport { ShippingService } from \"./services/shipping\";\nimport { InvoiceService } from \"./services/invoice\";\nimport { QuoteService } from \"./services/quote\";\nimport { ReturnsService } from \"./services/returns\";\nimport { IndexingService } from \"./services/indexing\";\nimport { SearchService } from \"./services/search\";\nimport { ImportService } from \"./services/imports\";\nimport { AuditLogService } from \"./services/audit-log\";\nimport { UnitHandlingService } from \"./services/unit-handling\";\nimport { CatalogService } from \"./services/catalog\";\nimport { VendorService } from \"./services/vendor\";\nimport { CustomerAdminService } from \"./services/customer-admin\";\nimport { ApprovalService } from \"./services/approval\";\n\n/** The Emporix SDK entry point. One instance safely serves many concurrent shoppers. */\nexport class EmporixClient {\n readonly customers: CustomerService;\n readonly products: ProductService;\n readonly categories: CategoryService;\n readonly carts: CartService;\n readonly checkout: CheckoutService;\n readonly payments: PaymentGatewayService;\n readonly prices: PriceService;\n readonly media: MediaService;\n readonly segments: SegmentService;\n readonly sites: SiteService;\n readonly sessionContext: SessionContextService;\n readonly companies: CompaniesService;\n readonly contacts: ContactsService;\n readonly locations: LocationsService;\n readonly customerGroups: CustomerGroupsService;\n readonly iam: IamService;\n readonly orders: OrdersService;\n readonly salesOrders: SalesOrdersService;\n readonly availability: AvailabilityService;\n readonly tenantConfig: TenantConfigService;\n readonly clientConfig: ClientConfigService;\n readonly shoppingLists: ShoppingListService;\n readonly ragIndexer: RagIndexerService;\n readonly sequentialIds: SequentialIdService;\n readonly fees: FeeService;\n readonly cloudFunctions: CloudFunctionsService;\n readonly webhooks: WebhookService;\n readonly schemas: SchemaService;\n readonly ai: AiService;\n readonly taxes: TaxService;\n readonly coupons: CouponService;\n readonly rewardPoints: RewardPointsService;\n readonly brands: BrandService;\n readonly labels: LabelService;\n readonly countries: CountryService;\n readonly currencies: CurrencyService;\n readonly shipping: ShippingService;\n readonly invoices: InvoiceService;\n readonly quotes: QuoteService;\n readonly returns: ReturnsService;\n readonly indexing: IndexingService;\n readonly search: SearchService;\n readonly imports: ImportService;\n readonly auditLogs: AuditLogService;\n readonly units: UnitHandlingService;\n readonly catalogs: CatalogService;\n readonly vendors: VendorService;\n readonly customerAdmin: CustomerAdminService;\n readonly approvals: ApprovalService;\n /** The validated tenant this client is bound to. */\n readonly tenant: string;\n /**\n * The token provider in use by this client. Exposed so React/Next hosts can\n * call `attachAnonymousStore` to wire session persistence. Treat as\n * read-only — replacing it after construction is not supported.\n */\n readonly tokenProvider: TokenProvider;\n /**\n * The validated config used to construct this client. Exposed so React /\n * Next hosts can read static settings such as `credentials.storefront.context`\n * (siteCode, currency, targetLocation) without re-plumbing them through the\n * Provider tree. Treat as read-only.\n */\n readonly config: ResolvedConfig;\n private readonly core: EmporixCore;\n\n constructor(config: EmporixConfig) {\n const core = createCore(config);\n this.core = core;\n this.tenant = core.tenant;\n this.config = core.config;\n this.tokenProvider = core.tokenProvider;\n\n const mk = core.mk;\n this.customers = new CustomerService(mk(CustomerService.channel));\n this.products = new ProductService(mk(ProductService.channel));\n this.categories = new CategoryService(mk(CategoryService.channel));\n this.carts = new CartService(mk(CartService.channel));\n this.checkout = new CheckoutService(mk(CheckoutService.channel));\n this.payments = new PaymentGatewayService(mk(PaymentGatewayService.channel));\n this.prices = new PriceService(mk(PriceService.channel));\n this.media = new MediaService(mk(MediaService.channel));\n this.segments = new SegmentService(mk(SegmentService.channel), {\n products: this.products,\n categories: this.categories,\n });\n this.sites = new SiteService(mk(SiteService.channel));\n this.sessionContext = new SessionContextService(mk(SessionContextService.channel));\n this.companies = new CompaniesService(mk(CompaniesService.channel));\n this.contacts = new ContactsService(mk(ContactsService.channel));\n this.locations = new LocationsService(mk(LocationsService.channel));\n this.customerGroups = new CustomerGroupsService(mk(CustomerGroupsService.channel));\n this.iam = new IamService(mk(IamService.channel));\n this.orders = new OrdersService(mk(OrdersService.channel));\n this.salesOrders = new SalesOrdersService(mk(SalesOrdersService.channel));\n this.availability = new AvailabilityService(mk(AvailabilityService.channel));\n this.tenantConfig = new TenantConfigService(mk(TenantConfigService.channel));\n this.clientConfig = new ClientConfigService(mk(ClientConfigService.channel));\n this.shoppingLists = new ShoppingListService(mk(ShoppingListService.channel));\n this.ragIndexer = new RagIndexerService(mk(RagIndexerService.channel));\n this.sequentialIds = new SequentialIdService(mk(SequentialIdService.channel));\n this.fees = new FeeService(mk(FeeService.channel));\n this.cloudFunctions = new CloudFunctionsService(mk(CloudFunctionsService.channel));\n this.webhooks = new WebhookService(mk(WebhookService.channel));\n this.schemas = new SchemaService(mk(SchemaService.channel));\n this.ai = new AiService(mk(AiService.channel));\n this.taxes = new TaxService(mk(TaxService.channel));\n this.coupons = new CouponService(mk(CouponService.channel));\n this.rewardPoints = new RewardPointsService(mk(RewardPointsService.channel));\n this.brands = new BrandService(mk(BrandService.channel));\n this.labels = new LabelService(mk(LabelService.channel));\n this.countries = new CountryService(mk(CountryService.channel));\n this.currencies = new CurrencyService(mk(CurrencyService.channel));\n this.shipping = new ShippingService(mk(ShippingService.channel));\n this.invoices = new InvoiceService(mk(InvoiceService.channel));\n this.quotes = new QuoteService(mk(QuoteService.channel));\n this.returns = new ReturnsService(mk(ReturnsService.channel));\n this.indexing = new IndexingService(mk(IndexingService.channel));\n this.search = new SearchService(mk(SearchService.channel));\n this.imports = new ImportService(mk(ImportService.channel));\n this.auditLogs = new AuditLogService(mk(AuditLogService.channel));\n this.units = new UnitHandlingService(mk(UnitHandlingService.channel));\n this.catalogs = new CatalogService(mk(CatalogService.channel));\n this.vendors = new VendorService(mk(VendorService.channel));\n this.customerAdmin = new CustomerAdminService(mk(CustomerAdminService.channel));\n this.approvals = new ApprovalService(mk(ApprovalService.channel));\n }\n\n /**\n * Re-binds the storefront price context (currency / siteCode / targetLocation)\n * for anonymous pricing and invalidates the current anonymous session, so the\n * next request re-mints a token bound to the new context. Use this to switch\n * currency at runtime. Carts are currency-bound — clear the cart after a\n * currency change (the React `setCurrency` does this for you).\n *\n * Also sets the storefront `language` (an `Accept-Language` header on every\n * read); a language-only change does NOT re-mint the token.\n */\n setStorefrontContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n language?: string;\n }): void {\n this.core.setStorefrontContext(ctx);\n }\n\n /** Sets the runtime log level globally or for one service. */\n setLogLevel(level: LogLevel, opts: { service?: ServiceName; force?: boolean } = {}): void {\n this.core.setLogLevel(level, opts);\n }\n\n /** Returns the effective log level for a service. */\n getLogLevel(service: ServiceName): LogLevel {\n return this.core.getLogLevel(service);\n }\n\n /**\n * Registers (or clears with `null`) a customer-token refresher. When set, a\n * `customer`-kind 401 triggers one refresh-and-retry. Off by default — the\n * customer token stays caller-owned. The React `EmporixProvider` wires this\n * automatically via `autoRefreshCustomerToken`.\n */\n setCustomerTokenRefresher(refresher: CustomerTokenRefresher | null): void {\n this.core.setCustomerTokenRefresher(refresher);\n }\n}\n","import type { EmporixConfig } from \"./core/config\";\nimport type { ServiceName } from \"./core/logger\";\nimport { EmporixError } from \"./core/errors\";\nimport { createCore, type EmporixCore } from \"./core/create-core\";\n\n/**\n * A service class the factory can instantiate: carries its channel + optional\n * deps. The constructor signature is intentionally loose (`...args: any[]`) so\n * both dep-free services (`new Svc(ctx)`) and dependent ones\n * (`new Svc(ctx, deps)` — e.g. `SegmentService`) satisfy it.\n */\nexport interface ServiceClass<I> {\n readonly channel: ServiceName;\n readonly deps?: readonly string[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): I;\n}\n\n/**\n * Tree-shakeable client factory. Builds ONLY the service classes you pass —\n * imports no services itself, so a bundler drops every service you don't use.\n * `EmporixClient` remains the batteries-included default; reach for this when\n * bundle size matters. Dependent services (e.g. `segments`) require their deps\n * to be present in the map under their public names (`products`, `categories`).\n */\nexport function createEmporixClient<S extends Record<string, ServiceClass<unknown>>>(\n config: EmporixConfig,\n services: S,\n): Omit<EmporixCore, \"mk\"> & { [K in keyof S]: InstanceType<S[K]> } {\n const { mk, ...core } = createCore(config);\n const built: Record<string, unknown> = {};\n const entries = Object.entries(services) as [string, ServiceClass<unknown>][];\n\n // Pass 1: dependency-free services.\n for (const [key, Svc] of entries) {\n if (!Svc.deps?.length) built[key] = new Svc(mk(Svc.channel));\n }\n // Pass 2: dependents (only `segments` today; deps are all dep-free, so two\n // passes suffice — a deeper graph would need a topological sort).\n for (const [key, Svc] of entries) {\n if (!Svc.deps?.length) continue;\n const deps: Record<string, unknown> = {};\n for (const dep of Svc.deps) {\n if (!(dep in built)) {\n throw new EmporixError(\n `createEmporixClient: \"${key}\" requires \"${dep}\" in the services map`,\n );\n }\n deps[dep] = built[dep];\n }\n built[key] = new Svc(mk(Svc.channel), deps);\n }\n\n return { ...core, ...built } as Omit<EmporixCore, \"mk\"> & {\n [K in keyof S]: InstanceType<S[K]>;\n };\n}\n","/**\n * Extracts the product id from a product `itemYrn`\n * (`urn:yaas:hybris:product:product:<tenant>;<productId>`). Cart and order line\n * items carry only the YRN, not a bare product id. Returns \"\" when the YRN is\n * missing or has no `;` segment.\n *\n * Approval resource items are an exception: their `itemYrn` is frequently the bare\n * product id with no YRN wrapper, so this returns \"\" and you want the sibling\n * `itemId` as a fallback. Measured on tenant `viu`, 2026-08-18.\n */\nexport function productIdFromYrn(yrn: string | undefined): string {\n if (!yrn) return \"\";\n const semi = yrn.lastIndexOf(\";\");\n return semi >= 0 ? yrn.slice(semi + 1) : \"\";\n}\n\n/**\n * Builds a product `itemYrn` — the form `carts.addItem` requires.\n *\n * The inverse of {@link productIdFromYrn}. Emporix rejects anything else with\n * «Given yrn does not match yaas urn scheme».\n */\nexport function productYrn(tenant: string, productId: string): string {\n return `urn:yaas:hybris:product:product:${tenant};${productId}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/config.ts","../src/core/logger.ts","../src/core/session-keys.ts","../src/core/session-storage.ts","../src/core/browser-storage.ts","../src/core/query-keys.ts","../src/core/customer-session-store.ts","../src/core/sse.ts","../src/core/http.ts","../package.json","../src/version.ts","../src/core/create-core.ts","../src/services/site.ts","../src/services/session-context.ts","../src/services/tenant-config.ts","../src/services/client-config.ts","../src/services/shopping-list.ts","../src/services/ai-rag-indexer.ts","../src/services/sequential-id.ts","../src/services/fee.ts","../src/services/cloud-functions.ts","../src/services/webhook.ts","../src/services/schema.ts","../src/services/ai-resources.ts","../src/services/ai.ts","../src/services/tax.ts","../src/services/coupon.ts","../src/services/reward-points.ts","../src/services/brand.ts","../src/services/label.ts","../src/services/country.ts","../src/services/currency.ts","../src/services/shipping.ts","../src/services/invoice.ts","../src/services/quote.ts","../src/services/returns.ts","../src/services/indexing.ts","../src/services/search.ts","../src/services/imports.ts","../src/services/audit-log.ts","../src/services/unit-handling.ts","../src/services/catalog.ts","../src/services/vendor.ts","../src/services/customer-admin.ts","../src/services/approval.ts","../src/client.ts","../src/create-emporix-client.ts","../src/core/yrn.ts"],"names":["ANON","version","SERVICE","auth","toPage"],"mappings":"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","file":"index.js","sourcesContent":["import type { Logger, LoggerConfig } from \"./logger\";\nimport type { TokenProvider } from \"./auth\";\n\n/** Default Emporix API host. */\nexport const DEFAULT_HOST = \"https://api.emporix.io\";\n\n/**\n * Tenant guard. Emporix docs only state \"always lowercase\"; the 3–16 char\n * `^[a-z][a-z0-9]+$` rule is an SDK-side guard, not a documented constraint.\n */\nconst TENANT_RE = /^[a-z][a-z0-9]{2,15}$/;\n\n/** A client-credentials credential set (service / custom). */\nexport interface ServiceCredentials {\n clientId: string;\n secret: string;\n scope?: string;\n}\n\n/** Storefront credential — anonymous token needs the client id only, no secret. */\nexport interface StorefrontCredentials {\n clientId: string;\n /**\n * Session context bound at anonymous-login time. Required for\n * `prices.matchByContext` to resolve currency/site/country server-side.\n * `targetLocation` is an ISO country code.\n */\n context?: { currency?: string; siteCode?: string; targetLocation?: string; language?: string };\n}\n\n/** User-supplied SDK configuration. */\nexport interface EmporixConfig {\n tenant: string;\n host?: string;\n credentials: {\n /**\n * Service (client-credentials) credentials. Optional: storefront/SPA apps\n * use only `storefront` (anonymous) + caller-supplied customer tokens and\n * must never ship a backend secret. Required only when a `service`\n * AuthContext is actually used — enforced lazily by the TokenProvider.\n */\n backend?: ServiceCredentials;\n storefront?: StorefrontCredentials;\n custom?: Record<string, ServiceCredentials>;\n };\n tokenProvider?: TokenProvider;\n timeouts?: { connectMs?: number; readMs?: number };\n retry?: { maxAttempts?: number };\n cache?: { expirationBufferSeconds?: number; maxLifetimeSeconds?: number };\n logger?: LoggerConfig;\n /**\n * Replaces the global `fetch` for API requests. Receives the same arguments.\n *\n * Deliberately NOT used for token requests (`core/auth.ts`) or SSE\n * (`HttpClient.stream`): a cached token response would be a security defect,\n * and caching an event stream is meaningless. Those keep the global `fetch`,\n * which makes them structurally uncacheable rather than uncached by\n * convention.\n */\n fetch?: typeof globalThis.fetch;\n /**\n * Sent as `Content-Language` on every request that carries a body: the\n * language of the localized fields in it. Unset (the default) sends no header.\n *\n * - `\"*\"` — localized fields are maps of translations, `{ de: \"…\", en: \"…\" }`;\n * - a language code such as `\"de\"` — they are plain strings in that language.\n *\n * Without the header, most services read localized fields as plain strings in\n * the tenant's default language and answer a map with a 400 («localized values\n * must be of String type when the Content-Language header is not set to all\n * languages»). Categories and catalogs are the exception: they always take maps.\n *\n * It applies to every write the client makes, so set it on the client that does\n * back-office writes, not on a storefront client. Product and category writes\n * can override it per call with `contentLanguage` in their write options.\n */\n contentLanguage?: string;\n}\n\n/** Fully-resolved configuration with defaults applied. */\nexport interface ResolvedConfig {\n tenant: string;\n host: string;\n credentials: EmporixConfig[\"credentials\"];\n tokenProvider: TokenProvider | undefined;\n timeouts: { connectMs: number; readMs: number };\n retry: { maxAttempts: number };\n cache: { expirationBufferSeconds: number; maxLifetimeSeconds: number };\n logger: LoggerConfig | undefined;\n fetch: typeof globalThis.fetch | undefined;\n contentLanguage: string | undefined;\n}\n\n/**\n * `context` belongs inside `credentials.storefront`, and at the top level it is\n * silently lost.\n *\n * `EmporixConfig` has no top-level `context`, so such an object is dropped without a\n * word — and then `matchByContext` answers `[]` with no error, because the anonymous\n * token was minted without site, currency and country. Measured on tenant `viu`\n * (2026-08-18): 0 matches when misplaced, 1 when placed correctly. The expensive part\n * is the silence: it reads exactly like «no prices configured».\n *\n * A warning rather than a throw — configs that misplace it work today (badly), and a\n * throw would stop them on upgrade. `logger: false` is honoured as an explicit\n * request for silence; the object form of `LoggerConfig` carries no `warn` method, so\n * anything that is not a `Logger` instance falls back to the console.\n */\nfunction warnOnMisplacedContext(input: EmporixConfig): void {\n if (!(\"context\" in input)) return;\n const logger = input.logger;\n if (logger === false) return;\n const message =\n \"EmporixConfig has no top-level `context` — it is being ignored. Move it into \" +\n \"`credentials.storefront.context`, otherwise the anonymous token carries no \" +\n \"site/currency/country and price matching returns an empty list without erroring.\";\n if (logger && typeof (logger as Logger).warn === \"function\") {\n (logger as Logger).warn(message);\n return;\n }\n // Same escape hatch as the read-only-storage warning in `session-storage.ts`: this\n // has to reach a developer who configured no logger at all, which is exactly the\n // situation the mistake happens in.\n // eslint-disable-next-line no-console\n console.warn(`[emporix] ${message}`);\n}\n\n/** Validates user config and applies defaults. Throws on invalid tenant/credentials. */\nexport function validateConfig(input: EmporixConfig): ResolvedConfig {\n if (!TENANT_RE.test(input.tenant)) {\n throw new Error(\n `Invalid tenant \"${input.tenant}\": must be lowercase, 3–16 chars, match ^[a-z][a-z0-9]+$`,\n );\n }\n if (!input.credentials) {\n throw new Error(\"credentials is required (provide at least one of backend/storefront/custom)\");\n }\n warnOnMisplacedContext(input);\n return {\n tenant: input.tenant,\n host: input.host ?? DEFAULT_HOST,\n credentials: input.credentials,\n tokenProvider: input.tokenProvider,\n timeouts: {\n connectMs: input.timeouts?.connectMs ?? 10_000,\n readMs: input.timeouts?.readMs ?? 60_000,\n },\n retry: { maxAttempts: input.retry?.maxAttempts ?? 3 },\n cache: {\n expirationBufferSeconds: input.cache?.expirationBufferSeconds ?? 60,\n maxLifetimeSeconds: input.cache?.maxLifetimeSeconds ?? 3600,\n },\n logger: input.logger,\n fetch: input.fetch,\n contentLanguage: input.contentLanguage,\n };\n}\n","/** Log severity, low → high. */\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\n/** Numeric ordering used for fast comparison. */\nexport const LEVEL: Record<LogLevel, number> = {\n trace: 10, debug: 20, info: 30, warn: 40, error: 50, silent: 60,\n};\n\n/** Services that bind their own logger and are independently level-controllable. */\nexport type ServiceName =\n | \"customer\"\n | \"product\"\n | \"category\"\n | \"cart\"\n | \"checkout\"\n | \"payment\"\n | \"price\"\n | \"media\"\n | \"segment\"\n | \"site\"\n | \"session-context\"\n | \"customer-management\"\n | \"iam\"\n | \"orders\"\n | \"sales-orders\"\n | \"availability\"\n | \"configuration\"\n | \"shopping-list\"\n | \"ai-rag-indexer\"\n | \"sequential-id\"\n | \"fee\"\n | \"webhook\"\n | \"schema\"\n | \"ai\"\n | \"tax\"\n | \"coupon\"\n | \"reward-points\"\n | \"brand\"\n | \"label\"\n | \"country\"\n | \"currency\"\n | \"shipping\"\n | \"returns\"\n | \"indexing\"\n | \"search\"\n | \"import\"\n | \"audit-log\"\n | \"unit-handling\"\n | \"catalog\"\n | \"vendor\"\n | \"customer-admin\"\n | \"approval\"\n | \"invoice\"\n | \"quote\"\n | \"cloud-functions\"\n | \"http\"\n | \"auth\";\n\n/** Arbitrary structured fields attached to a log line. */\nexport interface LogFields { [key: string]: unknown; }\n\n/** The logger contract consumers may implement or swap. */\nexport interface Logger {\n level: LogLevel;\n isLevelEnabled(level: LogLevel): boolean;\n trace(msg: string, fields?: LogFields): void;\n debug(msg: string, fields?: LogFields): void;\n info(msg: string, fields?: LogFields): void;\n warn(msg: string, fields?: LogFields): void;\n error(msg: string, fields?: LogFields): void;\n child(bindings: LogFields): Logger;\n}\n\n/** Object form of logger configuration. */\nexport interface LoggerObjectConfig {\n level?: LogLevel;\n services?: Partial<Record<ServiceName, LogLevel>>;\n pretty?: boolean;\n redact?: string[];\n}\n\n/** `false` → noop logger; `Logger` → user-supplied; object → built-in console logger. */\nexport type LoggerConfig = false | Logger | LoggerObjectConfig;\n\nfunction isValidLevel(v: string | undefined): v is LogLevel {\n return v !== undefined && v in LEVEL;\n}\n\n/** Browser-safe env read — `process` is undefined in browsers/edge runtimes. */\nfunction readEnv(name: string): string | undefined {\n try {\n return typeof process !== \"undefined\" && process.env ? process.env[name] : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves the effective level per service following:\n * env per-service > env global > config.services[svc] > config.level > \"warn\".\n * Runtime `set()` mutates programmatic levels but never overrides env-set ones\n * unless `force` is passed.\n */\nexport class LevelResolver {\n private cfgLevel: LogLevel;\n private cfgServices: Partial<Record<ServiceName, LogLevel>>;\n private forcedServices: Partial<Record<ServiceName, LogLevel>> = {};\n private forcedGlobal: LogLevel | undefined;\n private warned = false;\n\n constructor(\n cfg: LoggerObjectConfig,\n private readonly warn: (msg: string) => void = () => {},\n ) {\n this.cfgLevel = cfg.level ?? \"warn\";\n this.cfgServices = { ...cfg.services };\n }\n\n private envFor(svc: ServiceName): LogLevel | undefined {\n const raw = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`);\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL_${svc.toUpperCase()}=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n private envGlobal(): LogLevel | undefined {\n const raw = readEnv(\"EMPORIX_LOG_LEVEL\");\n if (raw === undefined) return undefined;\n if (isValidLevel(raw)) return raw;\n if (!this.warned) {\n this.warned = true;\n this.warn(`Invalid EMPORIX_LOG_LEVEL=\"${raw}\" ignored`);\n }\n return undefined;\n }\n\n /**\n * Effective level for a service. Forced overrides (from `set(..., force)`)\n * take precedence over env vars; otherwise env > programmatic config.\n */\n get(svc: ServiceName): LogLevel {\n return (\n this.forcedServices[svc] ??\n this.envFor(svc) ??\n this.forcedGlobal ??\n this.envGlobal() ??\n this.cfgServices[svc] ??\n this.cfgLevel ??\n \"warn\"\n );\n }\n\n /** Numeric effective level for a service. */\n numericLevel(svc: ServiceName): number {\n return LEVEL[this.get(svc)];\n }\n\n /** True if `svc`'s effective level allows emitting at `at`. */\n isAtLeast(svc: ServiceName, at: LogLevel): boolean {\n return this.numericLevel(svc) <= LEVEL[at];\n }\n\n /** Mutates programmatic level (global or one service). Env-set levels are sticky unless `force`. */\n set(level: LogLevel, svc?: ServiceName, force = false): void {\n if (svc) {\n const envBound = readEnv(`EMPORIX_LOG_LEVEL_${svc.toUpperCase()}`) !== undefined;\n if (envBound && !force) {\n this.warn(`Level for \"${svc}\" is env-controlled; pass force to override`);\n return;\n }\n if (force) this.forcedServices[svc] = level;\n else this.cfgServices[svc] = level;\n } else {\n const envBound = readEnv(\"EMPORIX_LOG_LEVEL\") !== undefined;\n if (envBound && !force) {\n this.warn(\"Global level is env-controlled; pass force to override\");\n return;\n }\n if (force) this.forcedGlobal = level;\n else this.cfgLevel = level;\n }\n }\n}\n\n/** Default redaction floor — never reducible. */\nconst DEFAULT_REDACT = new Set([\n \"authorization\", \"password\", \"oldpassword\", \"newpassword\", \"clientsecret\",\n \"secret\", \"access_token\", \"refresh_token\", \"customertoken\", \"saastoken\",\n \"saas-token\", \"bearertoken\", \"apikey\", \"token\",\n]);\n\n/** Deep-clones `value`, replacing redacted keys with a mask. AuthContext token is stripped. */\nexport function redact(value: unknown, extra: string[] = []): unknown {\n const keys = new Set(DEFAULT_REDACT);\n for (const k of extra) keys.add(k.toLowerCase());\n const walk = (v: unknown): unknown => {\n if (Array.isArray(v)) return v.map(walk);\n if (v && typeof v === \"object\") {\n const src = v as Record<string, unknown>;\n // AuthContext: keep only `kind`.\n if (typeof src.kind === \"string\" && \"token\" in src) return { kind: src.kind };\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(src)) {\n if (keys.has(k.toLowerCase())) {\n out[k] =\n k.toLowerCase() === \"authorization\" && typeof val === \"string\"\n ? \"Bearer ***redacted***\"\n : \"***redacted***\";\n } else {\n out[k] = walk(val);\n }\n }\n return out;\n }\n return v;\n };\n return walk(value);\n}\n\ninterface Sink {\n log: (...a: unknown[]) => void;\n info: (...a: unknown[]) => void;\n warn: (...a: unknown[]) => void;\n error: (...a: unknown[]) => void;\n}\n\nconst EMIT: Record<Exclude<LogLevel, \"silent\">, number> = {\n trace: LEVEL.trace, debug: LEVEL.debug, info: LEVEL.info, warn: LEVEL.warn, error: LEVEL.error,\n};\n\nabstract class BaseLogger implements Logger {\n constructor(\n protected readonly resolver: LevelResolver,\n protected readonly bindings: LogFields,\n protected readonly extraRedact: string[],\n ) {}\n private svc(): ServiceName {\n return (this.bindings.service as ServiceName) ?? \"http\";\n }\n get level(): LogLevel {\n return this.resolver.get(this.svc());\n }\n isLevelEnabled(level: LogLevel): boolean {\n return this.resolver.isAtLeast(this.svc(), level);\n }\n protected abstract emit(\n level: Exclude<LogLevel, \"silent\">,\n msg: string,\n fields: LogFields,\n ): void;\n private at(level: Exclude<LogLevel, \"silent\">, msg: string, fields?: LogFields): void {\n if (this.resolver.numericLevel(this.svc()) > EMIT[level]) return;\n const merged = { ...this.bindings, ...(fields ?? {}) };\n this.emit(level, msg, redact(merged, this.extraRedact) as LogFields);\n }\n trace(m: string, f?: LogFields): void { this.at(\"trace\", m, f); }\n debug(m: string, f?: LogFields): void { this.at(\"debug\", m, f); }\n info(m: string, f?: LogFields): void { this.at(\"info\", m, f); }\n warn(m: string, f?: LogFields): void { this.at(\"warn\", m, f); }\n error(m: string, f?: LogFields): void { this.at(\"error\", m, f); }\n abstract child(bindings: LogFields): Logger;\n}\n\nclass ConsoleLogger extends BaseLogger {\n constructor(\n resolver: LevelResolver,\n bindings: LogFields,\n extra: string[],\n private readonly sink: Sink,\n private readonly pretty: boolean,\n ) {\n super(resolver, bindings, extra);\n }\n protected emit(level: Exclude<LogLevel, \"silent\">, msg: string, fields: LogFields): void {\n if (this.pretty) {\n const fn =\n level === \"error\" ? this.sink.error\n : level === \"warn\" ? this.sink.warn\n : level === \"info\" ? this.sink.info\n : this.sink.log;\n fn(`[${level}] ${msg}`, fields);\n } else {\n this.sink.log(JSON.stringify({ ts: new Date().toISOString(), level, msg, ...fields }));\n }\n }\n child(bindings: LogFields): Logger {\n return new ConsoleLogger(\n this.resolver,\n { ...this.bindings, ...bindings },\n this.extraRedact,\n this.sink,\n this.pretty,\n );\n }\n}\n\nclass NoopLogger implements Logger {\n level: LogLevel = \"silent\";\n isLevelEnabled(): boolean { return false; }\n trace(): void {}\n debug(): void {}\n info(): void {}\n warn(): void {}\n error(): void {}\n child(): Logger { return this; }\n}\n\n/** Creates the built-in console logger. `opts.sink` overrides `console` (used in tests). */\nexport function createConsoleLogger(\n resolver: LevelResolver,\n bindings: LogFields = {},\n opts: { pretty?: boolean; redact?: string[]; sink?: Sink } = {},\n): Logger {\n const pretty = opts.pretty ?? readEnv(\"NODE_ENV\") !== \"production\";\n const sink: Sink = opts.sink ?? {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n };\n return new ConsoleLogger(resolver, bindings, opts.redact ?? [], sink, pretty);\n}\n\n/** Creates a logger that discards everything. */\nexport function createNoopLogger(): Logger {\n return new NoopLogger();\n}\n","/**\n * The persisted session-state contract, shared by every host.\n *\n * It lives in the core SDK rather than in `@viu/emporix-sdk-react` because it is\n * not a React concern: the same eight keys are cookie names in a Next\n * `proxy.ts`, Web Storage keys in a browser adapter, and record fields in a\n * server-side session store. Keeping it here is what let\n * `@viu/emporix-sdk-next` drop its dependency on the React package — it needed\n * these strings, not React.\n *\n * `@viu/emporix-sdk-react` re-exports both from `./storage` and `/ssr`, so\n * existing imports keep working.\n */\n\n/** Keys that participate in {@link EmporixStorage.subscribeAll}. */\nexport type EmporixStorageKey =\n | \"customerToken\"\n | \"cartId\"\n | \"siteCode\"\n | \"language\"\n | \"anonymousSession\"\n | \"activeLegalEntityId\"\n | \"refreshToken\"\n | \"saasToken\";\n\n/**\n * The eight persisted session keys, as the strings each backend actually uses.\n * Same strings on purpose — a value written by one backend must be readable by\n * the next, and the cookie set by a Next `proxy.ts` has to be the one\n * `createCookieStorage` looks for.\n *\n * The `satisfies` is the point, not the deduplication: a ninth\n * {@link EmporixStorageKey} without an entry here is a compile error, and an\n * entry here without a union member is too. `as const` stays in front of it so\n * the literal types survive for consumers.\n */\nexport const STORAGE_KEYS = {\n customerToken: \"emporix.customerToken\",\n cartId: \"emporix.cartId\",\n anonymousSession: \"emporix.anonymousSession\",\n siteCode: \"emporix.siteCode\",\n language: \"emporix.language\",\n activeLegalEntityId: \"emporix.activeLegalEntityId\",\n refreshToken: \"emporix.refreshToken\",\n saasToken: \"emporix.saasToken\",\n} as const satisfies Record<EmporixStorageKey, string>;\n","/**\n * The persisted-session layer: the {@link EmporixStorage} contract and the two\n * framework-free implementations of it that are not browser-specific.\n *\n * It lives in the core SDK for the same reason {@link STORAGE_KEYS} does — none\n * of it is a React concern. A cookie-backed storage fits Next, Remix, SvelteKit,\n * Nitro or a plain Node handler equally, and `@viu/emporix-sdk-next` needed\n * exactly this and nothing else from `@viu/emporix-sdk-react`.\n *\n * `@viu/emporix-sdk-react` re-exports all of it and keeps the browser backends\n * (memory, localStorage, sessionStorage, document.cookie), which genuinely belong\n * there.\n */\nimport { auth, type AuthContext, type StoredAnonymousSession } from \"./auth\";\nimport { STORAGE_KEYS, type EmporixStorageKey } from \"./session-keys\";\n\n/**\n * The subset of an anonymous session a browser storage keeps.\n *\n * Derived from {@link StoredAnonymousSession} rather than re-declared: a server\n * store may additionally persist the access token and its expiry, a browser one\n * deliberately does not (the client is long-lived and holds the token in memory,\n * so writing it would only expose a bearer token to JavaScript).\n */\nexport type PersistedAnonymousSession = Pick<\n StoredAnonymousSession,\n \"refreshToken\" | \"sessionId\"\n>;\n\n/** Pluggable persistence for SDK session state. SSR-safe by default (memory). */\nexport interface EmporixStorage {\n // Customer token (unchanged).\n getCustomerToken(): string | null;\n setCustomerToken(token: string | null): void;\n subscribe?(listener: (token: string | null) => void): () => void;\n\n // Active guest / customer cart id.\n getCartId(): string | null;\n setCartId(id: string | null): void;\n\n // Anonymous session — used by DefaultTokenProvider (via EmporixProvider\n // wiring) to preserve sessionId across page reloads.\n getAnonymousSession(): PersistedAnonymousSession | null;\n setAnonymousSession(session: PersistedAnonymousSession | null): void;\n\n // Active site code (MS-2). `null` = no site bound yet.\n getSiteCode(): string | null;\n setSiteCode(code: string | null): void;\n\n // Active language (Accept-Language). `null` = use the site/tenant default.\n getLanguage(): string | null;\n setLanguage(language: string | null): void;\n\n // Active legal entity id (B2B). `null` = B2C mode.\n getActiveLegalEntityId(): string | null;\n setActiveLegalEntityId(id: string | null): void;\n\n // Refresh token — optional persistence. When absent, B2B company-switch\n // falls back to a local-state-only update (no server-side token rescope).\n getRefreshToken(): string | null;\n setRefreshToken(token: string | null): void;\n\n // SaaS token (the checkout `saas-token` header). Persisted so a logged-in\n // customer can still complete checkout after a page reload — the refresh\n // endpoint does not re-mint it. Optional: a custom adapter may omit these,\n // in which case the saasToken stays in-memory only.\n getSaasToken?(): string | null;\n setSaasToken?(token: string | null): void;\n\n /**\n * Subscribe to any storage write. The listener receives the key that\n * changed. Returns an unsubscribe function. Optional — backends may no-op.\n * Used by the telemetry layer to emit `storage.write` events.\n */\n subscribeAll?(listener: (key: EmporixStorageKey) => void): () => void;\n}\n\n/** Backward-compat alias. New code should prefer {@link EmporixStorage}. */\nexport type TokenStorage = EmporixStorage;\n\n/**\n * Parses a stored anonymous session (from Web Storage or a cookie) into a\n * {@link PersistedAnonymousSession}. Returns `null` for absent, malformed or\n * incomplete values — a half-written session must not become a half-valid one.\n */\nexport function parseAnonymousSession(raw: string | null): PersistedAnonymousSession | null {\n if (raw === null) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<PersistedAnonymousSession>;\n return typeof parsed.refreshToken === \"string\" && typeof parsed.sessionId === \"string\"\n ? { refreshToken: parsed.refreshToken, sessionId: parsed.sessionId }\n : null;\n } catch {\n return null;\n }\n}\n\n/** Backend-agnostic cookie accessor. `set` absent means the storage is read-only. */\nexport interface CookieIo {\n get(name: string): string | null;\n /** `null` deletes the cookie. */\n set?(name: string, value: string | null): void;\n}\n\n/**\n * Builds an {@link EmporixStorage} over a cookie accessor. Contains the whole\n * name-to-accessor mapping so no backend repeats it.\n *\n * `opts.notify` is a callback rather than a flag so this module stays free of\n * listener-set lifetime: the browser backend owns a `createListenerSet`, passes\n * its `notify` here, and attaches `subscribeAll` to the result itself. This\n * function never sets `subscribeAll` — the server backend therefore has none,\n * which is correct: a server render has no lifetime to observe.\n */\nexport function createCookieBackedStorage(\n io: CookieIo,\n opts: { tokenName?: string; notify?: (key: EmporixStorageKey) => void } = {},\n): EmporixStorage {\n const tokenName = opts.tokenName ?? STORAGE_KEYS.customerToken;\n const notify = opts.notify;\n\n // Read-only mode: warn once per key so a genuine bug surfaces, but a render\n // loop cannot flood the log.\n const warned = new Set<EmporixStorageKey>();\n const write = (name: string, value: string | null, key: EmporixStorageKey): void => {\n if (io.set === undefined) {\n if (!warned.has(key)) {\n warned.add(key);\n // eslint-disable-next-line no-console\n console.warn(\n `[emporix] storage is read-only; ignoring write to \"${key}\". ` +\n \"Provide a `set` accessor to enable writes (e.g. from a Server Action).\",\n );\n }\n return;\n }\n io.set(name, value);\n notify?.(key);\n };\n\n return {\n getCustomerToken: () => io.get(tokenName),\n setCustomerToken: (t) => write(tokenName, t, \"customerToken\"),\n\n getCartId: () => io.get(STORAGE_KEYS.cartId),\n setCartId: (id) => write(STORAGE_KEYS.cartId, id, \"cartId\"),\n\n getAnonymousSession: () => parseAnonymousSession(io.get(STORAGE_KEYS.anonymousSession)),\n setAnonymousSession: (s) =>\n write(\n STORAGE_KEYS.anonymousSession,\n s === null\n ? null\n : JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n \"anonymousSession\",\n ),\n\n getSiteCode: () => io.get(STORAGE_KEYS.siteCode),\n setSiteCode: (code) => write(STORAGE_KEYS.siteCode, code, \"siteCode\"),\n\n getLanguage: () => io.get(STORAGE_KEYS.language),\n setLanguage: (l) => write(STORAGE_KEYS.language, l, \"language\"),\n\n getActiveLegalEntityId: () => io.get(STORAGE_KEYS.activeLegalEntityId),\n setActiveLegalEntityId: (id) =>\n write(STORAGE_KEYS.activeLegalEntityId, id, \"activeLegalEntityId\"),\n\n getRefreshToken: () => io.get(STORAGE_KEYS.refreshToken),\n setRefreshToken: (t) => write(STORAGE_KEYS.refreshToken, t, \"refreshToken\"),\n\n getSaasToken: () => io.get(STORAGE_KEYS.saasToken),\n setSaasToken: (t) => write(STORAGE_KEYS.saasToken, t, \"saasToken\"),\n };\n}\n\n/**\n * A synchronous cookie accessor supplied by the caller. Deliberately\n * synchronous: {@link EmporixStorage} is synchronous throughout, so any\n * `await` (e.g. Next's `await cookies()`) belongs to the caller.\n *\n * Omit `set` for a read-only storage. Next.js forbids cookie writes during a\n * Server Component render — only Server Actions and Route Handlers may write.\n */\nexport interface ServerCookieJar {\n get(name: string): string | null;\n /** `null` deletes the cookie. */\n set?(name: string, value: string | null): void;\n}\n\n/**\n * An {@link EmporixStorage} reading (and optionally writing) through a\n * caller-supplied cookie jar — for RSC, Server Actions, Route Handlers, or any\n * other server runtime. No framework import: the jar shape fits Next, Remix,\n * SvelteKit, Nitro or a plain Node handler.\n *\n * `subscribe` / `subscribeAll` are absent: a server render has no lifetime over\n * which to observe changes.\n *\n * ```ts\n * // Next.js Server Component (read-only)\n * const jar = await cookies();\n * const storage = createServerStorage({ get: (n) => jar.get(n)?.value ?? null });\n *\n * // Next.js Server Action (read-write)\n * const jar = await cookies();\n * const storage = createServerStorage({\n * get: (n) => jar.get(n)?.value ?? null,\n * set: (n, v) =>\n * v === null\n * ? jar.delete(n)\n * : jar.set(n, v, { httpOnly: true, sameSite: \"lax\", secure: true, path: \"/\" }),\n * });\n * ```\n */\nexport function createServerStorage(jar: ServerCookieJar): EmporixStorage {\n return createCookieBackedStorage(\n jar.set !== undefined ? { get: jar.get, set: jar.set } : { get: jar.get },\n );\n}\n\n/**\n * Resolves the {@link AuthContext} a server-side read should use, mirroring\n * exactly what the React `useEmporixQuery` resolves on the client: the customer\n * context when a token is stored, anonymous otherwise.\n *\n * Use this rather than hand-rolling it — `authKind` is part of every React-Query\n * key, so a mismatch here produces a silent cache miss (a second fetch after\n * hydration, no error).\n */\nexport function serverAuth(storage: EmporixStorage): AuthContext {\n const token = storage.getCustomerToken();\n return token !== null ? auth.customer(token) : auth.anonymous();\n}\n","/**\n * The browser session-storage backends: memory, localStorage, sessionStorage,\n * document.cookie.\n *\n * The contract and the framework-free backends live in `./session-storage`;\n * these are the ones that need browser globals. They were in\n * `@viu/emporix-sdk-react` until `@viu/emporix-sdk-angular` needed them too —\n * `localStorage` is not a React API, and duplicating a storage backend per\n * binding means two of them writing subtly different values under the same key.\n *\n * Every export is a named factory and the package sets `sideEffects: false`, so\n * a Node consumer that imports none of them bundles none of them. That is\n * asserted by `scripts/check-treeshake.mjs`.\n */\nimport {\n createCookieBackedStorage,\n parseAnonymousSession,\n type EmporixStorage,\n type PersistedAnonymousSession,\n} from \"./session-storage\";\nimport { STORAGE_KEYS, type EmporixStorageKey } from \"./session-keys\";\n\n/**\n * The three methods these backends use from a Web `Storage`.\n *\n * Declared locally on purpose. This package compiles with `lib: [\"ES2022\"]` and\n * no `\"DOM\"` — that is the invariant which keeps the SDK runnable on Node, edge\n * runtimes and workers, and adding DOM to the lib to satisfy this one file would\n * switch that compile-time guard off for all ~60 services. So every browser\n * global below is reached through a narrowed `globalThis` instead of an ambient\n * declaration, which is also the pattern the localStorage and sessionStorage\n * availability checks already used before this code moved here.\n */\nexport interface WebStorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\n/** Narrowed view of the browser globals these backends touch. */\ninterface BrowserGlobals {\n localStorage?: WebStorageLike;\n sessionStorage?: WebStorageLike;\n document?: { cookie: string };\n location?: { protocol: string };\n}\n\nconst browser = globalThis as unknown as BrowserGlobals;\n\n/**\n * Internal: create a swallow-on-throw listener set used by all the storage\n * backends for `subscribeAll`. Centralizes the try/catch wrapper so a buggy\n * telemetry handler never breaks a storage write.\n */\nexport function createListenerSet<T>(): {\n add(l: (value: T) => void): () => void;\n notify(value: T): void;\n} {\n const listeners = new Set<(v: T) => void>();\n return {\n add(l) {\n listeners.add(l);\n return () => listeners.delete(l);\n },\n notify(value) {\n for (const l of listeners) {\n try {\n l(value);\n } catch {\n // Swallow handler errors; telemetry must never break writes.\n }\n }\n },\n };\n}\n\n/** In-memory token store. Default, SSR-safe, no persistence. */\nexport function createMemoryStorage(opts: { initial?: string } = {}): EmporixStorage {\n let token: string | null = opts.initial ?? null;\n let cartId: string | null = null;\n let anon: PersistedAnonymousSession | null = null;\n let siteCode: string | null = null;\n let language: string | null = null;\n let activeLegalEntityId: string | null = null;\n let refreshToken: string | null = null;\n let saasToken: string | null = null;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => token,\n setCustomerToken: (t) => {\n token = t;\n for (const l of tokenListeners) l(token);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => cartId,\n setCartId: (id) => {\n cartId = id;\n all.notify(\"cartId\");\n },\n getAnonymousSession: () => anon,\n setAnonymousSession: (s) => {\n anon = s;\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => siteCode,\n setSiteCode: (code) => {\n siteCode = code;\n all.notify(\"siteCode\");\n },\n getLanguage: () => language,\n setLanguage: (l) => {\n language = l;\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => activeLegalEntityId,\n setActiveLegalEntityId: (id) => {\n activeLegalEntityId = id;\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => refreshToken,\n setRefreshToken: (t) => {\n refreshToken = t;\n all.notify(\"refreshToken\");\n },\n getSaasToken: () => saasToken,\n setSaasToken: (t) => {\n saasToken = t;\n all.notify(\"saasToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n\n/**\n * Internal: build an {@link EmporixStorage} backed by any Web `Storage`\n * instance (`localStorage` or `sessionStorage`). Both share the identical\n * `getItem`/`setItem`/`removeItem` surface, so the 8-key wiring lives here once.\n * Callers own the availability check + memory fallback before delegating.\n */\nexport function fromWebStorage(\n storage: WebStorageLike,\n opts: { key?: string } = {},\n): EmporixStorage {\n const tokenKey = opts.key ?? STORAGE_KEYS.customerToken;\n const tokenListeners = new Set<(t: string | null) => void>();\n const all = createListenerSet<EmporixStorageKey>();\n return {\n getCustomerToken: () => storage.getItem(tokenKey),\n setCustomerToken: (t) => {\n if (t === null) storage.removeItem(tokenKey);\n else storage.setItem(tokenKey, t);\n for (const l of tokenListeners) l(t);\n all.notify(\"customerToken\");\n },\n subscribe: (l) => {\n tokenListeners.add(l);\n return () => tokenListeners.delete(l);\n },\n getCartId: () => storage.getItem(STORAGE_KEYS.cartId),\n setCartId: (id) => {\n if (id === null) storage.removeItem(STORAGE_KEYS.cartId);\n else storage.setItem(STORAGE_KEYS.cartId, id);\n all.notify(\"cartId\");\n },\n getAnonymousSession: () =>\n parseAnonymousSession(storage.getItem(STORAGE_KEYS.anonymousSession)),\n setAnonymousSession: (s) => {\n if (s === null) storage.removeItem(STORAGE_KEYS.anonymousSession);\n else\n storage.setItem(\n STORAGE_KEYS.anonymousSession,\n JSON.stringify({ refreshToken: s.refreshToken, sessionId: s.sessionId }),\n );\n all.notify(\"anonymousSession\");\n },\n getSiteCode: () => storage.getItem(STORAGE_KEYS.siteCode),\n setSiteCode: (code) => {\n if (code === null) storage.removeItem(STORAGE_KEYS.siteCode);\n else storage.setItem(STORAGE_KEYS.siteCode, code);\n all.notify(\"siteCode\");\n },\n getLanguage: () => storage.getItem(STORAGE_KEYS.language),\n setLanguage: (l) => {\n if (l === null) storage.removeItem(STORAGE_KEYS.language);\n else storage.setItem(STORAGE_KEYS.language, l);\n all.notify(\"language\");\n },\n getActiveLegalEntityId: () => storage.getItem(STORAGE_KEYS.activeLegalEntityId),\n setActiveLegalEntityId: (id) => {\n if (id === null) storage.removeItem(STORAGE_KEYS.activeLegalEntityId);\n else storage.setItem(STORAGE_KEYS.activeLegalEntityId, id);\n all.notify(\"activeLegalEntityId\");\n },\n getRefreshToken: () => storage.getItem(STORAGE_KEYS.refreshToken),\n setRefreshToken: (t) => {\n if (t === null) storage.removeItem(STORAGE_KEYS.refreshToken);\n else storage.setItem(STORAGE_KEYS.refreshToken, t);\n all.notify(\"refreshToken\");\n },\n getSaasToken: () => storage.getItem(STORAGE_KEYS.saasToken),\n setSaasToken: (t) => {\n if (t === null) storage.removeItem(STORAGE_KEYS.saasToken);\n else storage.setItem(STORAGE_KEYS.saasToken, t);\n all.notify(\"saasToken\");\n },\n subscribeAll: (l) => all.add(l),\n };\n}\n\n/**\n * Browser `localStorage`-backed store: persistent and shared across tabs.\n * Falls back to memory on the server (or when localStorage is unavailable).\n */\nexport function createLocalStorage(opts: { key?: string } = {}): EmporixStorage {\n const store = browser.localStorage;\n if (store === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] localStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n return fromWebStorage(store, opts);\n}\n\n/** @deprecated Use {@link createLocalStorage}. Kept for backward compatibility. */\nexport const createLocalStorageStorage = createLocalStorage;\n\n/**\n * Browser `sessionStorage`-backed store: per-tab persistence that survives a\n * reload but is cleared when the tab closes and is not shared across tabs.\n * Falls back to memory on the server (or when sessionStorage is unavailable).\n */\nexport function createSessionStorage(opts: { key?: string } = {}): EmporixStorage {\n const store = browser.sessionStorage;\n if (store === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] sessionStorage unavailable; falling back to in-memory storage\");\n return createMemoryStorage();\n }\n return fromWebStorage(store, opts);\n}\n\n/**\n * Cookie-backed store. `Secure` defaults to on for https origins; override\n * with `secure: false` only for non-https dev setups. Consumer must still pick\n * an appropriate `sameSite` for CSRF safety.\n */\nexport function createCookieStorage(\n opts: { name?: string; secure?: boolean; sameSite?: \"lax\" | \"strict\" | \"none\" } = {},\n): EmporixStorage {\n const sameSite = opts.sameSite ?? \"lax\";\n // Default: Secure on https origins. Tokens must not ride plain-http\n // cookies in production; localhost/http dev keeps working without opts.\n const secure = opts.secure ?? browser.location?.protocol === \"https:\";\n const doc = browser.document;\n if (doc === undefined) {\n // eslint-disable-next-line no-console\n console.warn(\"[emporix] document unavailable; cookie storage falling back to in-memory\");\n return createMemoryStorage();\n }\n const attrs = `path=/; SameSite=${sameSite}${secure ? \"; Secure\" : \"\"}`;\n const all = createListenerSet<EmporixStorageKey>();\n const storage = createCookieBackedStorage(\n {\n get: (name) => {\n for (const part of doc.cookie.split(\"; \")) {\n const [k, ...v] = part.split(\"=\");\n if (k === name) return decodeURIComponent(v.join(\"=\")) || null;\n }\n return null;\n },\n set: (name, value) => {\n doc.cookie =\n value === null\n ? `${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; ${attrs}`\n : `${name}=${encodeURIComponent(value)}; ${attrs}`;\n },\n },\n {\n ...(opts.name !== undefined ? { tokenName: opts.name } : {}),\n notify: (key) => all.notify(key),\n },\n );\n return { ...storage, subscribeAll: (l) => all.add(l) };\n}\n","/**\n * The cache-key shape every framework binding shares.\n *\n * Shape: `[\"emporix\", resource, ...args, { tenant, authKind, siteCode?, language? }]`\n *\n * It lives in the core SDK for the same reason {@link STORAGE_KEYS} does: it is\n * not a React concern. `@viu/emporix-sdk-react` and `@viu/emporix-sdk-angular`\n * must produce byte-identical keys or the two bindings, the docs and the\n * devtools all describe different caches. One definition is the only way that\n * holds — a copy per binding would agree on the day it was written and nowhere\n * after.\n *\n * The trailing meta object groups the discriminators that differentiate cache\n * entries across tenants, auth-kinds and (where applicable) active sites.\n * `siteCode` is included only when explicitly passed — non-site-aware reads\n * pass `undefined` and the field is dropped.\n */\nexport function emporixKey<TArgs extends readonly unknown[]>(\n resource: string,\n args: TArgs,\n context: {\n tenant: string;\n authKind: string;\n siteCode?: string | null;\n language?: string | null;\n },\n): readonly [\"emporix\", string, ...TArgs, Record<string, unknown>] {\n const meta: Record<string, unknown> = {\n tenant: context.tenant,\n authKind: context.authKind,\n };\n if (context.siteCode !== undefined) {\n meta.siteCode = context.siteCode;\n }\n if (context.language !== undefined) {\n meta.language = context.language;\n }\n return [\"emporix\", resource, ...args, meta] as const;\n}\n\n/** Which site discriminators go into the query key's meta object. */\nexport type SiteFields = \"full\" | \"language\" | \"none\";\n\n/**\n * Builds the site portion of a query key's meta object. Shared by every read\n * path — React's `useEmporixQuery`, its `prefetchEmporix`, and Angular's\n * `emporixQueryOptions` — so none of them can disagree about which\n * discriminators a resource carries. Key parity is structural, not tested.\n *\n * Note `null` is preserved rather than dropped: an unbound site is a distinct\n * cache identity from a bound one, and {@link emporixKey} only omits a field\n * when it is `undefined`.\n */\nexport function siteMeta(\n site: SiteFields,\n siteCode: string | null,\n language: string | null,\n): { siteCode?: string | null; language?: string | null } {\n return site === \"full\"\n ? { siteCode, language }\n : site === \"language\"\n ? { language }\n : {};\n}\n","/**\n * In-memory customer-session store, keyed by storage instance.\n *\n * Moved out of the React bindings: it is a subscribe/snapshot store over\n * {@link EmporixStorage} with no framework API in it. React consumes it through\n * `useSyncExternalStore`, Angular through a `signal` — the store itself does not\n * know or care, which is exactly why it does not belong in either binding.\n */\nimport type { EmporixStorage } from \"./session-storage\";\n\n/**\n * The three session tokens the customer session tracks. `token` is mirrored\n * from persistent storage; `refreshToken` and `saasToken` are in-memory only\n * (deliberately never persisted).\n */\nexport interface CustomerSessionState {\n token: string | null;\n refreshToken: string | null;\n saasToken: string | null;\n}\n\nexport interface CustomerSessionStore {\n getSnapshot: () => CustomerSessionState;\n setState: (\n next: CustomerSessionState | ((prev: CustomerSessionState) => CustomerSessionState),\n ) => void;\n subscribe: (listener: () => void) => () => void;\n}\n\n// One store per storage instance. The storage object is the stable per-app\n// identity (a WeakMap lets it be GC'd with the app; each test gets a fresh\n// storage → a fresh isolated store).\nconst stores = new WeakMap<EmporixStorage, CustomerSessionStore>();\n\n/**\n * Shared in-memory store for the customer session, keyed by the storage\n * instance. Every consumer reads and writes the same store, so a login in one\n * place (the auth form) is visible in another (the checkout page) — without\n * this, the in-memory `saasToken` lived in a single component's local state and\n * customer checkout would 401 elsewhere.\n */\nexport function getCustomerSessionStore(storage: EmporixStorage): CustomerSessionStore {\n const existing = stores.get(storage);\n if (existing) return existing;\n\n // Re-hydrate from storage so a page reload keeps the full session: `token`\n // and `refreshToken` are persisted by the storage adapter; `saasToken` is\n // too (when the adapter supports it) — the checkout `saas-token` header is\n // needed after a reload and the refresh endpoint cannot re-mint it.\n let state: CustomerSessionState = {\n token: storage.getCustomerToken(),\n refreshToken: storage.getRefreshToken(),\n saasToken: storage.getSaasToken?.() ?? null,\n };\n const listeners = new Set<() => void>();\n const store: CustomerSessionStore = {\n getSnapshot: () => state,\n setState: (next) => {\n const resolved =\n typeof next === \"function\"\n ? (next as (prev: CustomerSessionState) => CustomerSessionState)(state)\n : next;\n if (resolved === state) return;\n state = resolved;\n for (const listener of listeners) listener();\n },\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n // Mirror external token writes (login/logout from any consumer, telemetry-\n // driven flows) into the store, so EVERY subscriber observes token changes.\n // Lifetime: the subscription lives exactly as long as the storage instance\n // that owns this store.\n storage.subscribe?.((t) => {\n store.setState((s) => (s.token === t ? s : { ...s, token: t }));\n });\n stores.set(storage, store);\n return store;\n}\n","/** One Server-Sent Events frame. `data` is the concatenated data lines. */\nexport interface SseEvent {\n event?: string;\n data: string;\n id?: string;\n}\n\n/** Parse one frame (fields separated by \"\\n\"); returns undefined if it has no fields. */\nfunction parseFrame(frame: string): SseEvent | undefined {\n const ev: SseEvent = { data: \"\" };\n const dataLines: string[] = [];\n let saw = false;\n for (const line of frame.split(\"\\n\")) {\n if (line === \"\" || line.startsWith(\":\")) continue; // blank / comment\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1); // strip one leading space\n if (field === \"data\") {\n dataLines.push(value);\n saw = true;\n } else if (field === \"event\") {\n ev.event = value;\n saw = true;\n } else if (field === \"id\") {\n ev.id = value;\n saw = true;\n }\n }\n if (!saw) return undefined;\n ev.data = dataLines.join(\"\\n\");\n return ev;\n}\n\n/**\n * Parse an SSE byte stream (already decoded to text chunks) into events.\n * Buffers across chunk boundaries; frames are separated by a blank line.\n */\nexport async function* parseSseStream(\n chunks: AsyncIterable<string>,\n): AsyncIterable<SseEvent> {\n let buf = \"\";\n for await (const chunk of chunks) {\n buf += chunk.replace(/\\r\\n/g, \"\\n\");\n let idx: number;\n while ((idx = buf.indexOf(\"\\n\\n\")) !== -1) {\n const ev = parseFrame(buf.slice(0, idx));\n buf = buf.slice(idx + 2);\n if (ev) yield ev;\n }\n }\n const tail = parseFrame(buf);\n if (tail) yield tail;\n}\n","import {\n type AuthContext,\n type TokenProvider,\n type CustomerRefreshRegistry,\n resolveToken,\n} from \"./auth\";\nimport { errorFromResponse, EmporixTimeoutError, EmporixNetworkError } from \"./errors\";\nimport type { Logger } from \"./logger\";\nimport { parseSseStream, type SseEvent } from \"./sse\";\n\n/** A single HTTP request through the SDK. */\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthContext;\n /**\n * Query parameters. Booleans are serialized with `String(v)`, so a facade can\n * pass one straight through instead of stringifying it at the call site.\n */\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** Extra request headers (merged before auth; cannot override Authorization). */\n headers?: Record<string, string>;\n /** Per-request abort timeout override (ms). */\n timeoutMs?: number;\n /**\n * Marks this request as safe to retry on 5xx/429 despite a non-idempotent\n * method. GET/PUT/DELETE retry by default; POST/PATCH only with this flag\n * (a 5xx can arrive after the server already committed — retrying e.g.\n * placeOrder would duplicate the order/charge).\n */\n idempotent?: boolean;\n}\n\n/**\n * A successful response: the parsed body plus its headers.\n *\n * `Headers` rather than the whole `Response` on purpose — by the time this\n * returns, the body has been consumed, and a `Response` whose body cannot be\n * read again is a trap in a caller's hands.\n */\nexport interface HttpResult<T> {\n data: T;\n headers: Headers;\n}\n\n/** Construction options for {@link HttpClient}. */\nexport interface HttpClientOptions {\n host: string;\n /**\n * Tenant, emitted as `Emporix-Tenant` on every request.\n *\n * The tenant is already in the path of nearly every endpoint, so this looks\n * redundant — it is not. Emporix validates dashboard/IAM user tokens against\n * this header and answers 401 without it, even when `Authorization` is\n * correct. `@emporix/api-calls`, the client library the Management Dashboard\n * itself uses, sets it whenever a tenant is known.\n *\n * Optional so a bare `new HttpClient(...)` stays constructible; every client\n * built through `createCore` passes it.\n */\n tenant?: string;\n provider: TokenProvider;\n logger: Logger;\n retry: { maxAttempts: number };\n timeouts: { connectMs: number; readMs: number };\n /** Override the retry backoff delay (ms → Promise). Defaults to a real timer. */\n sleep?: (ms: number) => Promise<void>;\n /** Opt-in customer-token refresher registry (off unless a refresher is set). */\n customerRefresh?: CustomerRefreshRegistry;\n /**\n * Shared storefront request context. When `language` is set, every request\n * carries `Accept-Language: <language>`. Mutated at runtime via\n * `EmporixClient.setStorefrontContext({ language })`.\n */\n requestContext?: { language?: string | undefined };\n /**\n * Sent as `Content-Language` on every request that carries a body — see\n * `EmporixConfig.contentLanguage`. Reads and bodiless requests never get it.\n */\n contentLanguage?: string;\n /**\n * Replaces the global `fetch` for API requests. Not used by token requests\n * (`core/auth.ts`) or by {@link HttpClient.stream} — see `EmporixConfig.fetch`.\n */\n fetch?: typeof globalThis.fetch;\n}\n\nlet requestSeq = 0;\n\nfunction safeJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\n/** Fetch wrapper: auth resolution, JSON parsing, typed error mapping, logging. */\nexport class HttpClient {\n private readonly sleep: (ms: number) => Promise<void>;\n /** Resolved request fetch. The arrow keeps `globalThis.fetch` correctly bound. */\n private readonly doFetch: typeof globalThis.fetch;\n constructor(private readonly opts: HttpClientOptions) {\n this.sleep =\n opts.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n this.doFetch = opts.fetch ?? ((...args) => globalThis.fetch(...args));\n }\n\n private buildHeaders(\n o: RequestOptions,\n token: string,\n isFormData: boolean,\n ): Record<string, string> {\n return {\n // Before `o.headers` on purpose: a caller may override the tenant for a\n // single request, the way `Accept-Language` and `Content-Language` can be\n // overridden. Only `Authorization` is non-negotiable.\n ...(this.opts.tenant !== undefined ? { \"Emporix-Tenant\": this.opts.tenant } : {}),\n ...(this.opts.requestContext?.language\n ? { \"Accept-Language\": this.opts.requestContext.language }\n : {}),\n ...(this.opts.contentLanguage && o.body !== undefined\n ? { \"Content-Language\": this.opts.contentLanguage }\n : {}),\n ...(o.headers ?? {}),\n Authorization: `Bearer ${token}`,\n // JSON bodies: set Content-Type. FormData bodies: let `fetch`\n // emit `multipart/form-data; boundary=...` itself.\n ...(o.body !== undefined && !isFormData\n ? { \"Content-Type\": \"application/json\" }\n : {}),\n };\n }\n\n /**\n * Issues a request and returns the parsed body. Retries 5xx/429 on idempotent\n * methods and re-auths once on a 401 — see {@link send}.\n */\n async request<T = unknown>(o: RequestOptions): Promise<T> {\n return (await this.send<T>(o)).data;\n }\n\n /**\n * Like {@link request}, but also hands back the response headers.\n *\n * Emporix puts pagination metadata there — `X-Total-Count` and, on the schema\n * service's custom instances, `X-Next-Cursor` / `X-Prev-Cursor`. Facades\n * should reach for `core/paged.ts`'s `requestPage` rather than calling this\n * directly; it exists for metadata that does not fit the paginated shape.\n */\n async requestWithMeta<T = unknown>(o: RequestOptions): Promise<HttpResult<T>> {\n return this.send<T>(o);\n }\n\n private async send<T>(o: RequestOptions): Promise<HttpResult<T>> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const sdkManaged = o.auth.kind === \"service\" || o.auth.kind === \"anonymous\";\n const maxAttempts = this.opts.retry.maxAttempts;\n let reauthed = false;\n let customerToken = o.auth.kind === \"customer\" ? o.auth.token : undefined;\n let customerReauthed = false;\n\n for (let attempt = 1; ; attempt++) {\n const token = customerToken ?? (await resolveToken(o.auth, this.opts.provider));\n log.debug(\"http request\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n attempt,\n });\n\n const controller = new AbortController();\n const overallMs = o.timeoutMs ?? this.opts.timeouts.readMs;\n // connectMs bounds time-to-headers (fetch resolving); the overall budget\n // bounds headers + body. timeoutMs overrides the overall budget only.\n const connectMs = Math.min(this.opts.timeouts.connectMs, overallMs);\n const timeoutMsg = `${o.method} ${o.path} timed out after ${overallMs}ms (connect budget ${connectMs}ms)`;\n let connectTimer: ReturnType<typeof setTimeout> | undefined;\n let overallTimer: ReturnType<typeof setTimeout> | undefined;\n // The overall budget is a rejecting promise raced against fetch + the\n // body read, not just an abort. An abort interrupts the connection but\n // does NOT reliably unblock an already-streaming body that stalls\n // mid-read — racing the timer guarantees the read is bounded regardless.\n const overallBudget = new Promise<never>((_, reject) => {\n overallTimer = setTimeout(() => {\n controller.abort();\n reject(new EmporixTimeoutError(timeoutMsg));\n }, overallMs);\n });\n connectTimer = setTimeout(() => controller.abort(), connectMs);\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: this.buildHeaders(o, token, isFormData),\n signal: controller.signal,\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n let res: Response;\n let text: string;\n try {\n res = await Promise.race([this.doFetch(url, init), overallBudget]);\n // Headers are in — the connect budget no longer applies; the body\n // read stays bounded by the overall budget timer.\n clearTimeout(connectTimer);\n connectTimer = undefined;\n const body = res.text();\n // Swallow a late body rejection if the budget timer wins the race,\n // so it doesn't surface as an unhandled rejection.\n body.catch(() => {});\n text = await Promise.race([body, overallBudget]);\n } catch (err) {\n if (err instanceof EmporixTimeoutError) throw err;\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(timeoutMsg);\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n } finally {\n if (connectTimer !== undefined) clearTimeout(connectTimer);\n if (overallTimer !== undefined) clearTimeout(overallTimer);\n }\n const parsed = text ? safeJson(text) : undefined;\n if (res.ok) {\n log.debug(\"http ok\", { status: res.status });\n return { data: parsed as T, headers: res.headers };\n }\n\n // 401 asymmetry.\n if (res.status === 401) {\n if (sdkManaged && !reauthed) {\n reauthed = true;\n if (o.auth.kind === \"service\") {\n this.opts.provider.invalidate?.(o.auth.credentials ?? \"backend\");\n } else if (this.opts.provider.expireAnonymous) {\n // Keep the refresh token so the retry refreshes (same sessionId)\n // instead of starting a new anonymous session.\n this.opts.provider.expireAnonymous();\n } else {\n this.opts.provider.invalidateAnonymous?.();\n }\n log.warn(\"sdk-managed 401, re-authing once\", { authKind: o.auth.kind });\n continue;\n }\n if (\n o.auth.kind === \"customer\" &&\n !customerReauthed &&\n this.opts.customerRefresh?.enabled\n ) {\n customerReauthed = true;\n const fresh = await this.opts.customerRefresh.refresh(customerToken!);\n if (fresh) {\n customerToken = fresh;\n log.warn(\"customer 401, refreshed once\", { authKind: o.auth.kind });\n continue;\n }\n }\n throw errorFromResponse(res.status, `${o.method} ${o.path} → 401`, parsed);\n }\n\n // Retry 5xx / 429 — gated on idempotency: a 5xx can arrive AFTER the\n // server committed the write (e.g. placeOrder), so replaying a POST\n // could duplicate orders/charges. GET/PUT/DELETE are idempotent by\n // spec; POST/PATCH retry only when the caller opts in.\n const idempotent =\n o.method === \"GET\" ||\n o.method === \"PUT\" ||\n o.method === \"DELETE\" ||\n o.idempotent === true;\n const retryable = idempotent && (res.status >= 500 || res.status === 429);\n if (retryable && attempt < maxAttempts) {\n // headers.get() yields null when absent — Number(null) is 0, which\n // would short-circuit the exponential branch into a 0ms instant\n // retry. Only a non-empty header value counts.\n const retryAfterHeader = res.headers.get(\"Retry-After\");\n const retryAfter = retryAfterHeader ? Number(retryAfterHeader) : Number.NaN;\n const backoff =\n Number.isFinite(retryAfter) && retryAfter >= 0\n ? Math.min(retryAfter * 1000, 8000) // cap rogue Retry-After (e.g. 86400)\n : Math.min(1000 * 2 ** (attempt - 1), 8000) + Math.random() * 100;\n log.warn(\"retryable failure\", { status: res.status, attempt, backoffMs: backoff });\n await this.sleep(backoff);\n continue;\n }\n\n log.error(\"http error (final)\", { status: res.status, attempt });\n throw errorFromResponse(res.status, `${o.method} ${o.path} → ${res.status}`, parsed);\n }\n }\n\n /**\n * Single-shot fetch that returns the raw {@link Response} unparsed. Used by\n * endpoints whose responses are not JSON (binary downloads, redirect-only\n * endpoints). Skips the retry-on-5xx and 401-reauth-once paths intentionally\n * — those depend on parsing the JSON error body, which a raw consumer must\n * handle itself if needed. Auth resolution + timeout + logging are still\n * applied.\n *\n * `extra.redirect` is forwarded to `fetch` so callers can use `'manual'` to\n * capture 30x responses with their `Location` header (Node fetch exposes\n * the header in this mode; browser fetch returns an opaque response).\n */\n async requestRaw(\n o: RequestOptions,\n extra?: { redirect?: \"follow\" | \"manual\" | \"error\" },\n ): Promise<Response> {\n const requestId = `req-${++requestSeq}`;\n const log = this.opts.logger.child({ requestId });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const token = await resolveToken(o.auth, this.opts.provider);\n log.debug(\"http requestRaw\", {\n authKind: o.auth.kind,\n method: o.method,\n url: url.pathname,\n redirect: extra?.redirect ?? \"follow\",\n });\n const controller = new AbortController();\n const timer = setTimeout(\n () => controller.abort(),\n o.timeoutMs ?? this.opts.timeouts.readMs,\n );\n const isFormData =\n typeof FormData !== \"undefined\" && o.body instanceof FormData;\n const init: RequestInit = {\n method: o.method,\n headers: this.buildHeaders(o, token, isFormData),\n signal: controller.signal,\n ...(extra?.redirect ? { redirect: extra.redirect } : {}),\n };\n if (o.body !== undefined) {\n init.body = isFormData ? (o.body as FormData) : JSON.stringify(o.body);\n }\n try {\n return await this.doFetch(url, init);\n } catch (err) {\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(\n `${o.method} ${o.path} timed out after ${o.timeoutMs ?? this.opts.timeouts.readMs}ms`,\n );\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n /**\n * Open a Server-Sent Events stream (`text/event-stream`) and yield parsed\n * events. Unlike {@link request}, no overall read budget applies (streams are\n * long-lived) — only `connectMs` bounds time-to-headers, and the consumer\n * breaking the iterator aborts the fetch. Like {@link requestRaw}, it does\n * NOT retry or re-auth on 401; a non-2xx maps to a typed error before the\n * stream begins.\n */\n async *requestStream(o: RequestOptions): AsyncIterable<SseEvent> {\n const log = this.opts.logger.child({ requestId: `req-${++requestSeq}` });\n const url = new URL(this.opts.host + o.path);\n for (const [k, v] of Object.entries(o.query ?? {})) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n const token = await resolveToken(o.auth, this.opts.provider);\n const controller = new AbortController();\n const connectTimer = setTimeout(() => controller.abort(), this.opts.timeouts.connectMs);\n const headers = this.buildHeaders(o, token, false);\n headers[\"Accept\"] = \"text/event-stream\";\n let res: Response;\n try {\n res = await fetch(url, {\n method: o.method,\n headers,\n signal: controller.signal,\n ...(o.body !== undefined ? { body: JSON.stringify(o.body) } : {}),\n });\n } catch (err) {\n clearTimeout(connectTimer);\n if ((err as Error).name === \"AbortError\") {\n throw new EmporixTimeoutError(`${o.method} ${o.path} timed out opening stream`);\n }\n throw new EmporixNetworkError(\n `${o.method} ${o.path} network failure: ${(err as Error).message}`,\n );\n }\n clearTimeout(connectTimer);\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw errorFromResponse(\n res.status,\n `${o.method} ${o.path} → ${res.status}`,\n text ? safeJson(text) : undefined,\n );\n }\n log.debug(\"http stream open\", { status: res.status });\n if (!res.body) return;\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n async function* readChunks(): AsyncIterable<string> {\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n yield decoder.decode(value, { stream: true });\n }\n } finally {\n controller.abort(); // cancel the fetch if the consumer breaks early\n }\n }\n yield* parseSseStream(readChunks());\n }\n}\n","{\n \"name\": \"@viu/emporix-sdk\",\n \"version\": \"4.6.1\",\n \"description\": \"TypeScript SDK for the Emporix Commerce Engine\",\n \"license\": \"MIT\",\n \"author\": {\n \"name\": \"viu\",\n \"url\": \"https://github.com/viuteam\"\n },\n \"homepage\": \"https://github.com/viuteam/emporix-sdk#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/viuteam/emporix-sdk.git\",\n \"directory\": \"packages/sdk\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/viuteam/emporix-sdk/issues\"\n },\n \"keywords\": [\n \"emporix\",\n \"ecommerce\",\n \"commerce\",\n \"sdk\",\n \"typescript\",\n \"storefront\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./customer\": {\n \"types\": \"./dist/customer.d.ts\",\n \"import\": \"./dist/customer.js\",\n \"require\": \"./dist/customer.cjs\"\n },\n \"./product\": {\n \"types\": \"./dist/product.d.ts\",\n \"import\": \"./dist/product.js\",\n \"require\": \"./dist/product.cjs\"\n },\n \"./category\": {\n \"types\": \"./dist/category.d.ts\",\n \"import\": \"./dist/category.js\",\n \"require\": \"./dist/category.cjs\"\n },\n \"./cart\": {\n \"types\": \"./dist/cart.d.ts\",\n \"import\": \"./dist/cart.js\",\n \"require\": \"./dist/cart.cjs\"\n },\n \"./checkout\": {\n \"types\": \"./dist/checkout.d.ts\",\n \"import\": \"./dist/checkout.js\",\n \"require\": \"./dist/checkout.cjs\"\n },\n \"./payment\": {\n \"types\": \"./dist/payment.d.ts\",\n \"import\": \"./dist/payment.js\",\n \"require\": \"./dist/payment.cjs\"\n },\n \"./price\": {\n \"types\": \"./dist/price.d.ts\",\n \"import\": \"./dist/price.js\",\n \"require\": \"./dist/price.cjs\"\n },\n \"./media\": {\n \"types\": \"./dist/media.d.ts\",\n \"import\": \"./dist/media.js\",\n \"require\": \"./dist/media.cjs\"\n },\n \"./segment\": {\n \"types\": \"./dist/segment.d.ts\",\n \"import\": \"./dist/segment.js\",\n \"require\": \"./dist/segment.cjs\"\n },\n \"./companies\": {\n \"types\": \"./dist/companies.d.ts\",\n \"import\": \"./dist/companies.js\",\n \"require\": \"./dist/companies.cjs\"\n },\n \"./contacts\": {\n \"types\": \"./dist/contacts.d.ts\",\n \"import\": \"./dist/contacts.js\",\n \"require\": \"./dist/contacts.cjs\"\n },\n \"./locations\": {\n \"types\": \"./dist/locations.d.ts\",\n \"import\": \"./dist/locations.js\",\n \"require\": \"./dist/locations.cjs\"\n },\n \"./customer-groups\": {\n \"types\": \"./dist/customer-groups.d.ts\",\n \"import\": \"./dist/customer-groups.js\",\n \"require\": \"./dist/customer-groups.cjs\"\n },\n \"./orders\": {\n \"types\": \"./dist/orders.d.ts\",\n \"import\": \"./dist/orders.js\",\n \"require\": \"./dist/orders.cjs\"\n },\n \"./availability\": {\n \"types\": \"./dist/availability.d.ts\",\n \"import\": \"./dist/availability.js\",\n \"require\": \"./dist/availability.cjs\"\n }\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run --coverage\",\n \"lint\": \"eslint src\",\n \"typecheck\": \"tsc --noEmit\",\n \"check:treeshake\": \"node scripts/check-treeshake.mjs\",\n \"fetch:specs\": \"tsx scripts/fetch-specs.ts\",\n \"generate\": \"tsx scripts/generate.ts\"\n },\n \"devDependencies\": {\n \"@hey-api/openapi-ts\": \"^0.97.3\",\n \"@types/node\": \"^24.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^8.0.0\",\n \"@typescript-eslint/parser\": \"^8.0.0\",\n \"@vitest/coverage-v8\": \"^4.1.11\",\n \"eslint\": \"^9.0.0\",\n \"msw\": \"^2.4.0\",\n \"prettier\": \"^3.3.0\",\n \"tsup\": \"^8.2.0\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^4.1.11\"\n }\n}\n","import { version } from \"../package.json\";\n\n/**\n * The published `@viu/emporix-sdk` version, surfaced on every log line as\n * `sdkVersion`. Read from `package.json` so it always matches the released\n * package; esbuild inlines the literal at build time (browser-safe — no\n * runtime filesystem access).\n */\nexport const SDK_VERSION: string = version;\n","import { validateConfig, type EmporixConfig, type ResolvedConfig } from \"./config\";\nimport {\n DefaultTokenProvider,\n CustomerRefreshRegistry,\n type TokenProvider,\n type CustomerTokenRefresher,\n} from \"./auth\";\nimport { HttpClient } from \"./http\";\nimport {\n LevelResolver,\n createConsoleLogger,\n createNoopLogger,\n type Logger,\n type LogLevel,\n type ServiceName,\n type LoggerObjectConfig,\n} from \"./logger\";\nimport type { ClientContext } from \"./context\";\nimport { SDK_VERSION } from \"../version\";\n\n/** The service-agnostic core shared by `EmporixClient` and `createEmporixClient`. */\nexport interface EmporixCore {\n readonly tenant: string;\n readonly config: ResolvedConfig;\n readonly tokenProvider: TokenProvider;\n setStorefrontContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n language?: string;\n }): void;\n setLogLevel(level: LogLevel, opts?: { service?: ServiceName; force?: boolean }): void;\n getLogLevel(service: ServiceName): LogLevel;\n setCustomerTokenRefresher(refresher: CustomerTokenRefresher | null): void;\n /** Internal: builds a per-service ClientContext (logger child + HttpClient). */\n mk(service: ServiceName): ClientContext;\n}\n\n/** Validates config and assembles the shared infrastructure (no services). */\nexport function createCore(config: EmporixConfig): EmporixCore {\n const cfg = validateConfig(config);\n\n let loggerObj: LoggerObjectConfig = {};\n let baseLogger: Logger | undefined;\n if (cfg.logger === false) {\n baseLogger = createNoopLogger();\n } else if (cfg.logger && typeof (cfg.logger as Logger).child === \"function\") {\n baseLogger = cfg.logger as Logger;\n } else if (cfg.logger) {\n loggerObj = cfg.logger as LoggerObjectConfig;\n }\n const resolver = new LevelResolver(loggerObj);\n const root =\n baseLogger ??\n createConsoleLogger(resolver, {\n sdk: \"emporix\",\n sdkVersion: SDK_VERSION,\n tenant: cfg.tenant,\n });\n\n const tokenProvider: TokenProvider = cfg.tokenProvider ?? new DefaultTokenProvider(cfg);\n const customerRefresh = new CustomerRefreshRegistry();\n const requestContext: { language?: string | undefined } = {\n language: cfg.credentials.storefront?.context?.language,\n };\n\n const mk = (service: ServiceName): ClientContext => ({\n tenant: cfg.tenant,\n tokenProvider,\n logger: root.child({ service }),\n http: new HttpClient({\n host: cfg.host,\n tenant: cfg.tenant,\n provider: tokenProvider,\n logger: root.child({ service: \"http\" }),\n retry: cfg.retry,\n timeouts: cfg.timeouts,\n customerRefresh,\n requestContext,\n // exactOptionalPropertyTypes: `{ fetch: undefined }` is a type error\n // against `fetch?: typeof globalThis.fetch`, so spread conditionally.\n ...(cfg.fetch !== undefined ? { fetch: cfg.fetch } : {}),\n ...(cfg.contentLanguage !== undefined ? { contentLanguage: cfg.contentLanguage } : {}),\n }),\n });\n\n return {\n tenant: cfg.tenant,\n config: cfg,\n tokenProvider,\n mk,\n setStorefrontContext(ctx) {\n if (ctx.language !== undefined) {\n requestContext.language = ctx.language || undefined;\n }\n const { language: _language, ...priceContext } = ctx;\n if (Object.keys(priceContext).length > 0) {\n tokenProvider.setAnonymousContext?.(priceContext);\n }\n },\n setLogLevel(level, opts = {}) {\n resolver.set(level, opts.service, opts.force ?? false);\n },\n getLogLevel(service) {\n return resolver.get(service);\n },\n setCustomerTokenRefresher(refresher) {\n customerRefresh.set(refresher);\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport type {\n Site,\n SiteInput,\n SiteCreated,\n SiteMixin,\n SiteMixins,\n SiteMixinCreated,\n} from \"./site-types\";\n\nexport type {\n Site,\n SiteAddress,\n SiteHomeBase,\n SiteInput,\n SiteCreated,\n SiteMixin,\n SiteMixins,\n SiteMixinCreated,\n} from \"./site-types\";\n\nconst ANON: AuthContext = auth.anonymous();\nconst SERVICE: AuthContext = auth.service();\n\n/**\n * Read-only access to the tenant's site catalog. List returns active sites\n * visible to the storefront context (the `site_manage` scope is only needed\n * to read inactive sites).\n */\nexport class SiteService {\n static readonly channel = \"site\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Lists active sites. */\n async list(authCtx: AuthContext = ANON): Promise<Site[]> {\n return this.ctx.http.request<Site[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites`,\n auth: authCtx,\n });\n }\n\n /** Retrieves one site by code. */\n async get(code: string, authCtx: AuthContext = ANON): Promise<Site> {\n return this.ctx.http.request<Site>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${code}`,\n auth: authCtx,\n });\n }\n\n /**\n * Returns the tenant's default site (the one with `default: true`).\n * Throws if no default is configured — a tenant should always have one.\n */\n async current(authCtx: AuthContext = ANON): Promise<Site> {\n const sites = await this.list(authCtx);\n const def = sites.find((s) => s.default);\n if (!def) {\n throw new Error(\n `SiteService.current: no default site for tenant \"${this.ctx.tenant}\"`,\n );\n }\n return def;\n }\n\n /** Lists just the tenant's site codes (`GET /siteslist`). Default auth: anonymous. */\n async listCodes(authCtx: AuthContext = ANON): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/siteslist`,\n auth: authCtx,\n });\n }\n\n // --- Admin writes. Default auth: service. ---\n\n /** Creates a site (`POST /sites`). Default auth: service. */\n async create(input: SiteInput, authCtx: AuthContext = SERVICE): Promise<SiteCreated> {\n return this.ctx.http.request<SiteCreated>({\n method: \"POST\",\n path: `/site/${this.ctx.tenant}/sites`,\n body: input,\n auth: authCtx,\n });\n }\n\n /**\n * Partially updates a site (`PATCH /sites/{siteCode}`). The endpoint responds\n * 200 without a defined body, so nothing is returned — re-read with\n * {@link get} when the updated site is needed. Default auth: service.\n */\n async update(siteCode: string, input: SiteInput, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n body: input,\n auth: authCtx,\n });\n }\n\n /**\n * Full-replaces a site (`PUT /sites/{siteCode}`). Like {@link update} it\n * returns nothing (200 with no defined body). `options.expand` is forwarded as\n * a query parameter. Default auth: service.\n */\n async replace(\n siteCode: string,\n input: SiteInput,\n options: { expand?: string } = {},\n authCtx: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n ...(options.expand === undefined ? {} : { query: { expand: options.expand } }),\n body: input,\n auth: authCtx,\n });\n }\n\n /** Deletes a site (`DELETE /sites/{siteCode}`). Default auth: service. */\n async delete(siteCode: string, authCtx: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}`,\n auth: authCtx,\n });\n }\n\n /**\n * Site mixins (`/sites/{siteCode}/mixins`). Mixin content is an open map —\n * the spec defines no structure. Reads default to anonymous, writes to\n * service auth.\n */\n readonly mixins = {\n /** All mixin groups of a site, as a map of group name to content. */\n list: async (siteCode: string, authCtx: AuthContext = ANON): Promise<SiteMixins> =>\n this.ctx.http.request<SiteMixins>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins`,\n auth: authCtx,\n }),\n\n /** One mixin group's content by name. */\n get: async (siteCode: string, mixinName: string, authCtx: AuthContext = ANON): Promise<SiteMixin> =>\n this.ctx.http.request<SiteMixin>({\n method: \"GET\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n auth: authCtx,\n }),\n\n /** Adds a mixin to a site. Default auth: service. */\n create: async (\n siteCode: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<SiteMixinCreated> =>\n this.ctx.http.request<SiteMixinCreated>({\n method: \"POST\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins`,\n body: input,\n auth: authCtx,\n }),\n\n /**\n * Partially updates a mixin (PATCH). Responds 200 without a defined body,\n * so nothing is returned. Default auth: service.\n */\n update: async (\n siteCode: string,\n mixinName: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n body: input,\n auth: authCtx,\n });\n },\n\n /** Full-replaces a mixin (PUT). Returns nothing, like {@link update}. Default auth: service. */\n replace: async (\n siteCode: string,\n mixinName: string,\n input: SiteMixin,\n authCtx: AuthContext = SERVICE,\n ): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n body: input,\n auth: authCtx,\n });\n },\n\n /** Removes a mixin from a site. Default auth: service. */\n delete: async (siteCode: string, mixinName: string, authCtx: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/site/${this.ctx.tenant}/sites/${siteCode}/mixins/${mixinName}`,\n auth: authCtx,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\nimport type {\n SessionContext,\n SessionContextPatch,\n SessionAttributeInput,\n} from \"./session-context-types\";\n\nexport type {\n SessionContext,\n SessionContextPatch,\n SessionContextData,\n SessionAttributeInput,\n} from \"./session-context-types\";\n\nconst ANON: AuthContext = auth.anonymous();\n\n/**\n * Session-context binding for the current storefront session. Every method here\n * hits a `/me/context` path, so the session-id comes from the `Authorization`\n * token — no path or query parameter required.\n *\n * **The service's other half is intentionally not wrapped.** Emporix also exposes\n * the same four operations addressed by an explicit session id —\n * `GET`/`PUT /{sessionId}/context`, `POST`/`DELETE` on its attributes. Those are\n * administrative: they let a caller read and rewrite *someone else's* session,\n * which is not a storefront capability and needs a service token. Wrapping them\n * here would put an admin surface on the object a storefront holds. If you need\n * them, build the request directly — the generated types are in\n * `../generated/session-context`.\n */\nexport class SessionContextService {\n static readonly channel = \"session-context\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /**\n * Retrieves the current session context, or `null` when the server returns\n * 404 (no session exists yet — the session-context is created server-side\n * only after the user creates a cart).\n */\n async get(authCtx: AuthContext = ANON): Promise<SessionContext | null> {\n try {\n return await this.ctx.http.request<SessionContext>({\n method: \"GET\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n auth: authCtx,\n });\n } catch (err) {\n if (isNotFound(err)) return null;\n throw err;\n }\n }\n\n /**\n * Partially updates the current session context. Returns `true` when the\n * PATCH was applied, `false` when there is no session context yet (the\n * server returned 404 on the version-lookup GET, so there is nothing to\n * update). Non-404 errors propagate.\n */\n async patch(input: SessionContextPatch, authCtx: AuthContext = ANON): Promise<boolean> {\n let version = input.version;\n if (version === undefined) {\n const current = await this.get(authCtx);\n if (current === null) return false;\n version = current.metadata?.version;\n if (version === undefined) {\n throw new Error(\n \"SessionContextService.patch: no metadata.version in server response\",\n );\n }\n }\n const { version: _v, ...fields } = input;\n void _v;\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `/session-context/${this.ctx.tenant}/me/context`,\n body: {\n ...fields,\n metadata: { version },\n },\n auth: authCtx,\n });\n return true;\n }\n\n /** Adds an attribute to the current session context. Default auth: anonymous. */\n async addAttribute(\n attribute: SessionAttributeInput,\n authCtx: AuthContext = ANON,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `/session-context/${this.ctx.tenant}/me/context/attributes`,\n body: attribute,\n auth: authCtx,\n });\n }\n\n /** Removes a named attribute from the current session context. Default auth: anonymous. */\n async removeAttribute(name: string, authCtx: AuthContext = ANON): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `/session-context/${this.ctx.tenant}/me/context/attributes/${encodeURIComponent(name)}`,\n auth: authCtx,\n });\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n if (err && typeof err === \"object\") {\n const status = (err as { status?: unknown }).status;\n if (typeof status === \"number\" && status === 404) return true;\n }\n return false;\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Configuration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nexport type { Configuration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Tenant-wide configuration (`/configuration/{tenant}/configurations`).\n * Requires the backend-only `configuration.configuration_view` /\n * `configuration.configuration_manage` scopes — default auth: service.\n * Server-side use only; the service token must never reach a browser.\n */\nexport class TenantConfigService {\n static readonly channel = \"configuration\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/configuration/${this.ctx.tenant}/configurations`;\n }\n\n /** List tenant configurations, optionally filtered by `keys`. */\n async list(opts: ListConfigOptions = {}, auth: AuthContext = SERVICE): Promise<Configuration[]> {\n const query = opts.keys && opts.keys.length > 0 ? { keys: opts.keys.join(\",\") } : undefined;\n return this.ctx.http.request<Configuration[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieve one tenant configuration by key. */\n async get<T = unknown>(key: string, auth: AuthContext = SERVICE): Promise<Configuration<T>> {\n return this.ctx.http.request<Configuration<T>>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /** Create one or more tenant configurations (array in, array out). */\n async create(drafts: ConfigurationDraft[], auth: AuthContext = SERVICE): Promise<Configuration[]> {\n return this.ctx.http.request<Configuration[]>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: drafts,\n });\n }\n\n /** Update one tenant configuration by key. */\n async update<T = unknown>(\n key: string,\n draft: ConfigurationDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<Configuration<T>> {\n return this.ctx.http.request<Configuration<T>>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete one tenant configuration by key. */\n async delete(key: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /**\n * List the platform-wide global configurations\n * (`GET /global-configurations`) — a separate resource from the tenant's own\n * `/configurations`.\n */\n async listGlobal<T = unknown>(auth: AuthContext = SERVICE): Promise<Configuration<T>[]> {\n return this.ctx.http.request<Configuration<T>[]>({\n method: \"GET\",\n path: `/configuration/${this.ctx.tenant}/global-configurations`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { ClientConfiguration, ConfigurationDraft, ListConfigOptions } from \"./configuration-types\";\n\nexport type { ClientConfiguration } from \"./configuration-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Per-client configuration (`/configuration/{tenant}/clients/{client}/configurations`).\n * Requires the backend-only `configuration.configuration_view` /\n * `configuration.configuration_manage` scopes — default auth: service.\n * Server-side use only; the service token must never reach a browser.\n * The `client` arg is injected into each write body so callers don't repeat it.\n */\nexport class ClientConfigService {\n static readonly channel = \"configuration\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(client: string): string {\n return `/configuration/${this.ctx.tenant}/clients/${encodeURIComponent(client)}/configurations`;\n }\n\n /** List a client's configurations, optionally filtered by `keys`. */\n async list(\n client: string,\n opts: ListConfigOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration[]> {\n const query = opts.keys && opts.keys.length > 0 ? { keys: opts.keys.join(\",\") } : undefined;\n return this.ctx.http.request<ClientConfiguration[]>({\n method: \"GET\",\n path: this.base(client),\n auth,\n ...(query ? { query } : {}),\n });\n }\n\n /** Retrieve one client configuration by key. */\n async get<T = unknown>(\n client: string,\n key: string,\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration<T>> {\n return this.ctx.http.request<ClientConfiguration<T>>({\n method: \"GET\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /** Create one or more client configurations. Injects `client` into each item. */\n async create(\n client: string,\n drafts: ConfigurationDraft[],\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration[]> {\n const body = drafts.map((d) => ({ ...d, client }));\n return this.ctx.http.request<ClientConfiguration[]>({\n method: \"POST\",\n path: this.base(client),\n auth,\n body,\n });\n }\n\n /** Update one client configuration by key. Injects `client` into the body. */\n async update<T = unknown>(\n client: string,\n key: string,\n draft: ConfigurationDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<ClientConfiguration<T>> {\n return this.ctx.http.request<ClientConfiguration<T>>({\n method: \"PUT\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n body: { ...draft, client },\n });\n }\n\n /** Delete one client configuration by key. */\n async delete(client: string, key: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base(client)}/${encodeURIComponent(key)}`,\n auth,\n });\n }\n\n /**\n * List the client ids that have configurations (`GET /clients`). Note this\n * targets `/configuration/{tenant}/clients` directly — the private `base`\n * helper appends `/configurations` for a specific client.\n */\n async listClients(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `/configuration/${this.ctx.tenant}/clients`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\n\n/** A single shopping-list line item. */\nexport interface ShoppingListItem {\n id?: number;\n productId: string;\n quantity: number;\n cuttingOption?: string;\n servicePackagingOption?: string;\n comment?: string;\n mixins?: Record<string, unknown>;\n}\n\n/** A shopping list, normalized from the per-customer wire envelope. */\nexport interface ShoppingList {\n key: string;\n name: string;\n items: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\n/** Input for create / replace. */\nexport interface ShoppingListDraft {\n name: string;\n items?: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n}\n\ninterface WireList {\n name?: string;\n items?: ShoppingListItem[];\n mixins?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nconst RESERVED = new Set([\"customerId\", \"metadata\"]);\n\n/** One per-customer wire envelope (`{ customerId, <listKey>: {…} }`) as a list array. */\nfunction toLists(env: Record<string, unknown>): ShoppingList[] {\n const out: ShoppingList[] = [];\n for (const [key, value] of Object.entries(env)) {\n if (RESERVED.has(key) || value === null || typeof value !== \"object\") continue;\n const v = value as WireList;\n out.push({\n key,\n name: v.name ?? key,\n items: v.items ?? [],\n ...(v.mixins ? { mixins: v.mixins } : {}),\n ...(v.metadata ? { metadata: v.metadata } : {}),\n });\n }\n return out;\n}\n\n/**\n * Per-customer shopping lists (`/shoppinglist/{tenant}/shopping-lists`).\n * `auth` is required: a customer token manages the caller's own lists;\n * a service token (employee scope) can act on any `customerId`. The Emporix\n * API has no item-level CRUD, so `addItem`/`removeItem`/`setItemQuantity`\n * read the list and `PUT` the full body — **last-write-wins**.\n */\nexport class ShoppingListService {\n static readonly channel = \"shopping-list\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/shoppinglist/${this.ctx.tenant}/shopping-lists`;\n }\n\n /**\n * The caller's lists, normalized to an array. With employee scope Emporix\n * returns **every customer's** lists and ignores `name` — read one customer's\n * with {@link getForCustomer} instead.\n */\n async list(auth: AuthContext, opts: { name?: string } = {}): Promise<ShoppingList[]> {\n const envelopes = await this.ctx.http.request<Array<Record<string, unknown>>>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n return (envelopes ?? []).flatMap(toLists);\n }\n\n /**\n * One customer's lists (`GET /shopping-lists/{customerId}`), normalized to an\n * array — the employee read; `name` narrows it to one list.\n */\n async getForCustomer(customerId: string, auth: AuthContext, opts: { name?: string } = {}): Promise<ShoppingList[]> {\n const envelope = await this.ctx.http.request<Record<string, unknown>>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n return envelope ? toLists(envelope) : [];\n }\n\n /** Create a list; returns the new list id. */\n async create(draft: ShoppingListDraft, auth: AuthContext): Promise<{ id: string }> {\n return this.ctx.http.request<{ id: string }>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /** Replace the named list (low-level PUT). */\n async replace(customerId: string, draft: ShoppingListDraft, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete the named list, or all the customer's lists when `name` is omitted. */\n async delete(customerId: string, auth: AuthContext, opts: { name?: string } = {}): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(customerId)}`,\n auth,\n ...(opts.name ? { query: { name: opts.name } } : {}),\n });\n }\n\n private async loadList(customerId: string, listName: string, auth: AuthContext): Promise<ShoppingList> {\n // A service token reads the target customer's lists: through `list()` it\n // would get every customer's, with `name` ignored, and the first match\n // could belong to someone else — whose items would then be written here.\n const lists =\n auth.kind === \"service\"\n ? await this.getForCustomer(customerId, auth, { name: listName })\n : await this.list(auth, { name: listName });\n const found = lists.find((l) => l.name === listName);\n if (!found) throw new EmporixNotFoundError(`Shopping list \"${listName}\" not found`, 404);\n return found;\n }\n\n private async put(customerId: string, list: ShoppingList, items: ShoppingListItem[], auth: AuthContext): Promise<void> {\n await this.replace(\n customerId,\n { name: list.name, items, ...(list.mixins ? { mixins: list.mixins } : {}) },\n auth,\n );\n }\n\n /** Add/replace an item by `productId` (read-modify-write, last-write-wins). */\n async addItem(customerId: string, listName: string, item: ShoppingListItem, auth: AuthContext): Promise<void> {\n const list = await this.loadList(customerId, listName, auth);\n const items = [...list.items.filter((i) => i.productId !== item.productId), item];\n await this.put(customerId, list, items, auth);\n }\n\n /** Remove an item by `productId` (no-op if absent). */\n async removeItem(customerId: string, listName: string, productId: string, auth: AuthContext): Promise<void> {\n const list = await this.loadList(customerId, listName, auth);\n const items = list.items.filter((i) => i.productId !== productId);\n await this.put(customerId, list, items, auth);\n }\n\n /** Set an item's quantity; `quantity <= 0` removes it. Adds the item if absent. */\n async setItemQuantity(customerId: string, listName: string, productId: string, quantity: number, auth: AuthContext): Promise<void> {\n if (quantity <= 0) return this.removeItem(customerId, listName, productId, auth);\n const list = await this.loadList(customerId, listName, auth);\n let items = list.items.map((i) => (i.productId === productId ? { ...i, quantity } : i));\n if (!items.some((i) => i.productId === productId)) items = [...items, { productId, quantity }];\n await this.put(customerId, list, items, auth);\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { MetadataFilter, RagType } from \"./ai-rag-indexer-types\";\n\nexport type { MetadataFilter, RagType } from \"./ai-rag-indexer-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * AI RAG Indexer (`/ai-rag-indexer/{tenant}/{type}`). Read which fields the RAG\n * index embeds / can filter on, and trigger a full asynchronous rebuild.\n *\n * Requires the backend-only `ai.agent_read` (reads) / `ai.agent_manage`\n * (`reindex`) scopes — default auth: service. **Server-side use only**; the\n * service token must never reach a browser.\n *\n * Quirks: only `PRODUCT` exists today (the `type` arg defaults to it);\n * `reindex` is a **full** rebuild (no delta), runs **asynchronously**, returns\n * `204` once *scheduled* (not on completion), has **no status endpoint** to\n * poll, and is costly — call it sparingly. The set of embedded fields is\n * configured in the AI Service, not here.\n */\nexport class RagIndexerService {\n static readonly channel = \"ai-rag-indexer\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(type: RagType): string {\n return `/ai-rag-indexer/${this.ctx.tenant}/${encodeURIComponent(type)}`;\n }\n\n /** The indexable embedding field names for `type` (default `\"PRODUCT\"`). */\n async ragMetadata(type: RagType = \"PRODUCT\", auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `${this.base(type)}/rag-metadata`,\n auth,\n });\n }\n\n /** The filterable metadata fields for `type` (default `\"PRODUCT\"`). */\n async filterMetadata(\n type: RagType = \"PRODUCT\",\n auth: AuthContext = SERVICE,\n ): Promise<MetadataFilter[]> {\n return this.ctx.http.request<MetadataFilter[]>({\n method: \"GET\",\n path: `${this.base(type)}/filter-metadata`,\n auth,\n });\n }\n\n /**\n * Schedule a full asynchronous re-index for `type` (default `\"PRODUCT\"`).\n * Resolves once the rebuild is *scheduled* (HTTP 204); there is no progress\n * to await or poll. Costly — avoid calling on a hot path.\n * @deprecated since 2026-06-18, removal 2026-12-01 — use the indexing service:\n * `client.indexing.createReindexJob({ entityType: \"PRODUCT\", rag: true })`.\n */\n async reindex(type: RagType = \"PRODUCT\", auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base(type)}/reindex`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n SequenceSchema,\n SequenceSchemaCreate,\n NextIdCommandRequest,\n NextIdResponse,\n NextIdOptions,\n NextIdsBatchRequest,\n NextIdsBatchResponse,\n} from \"./sequential-id-types\";\n\nexport type {\n SequenceSchema,\n SequenceSchemaCreate,\n NextIdCommandRequest,\n NextIdResponse,\n NextIdOptions,\n BatchNextIdEntry,\n NextIdsBatchRequest,\n NextIdsBatchResponse,\n} from \"./sequential-id-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Sequential ID Service (`/sequential-id/{tenant}/…`): server-managed,\n * gap-free sequential identifiers (order/invoice numbers, etc.) driven by\n * tenant-defined sequence schemas.\n *\n * Requires the backend-only `sequentialid.schema_view` (read + next-id) /\n * `sequentialid.schema_manage` (CRUD + set-active) scopes — default auth:\n * service. Server-side use only; the service token must never reach a browser.\n *\n * Schemas are immutable upstream (no PATCH/PUT): to change one, `deleteSchema`\n * then `createSchema`. The `maxValue` is a hard cap with no auto-reset, and\n * only one schema may be active per type.\n */\nexport class SequentialIdService {\n static readonly channel = \"sequential-id\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/sequential-id/${this.ctx.tenant}/schemas`;\n }\n\n /** List all sequence schemas for the tenant. */\n async listSchemas(auth: AuthContext = SERVICE): Promise<SequenceSchema[]> {\n return this.ctx.http.request<SequenceSchema[]>({\n method: \"GET\",\n path: this.base(),\n auth,\n });\n }\n\n /** Retrieve one sequence schema by id. */\n async getSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}`,\n auth,\n });\n }\n\n /** Create a sequence schema. Schemas are immutable — there is no update. */\n async createSchema(\n schema: SequenceSchemaCreate,\n auth: AuthContext = SERVICE,\n ): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: schema,\n });\n }\n\n /** Delete a sequence schema by id. */\n async deleteSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}`,\n auth,\n });\n }\n\n /** Mark a schema active for its type (only one schema may be active per type). */\n async setActiveSchema(schemaId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/${encodeURIComponent(schemaId)}/setActive`,\n auth,\n });\n }\n\n /** Get the active schema for a given schema type. */\n async listSchemasByType(schemaType: string, auth: AuthContext = SERVICE): Promise<SequenceSchema> {\n return this.ctx.http.request<SequenceSchema>({\n method: \"GET\",\n path: `${this.base()}/types/${encodeURIComponent(schemaType)}`,\n auth,\n });\n }\n\n /**\n * Generate the next id for a schema type. `body` carries an optional\n * `sequenceKey` (independent sub-pool counter) and `placeholders`.\n * `opts.siteCode` derives time/country placeholders from the site's settings.\n */\n async nextId(\n schemaType: string,\n body: NextIdCommandRequest = {},\n opts: NextIdOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<NextIdResponse> {\n const query = opts.siteCode ? { siteCode: opts.siteCode } : undefined;\n return this.ctx.http.request<NextIdResponse>({\n method: \"POST\",\n path: `${this.base()}/types/${encodeURIComponent(schemaType)}/nextId`,\n auth,\n body,\n ...(query ? { query } : {}),\n });\n }\n\n /**\n * Generate next ids for multiple schema types in one call. NOTE: the batch\n * endpoint path omits the `{tenant}` segment — the service derives the\n * tenant from the token.\n */\n async nextIdsBatch(\n req: NextIdsBatchRequest,\n auth: AuthContext = SERVICE,\n ): Promise<NextIdsBatchResponse> {\n return this.ctx.http.request<NextIdsBatchResponse>({\n method: \"POST\",\n path: `/sequential-id/sequenceSchemaBatch/nextIds`,\n auth,\n body: req,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { splitQuery } from \"../core/search\";\nimport type {\n Fee,\n ItemFee,\n FeeDraft,\n ItemFeeDraft,\n ItemFeeSearch,\n ItemFeeSearchByProductId,\n ItemFeeSearchByProductIds,\n ListFeesQuery,\n SetItemFeesOptions,\n} from \"./fee-types\";\n\nexport type {\n Fee,\n ItemFee,\n FeeDraft,\n ItemFeeDraft,\n ItemFeeSearch,\n ItemFeeSearchByProductId,\n ItemFeeSearchByProductIds,\n ListFeesQuery,\n SetItemFeesOptions,\n} from \"./fee-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Fee Service (`/fee/{tenant}/…`): fee definitions plus the\n * item/product mappings that attach them. Writes require a backend-only scope\n * (`fee.fee_*` / `fee.item_*`); GETs need a token but no scope. Default auth:\n * service. Server-side use only — the service token must never reach a browser.\n *\n * Quirks (server behavior, not handled here): a payment-type fee's `code` must\n * equal the payment-mode code or the fee is silently ignored; a wrong/missing\n * `siteCode` filters to an empty array rather than erroring; an expired\n * `activeTimespan` silently disables the fee; `setItemFees`/`setProductFees`\n * replace the whole mapping unless `partial` is set.\n */\nexport class FeeService {\n static readonly channel = \"fee\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private feesBase(): string {\n return `/fee/${this.ctx.tenant}/fees`;\n }\n\n private itemFeesBase(): string {\n return `/fee/${this.ctx.tenant}/itemFees`;\n }\n\n private productFeesBase(): string {\n return `/fee/${this.ctx.tenant}/productFees`;\n }\n\n // --- Fee definitions ---\n\n /**\n * List fee definitions, wrapped in the shared {@link PaginatedItems}\n * envelope (same heuristic as `media.list`: `hasNextPage` is true when the\n * returned page is full). Defaults match Emporix server defaults\n * (`pageNumber: 1`, `pageSize: 60`).\n */\n async list(query: ListFeesQuery = {}, auth: AuthContext = SERVICE): Promise<PaginatedItems<Fee>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // Destructured out because the rest is spread into the query string — see\n // `media.list` for the same note.\n const { totalCount, ...rest } = query;\n return requestPage<Fee>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.feesBase(),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /** Retrieve one fee definition by id. */\n async get(id: string, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"GET\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a fee definition. */\n async create(draft: FeeDraft, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"POST\",\n path: this.feesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Update a fee definition by id. */\n async update(id: string, draft: FeeDraft, auth: AuthContext = SERVICE): Promise<Fee> {\n return this.ctx.http.request<Fee>({\n method: \"PUT\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a fee definition by id. */\n async delete(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.feesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n // --- Item-fee mappings ---\n\n /** List all item-fee mappings. */\n async listItemFees(auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: this.itemFeesBase(),\n auth,\n });\n }\n\n /** Fee mappings for one item YRN. */\n async getItemFees(itemYrn: string, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`,\n auth,\n });\n }\n\n /** Create an item-fee mapping. */\n async createItemFee(draft: ItemFeeDraft, auth: AuthContext = SERVICE): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"POST\",\n path: this.itemFeesBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Set the fee list for an item YRN. Destructive replace by default; pass\n * `{ partial: true }` to merge (`?partial=true`).\n */\n async setItemFees(\n itemYrn: string,\n feeIds: string[],\n opts: SetItemFeesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"PUT\",\n path: `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`,\n auth,\n body: { feeIds },\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /**\n * Delete item-fee mappings for a YRN. Without `feeId`, removes all mappings\n * for the YRN; with `feeId`, removes that single fee from the mapping.\n */\n async deleteItemFees(itemYrn: string, feeId?: string, auth: AuthContext = SERVICE): Promise<void> {\n const base = `${this.itemFeesBase()}/${encodeURIComponent(itemYrn)}/fees`;\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: feeId ? `${base}/${encodeURIComponent(feeId)}` : base,\n auth,\n });\n }\n\n /** Search item-fee mappings by item YRNs + site. */\n async searchItemFees(search: ItemFeeSearch, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/search`,\n auth,\n body: search,\n });\n }\n\n // --- Product-fee mappings ---\n\n /** Fee mappings for a product id. */\n async getProductFees(productId: string, auth: AuthContext = SERVICE): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"GET\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n });\n }\n\n /**\n * Set the fee list for a product id. Destructive replace by default; pass\n * `{ partial: true }` to merge (`?partial=true`).\n */\n async setProductFees(\n productId: string,\n feeIds: string[],\n opts: SetItemFeesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee> {\n return this.ctx.http.request<ItemFee>({\n method: \"PUT\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n body: { feeIds },\n ...(opts.partial ? { query: { partial: \"true\" } } : {}),\n });\n }\n\n /** Delete all fee mappings for a product id. */\n async deleteProductFees(productId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees`,\n auth,\n });\n }\n\n /**\n * Removes **one** fee from a product\n * (`DELETE /productFees/{productId}/fees/{feeId}`). Use\n * {@link deleteProductFees} to clear every fee of a product.\n */\n async deleteProductFee(\n productId: string,\n feeId: string,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.productFeesBase()}/${encodeURIComponent(productId)}/fees/${encodeURIComponent(feeId)}`,\n auth,\n });\n }\n\n /**\n * Finds item fees for one product across several sites\n * (`POST /itemFees/searchByProductId`).\n */\n async searchItemFeesByProductId(\n search: ItemFeeSearchByProductId,\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/searchByProductId`,\n auth,\n body: search,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Finds item fees for several products on one site\n * (`POST /itemFees/searchByProductIds`). Note the upstream asymmetry:\n * `productIds` is a comma-separated **string** and `siteCode` is singular.\n * `siteFallback` goes in the query string, everything else in the body.\n */\n async searchItemFeesByProductIds(\n search: ItemFeeSearchByProductIds,\n auth: AuthContext = SERVICE,\n ): Promise<ItemFee[]> {\n return this.ctx.http.request<ItemFee[]>({\n method: \"POST\",\n path: `${this.itemFeesBase()}/searchByProductIds`,\n auth,\n ...splitQuery(search, [\"siteFallback\"]),\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport { auth, type AuthContext } from \"../core/auth\";\n\n/** Options for {@link CloudFunctionsService.invoke}. */\nexport interface InvokeCloudFunctionOptions<TReq = unknown> {\n /** HTTP method. Default: \"POST\" (the canonical invoke). */\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n /** Optional sub-path the function exposes (leading slash optional). */\n path?: string;\n /** Request body (arbitrary JSON). */\n body?: TReq;\n /** Query-string params. */\n query?: Record<string, string | number | undefined>;\n /** Extra request headers (Content-Type: application/json is the default). */\n headers?: Record<string, string>;\n}\n\n/**\n * Invokes Emporix-hosted cloud functions. Request/response shapes are\n * caller-defined (generic) — there is no schema. Auth may be service,\n * customer, anonymous, or raw; the default is anonymous.\n */\nexport class CloudFunctionsService {\n static readonly channel = \"cloud-functions\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/cloud-functions/${this.ctx.tenant}/functions`;\n }\n\n async invoke<TRes = unknown, TReq = unknown>(\n functionId: string,\n options: InvokeCloudFunctionOptions<TReq> = {},\n authCtx: AuthContext = auth.anonymous(),\n ): Promise<TRes> {\n const sub = options.path ? `/${options.path.replace(/^\\//, \"\")}` : \"\";\n return this.ctx.http.request<TRes>({\n method: options.method ?? \"POST\",\n path: `${this.base()}/${functionId}${sub}`,\n auth: authCtx,\n ...(options.body !== undefined ? { body: options.body } : {}),\n ...(options.query ? { query: options.query } : {}),\n ...(options.headers ? { headers: options.headers } : {}),\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n WebhookSubscription,\n WebhookSubscriptionUpdateItem,\n WebhookSubscriptionUpdateResultItem,\n WebhookConfig,\n WebhookConfigDraft,\n WebhookConfigPatch,\n WebhookConfigCreated,\n WebhookStatistics,\n WebhookDashboardAccess,\n WebhookStatisticsQuery,\n DeleteConfigOptions,\n} from \"./webhook-types\";\n\nexport type {\n WebhookSubscription,\n WebhookSubscriptionUpdateItem,\n WebhookSubscriptionUpdateResultItem,\n WebhookConfig,\n WebhookConfigDraft,\n WebhookConfigPatch,\n WebhookConfigCreated,\n WebhookStatistics,\n WebhookDashboardAccess,\n WebhookStatisticsQuery,\n DeleteConfigOptions,\n} from \"./webhook-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Webhook administration (`/webhook/{tenant}/…`): the event-subscription\n * catalog and batch toggle, delivery-config CRUD, statistics, and Svix\n * dashboard access. Requires the backend-only `webhook.subscription_read` /\n * `webhook.subscription_manage` scopes — default auth: service. Server-side\n * use only; the service token must never reach a browser.\n */\nexport class WebhookService {\n static readonly channel = \"webhook\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/webhook/${this.ctx.tenant}`;\n }\n\n /** List the event-subscription catalog with each event's on/off state. */\n async listEventSubscriptions(auth: AuthContext = SERVICE): Promise<WebhookSubscription[]> {\n return this.ctx.http.request<WebhookSubscription[]>({\n method: \"GET\",\n path: `${this.base()}/event-subscriptions`,\n auth,\n });\n }\n\n /**\n * Batch subscribe/unsubscribe events. Returns the **207** per-item result\n * array verbatim — the batch can partially fail, so inspect each element's\n * `code`/`status` (e.g. `results.filter(r => (r.code ?? 0) >= 400)`). Does\n * NOT throw on a 207 with failed items; only a non-2xx HTTP status throws.\n */\n async updateEventSubscriptions(\n items: WebhookSubscriptionUpdateItem[],\n auth: AuthContext = SERVICE,\n ): Promise<WebhookSubscriptionUpdateResultItem[]> {\n return this.ctx.http.request<WebhookSubscriptionUpdateResultItem[]>({\n method: \"PATCH\",\n path: `${this.base()}/event-subscriptions`,\n auth,\n body: items,\n });\n }\n\n /** List delivery configurations. */\n async listConfigs(auth: AuthContext = SERVICE): Promise<WebhookConfig[]> {\n return this.ctx.http.request<WebhookConfig[]>({\n method: \"GET\",\n path: `${this.base()}/config`,\n auth,\n });\n }\n\n /** Retrieve one delivery configuration by code. */\n async getConfig(code: string, auth: AuthContext = SERVICE): Promise<WebhookConfig> {\n return this.ctx.http.request<WebhookConfig>({\n method: \"GET\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a delivery configuration. Returns the server-assigned `{ code }`. */\n async createConfig(\n draft: WebhookConfigDraft,\n auth: AuthContext = SERVICE,\n ): Promise<WebhookConfigCreated> {\n return this.ctx.http.request<WebhookConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/config`,\n auth,\n body: draft,\n });\n }\n\n /** Replace a delivery configuration by code (204). */\n async replaceConfig(\n code: string,\n draft: WebhookConfigDraft,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Partially update a delivery configuration by code (204). The body is an\n * **array** of `{ op, path, value }` operations (UPSERT / REMOVE).\n */\n async patchConfig(\n code: string,\n patches: WebhookConfigPatch[],\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n body: patches,\n });\n }\n\n /**\n * Delete a delivery configuration by code. Pass `{ force: true }` to delete\n * the currently-active config (the server otherwise rejects it).\n */\n async deleteConfig(\n code: string,\n opts: DeleteConfigOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/config/${encodeURIComponent(code)}`,\n auth,\n ...(opts.force === true ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /** Read delivery statistics over an optional `YYYY-MM` range. */\n async getStatistics(\n query: WebhookStatisticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<WebhookStatistics> {\n const q: Record<string, string> = {};\n if (query.fromYearMonth) q.fromYearMonth = query.fromYearMonth;\n if (query.toYearMonth) q.toYearMonth = query.toYearMonth;\n return this.ctx.http.request<WebhookStatistics>({\n method: \"GET\",\n path: `${this.base()}/statistics`,\n auth,\n ...(Object.keys(q).length > 0 ? { query: q } : {}),\n });\n }\n\n /** Obtain Svix dashboard access (URL / token). */\n async getDashboardAccess(auth: AuthContext = SERVICE): Promise<WebhookDashboardAccess> {\n return this.ctx.http.request<WebhookDashboardAccess>({\n method: \"GET\",\n path: `${this.base()}/dashboard-access`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Schema,\n SchemaDraft,\n SchemaUpdate,\n SchemaTypeName,\n ListSchemasQuery,\n CustomEntity,\n CustomEntityDraft,\n CustomInstance,\n CustomInstanceDraft,\n ListInstancesQuery,\n ListCustomEntitiesOptions,\n InstanceSearchBody,\n SearchInstancesQuery,\n BulkPatchInstanceItem,\n BulkInstanceResult,\n SchemaReference,\n SchemaReferenceInput,\n SchemaReferenceUpdateInput,\n SchemaReferenceCreated,\n SchemaInstanceBulkCreateItem,\n SchemaInstanceBulkUpsertItem,\n SchemaExport,\n SchemaImportInput,\n ListSchemaReferencesQuery,\n} from \"./schema-types\";\n\nexport type {\n Schema,\n SchemaAttribute,\n SchemaTypeName,\n SchemaDraft,\n SchemaUpdate,\n CustomEntity,\n CustomInstance,\n CustomEntityDraft,\n CustomInstanceDraft,\n ListSchemasQuery,\n ListInstancesQuery,\n ListCustomEntitiesOptions,\n InstanceSearchBody,\n SearchInstancesQuery,\n BulkPatchInstanceItem,\n BulkInstanceResult,\n SchemaReference,\n SchemaReferenceInput,\n SchemaReferenceUpdateInput,\n SchemaReferenceCreated,\n SchemaInstanceBulkCreateItem,\n SchemaInstanceBulkUpsertItem,\n SchemaExport,\n SchemaImportInput,\n ListSchemaReferencesQuery,\n} from \"./schema-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** Passes a `Blob` through; serializes a plain object into a JSON blob. */\nfunction toJsonBlob(file: Blob | Record<string, unknown>): Blob {\n return file instanceof Blob\n ? file\n : new Blob([JSON.stringify(file)], { type: \"application/json\" });\n}\n\n/**\n * Schema Service (`/schema/{tenant}/…`): schemas, entity types, custom\n * entities and their instances. Requires the backend-only `schema.schema_*`\n * / `schema.custominstance_*` scopes — default auth: service. Server-side use\n * only; the service token must never reach a browser.\n */\nexport class SchemaService {\n static readonly channel = \"schema\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private schemasBase(): string {\n return `/schema/${this.ctx.tenant}/schemas`;\n }\n\n private entitiesBase(): string {\n return `/schema/${this.ctx.tenant}/custom-entities`;\n }\n\n private instancesBase(type: string): string {\n return `${this.entitiesBase()}/${encodeURIComponent(type)}/instances`;\n }\n\n private referencesBase(): string {\n return `/schema/${this.ctx.tenant}/references`;\n }\n\n // --- (A) Schemas ---------------------------------------------------------\n\n /**\n * List schemas, wrapped in the shared {@link PaginatedItems} envelope.\n * `hasNextPage` is the standard SDK heuristic (`items.length === pageSize`).\n * Pagination defaults match the rest of the SDK (`pageNumber: 1`,\n * `pageSize: 60`).\n */\n async listSchemas(\n query: ListSchemasQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<Schema>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.q) q.q = query.q;\n if (query.type) q.type = query.type;\n return requestPage<Schema>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.schemasBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Retrieve one schema by id. */\n async getSchema(id: string, auth: AuthContext = SERVICE): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"GET\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a schema. */\n async createSchema(draft: SchemaDraft, auth: AuthContext = SERVICE): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"POST\",\n path: this.schemasBase(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Update a schema. The upstream API requires `draft.metadata.version`; a\n * stale version yields 409 Conflict (propagated as the standard conflict\n * error).\n */\n async updateSchema(\n id: string,\n draft: SchemaUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"PUT\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a schema by id. */\n async deleteSchema(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Validate a schema document without persisting it (`POST /schemas/file`).\n * Returns the server's validation result verbatim.\n */\n async validateSchemaFile<R = unknown>(\n body: SchemaDraft,\n auth: AuthContext = SERVICE,\n ): Promise<R> {\n return this.ctx.http.request<R>({\n method: \"POST\",\n path: `${this.schemasBase()}/file`,\n auth,\n body,\n });\n }\n\n // --- (B) Types -----------------------------------------------------------\n\n /** List entity types that currently have at least one schema. */\n async listTypes(auth: AuthContext = SERVICE): Promise<SchemaTypeName[]> {\n return this.ctx.http.request<SchemaTypeName[]>({\n method: \"GET\",\n path: `/schema/${this.ctx.tenant}/types`,\n auth,\n });\n }\n\n /** Set the entity types a schema applies to (`PUT /schemas/{id}/types`). */\n async setSchemaTypes(\n id: string,\n types: SchemaTypeName[],\n auth: AuthContext = SERVICE,\n ): Promise<Schema> {\n return this.ctx.http.request<Schema>({\n method: \"PUT\",\n path: `${this.schemasBase()}/${encodeURIComponent(id)}/types`,\n auth,\n body: { types },\n });\n }\n\n // --- (C) Custom entities -------------------------------------------------\n\n /** List custom-entity definitions. `expandSchemas` inlines each schema body. */\n async listCustomEntities(\n opts: ListCustomEntitiesOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntity[]> {\n return this.ctx.http.request<CustomEntity[]>({\n method: \"GET\",\n path: this.entitiesBase(),\n auth,\n ...(opts.expandSchemas ? { query: { expandSchemas: \"true\" } } : {}),\n });\n }\n\n /** Retrieve one custom-entity definition by id. */\n async getCustomEntity(id: string, auth: AuthContext = SERVICE): Promise<CustomEntity> {\n return this.ctx.http.request<CustomEntity>({\n method: \"GET\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create a custom-entity definition. */\n async createCustomEntity(\n draft: CustomEntityDraft,\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntity> {\n return this.ctx.http.request<CustomEntity>({\n method: \"POST\",\n path: this.entitiesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Update a custom-entity definition. */\n async updateCustomEntity(\n id: string,\n draft: CustomEntityDraft,\n auth: AuthContext = SERVICE,\n ): Promise<CustomEntity> {\n return this.ctx.http.request<CustomEntity>({\n method: \"PUT\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /**\n * Delete a custom-entity definition. The server rejects with 409 if\n * instances or schemas still reference it (propagated as the standard\n * conflict error).\n */\n async deleteCustomEntity(id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.entitiesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n // --- (D) Custom instances ------------------------------------------------\n\n /**\n * List a custom entity's instances, wrapped in {@link PaginatedItems}.\n * `type` is the custom-entity type and is always the first argument.\n */\n async listInstances<T = Record<string, unknown>>(\n type: string,\n query: ListInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<CustomInstance<T>>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n // `totalCount` is an SDK-side flag, not an Emporix query parameter — it\n // becomes a request header in requestPage. Sending it in the query too\n // would be a stray `?totalCount=true` on every call.\n const { totalCount, ...rest } = query;\n return requestPage<CustomInstance<T>>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.instancesBase(type),\n auth,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n /**\n * Async-iterates every instance of a type.\n *\n * Not built on `iterateAll`: that helper drives pagination by page number, and\n * the server ignores `pageNumber` the moment a cursor is in play. This follows\n * `nextCursor` while the server offers one and falls back to `pageNumber + 1`\n * when it does not — so it is correct whether or not the tenant's deployment\n * emits cursor headers on a request that carries no cursor.\n */\n async *listAllInstances<T = Record<string, unknown>>(\n type: string,\n // Takes the full query type rather than an `Omit<…>`: `ListInstancesQuery`\n // has an index signature, so `Omit` would not actually forbid `next` — it\n // would only look like it did. The overrides below win regardless.\n query: ListInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): AsyncIterable<CustomInstance<T>> {\n let cursor: string | undefined;\n let pageNumber = 1;\n for (;;) {\n const page = await this.listInstances<T>(\n type,\n { ...query, pageNumber, ...(cursor === undefined ? {} : { next: cursor }) },\n auth,\n );\n for (const item of page.items) yield item;\n if (!page.hasNextPage) return;\n cursor = page.nextCursor;\n // Only advances while there is no cursor. Once cursor mode takes over the\n // server ignores pageNumber anyway, so leaving it pinned keeps the two\n // modes from interfering.\n if (cursor === undefined) pageNumber += 1;\n }\n }\n\n /** Retrieve one instance by id. */\n async getInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"GET\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create an instance of a custom entity. */\n async createInstance<T = Record<string, unknown>>(\n type: string,\n draft: CustomInstanceDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"POST\",\n path: this.instancesBase(type),\n auth,\n body: draft,\n });\n }\n\n /** Replace an instance (full `PUT`). */\n async replaceInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n draft: CustomInstanceDraft<T>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"PUT\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n body: draft,\n });\n }\n\n /** Partially update an instance (`PATCH`). */\n async patchInstance<T = Record<string, unknown>>(\n type: string,\n id: string,\n patch: Partial<CustomInstanceDraft<T>>,\n auth: AuthContext = SERVICE,\n ): Promise<CustomInstance<T>> {\n return this.ctx.http.request<CustomInstance<T>>({\n method: \"PATCH\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n body: patch,\n });\n }\n\n /**\n * Patch up to 200 custom instances of `type` in one call\n * (`PATCH /custom-entities/{type}/instances/bulk`). Returns a 207 envelope:\n * a per-item result array — a 207 is success, individual failures live in\n * each item's `code`/`status`.\n */\n async bulkPatchInstances(\n type: string,\n items: BulkPatchInstanceItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"PATCH\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Create multiple instances in one request\n * (`POST /custom-entities/{type}/instances/bulk`). Returns a 207 envelope:\n * a per-item result array — a 207 is success, individual failures live in\n * each item's `code`/`status`.\n */\n async bulkCreateInstances(\n type: string,\n items: SchemaInstanceBulkCreateItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"POST\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Upsert multiple instances in one request\n * (`PUT /custom-entities/{type}/instances/bulk`). Each item carries its `id`.\n * Returns the same 207 per-item envelope as {@link bulkCreateInstances}.\n */\n async bulkUpsertInstances(\n type: string,\n items: SchemaInstanceBulkUpsertItem[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"PUT\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: items,\n });\n }\n\n /**\n * Delete multiple instances by id\n * (`DELETE /custom-entities/{type}/instances/bulk`). Returns the same 207\n * per-item envelope as {@link bulkCreateInstances}.\n *\n * **Note:** the OpenAPI schema declares no request body for this operation,\n * but its description mandates one — \"The IDs of items should be defined in\n * the request body as an array of strings\" (example\n * `[\"firstId\", \"secondId\"]`). The SDK follows the description and sends the\n * id array. Unverified against the live API.\n */\n async bulkDeleteInstances(\n type: string,\n ids: string[],\n auth: AuthContext = SERVICE,\n ): Promise<BulkInstanceResult> {\n return this.ctx.http.request<BulkInstanceResult>({\n method: \"DELETE\",\n path: `${this.instancesBase(type)}/bulk`,\n auth,\n body: ids,\n });\n }\n\n /**\n * Export custom entities and their schemas\n * (`POST /custom-entities/export`). Pass the entity types to include; the\n * result carries a base64 `data` payload plus `exportedAt`.\n */\n async exportCustomEntities(types: string[], auth: AuthContext = SERVICE): Promise<SchemaExport> {\n return this.ctx.http.request<SchemaExport>({\n method: \"POST\",\n path: `${this.entitiesBase()}/export`,\n auth,\n body: types,\n });\n }\n\n /**\n * Import custom entities and their schemas\n * (`POST /custom-entities/import`) from the base64 `data` produced by\n * {@link exportCustomEntities}.\n */\n async importCustomEntities(input: SchemaImportInput, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.entitiesBase()}/import`,\n auth,\n body: input,\n });\n }\n\n /** Delete an instance by id. */\n async deleteInstance(type: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.instancesBase(type)}/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Structured search over a custom entity's instances\n * (`POST /instances/search`), wrapped in {@link PaginatedItems}.\n *\n * The `query` parameter is third and `auth` fourth. This used to forward no\n * query parameters at all and report a hard-coded `hasNextPage: false`, so a\n * search could only ever return the server's default first page.\n */\n async searchInstances<T = Record<string, unknown>>(\n type: string,\n body: InstanceSearchBody,\n query: SearchInstancesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<CustomInstance<T>>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const { totalCount, ...rest } = query;\n return requestPage<CustomInstance<T>>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `${this.instancesBase(type)}/search`,\n auth,\n body,\n query: { ...rest, pageNumber, pageSize },\n },\n { pageNumber, pageSize, ...(totalCount === undefined ? {} : { totalCount }) },\n );\n }\n\n // --- (E) References ------------------------------------------------------\n\n /**\n * Reference entities (`/references`) — a schema plus an uploaded JSON file.\n * Create/update are `multipart/form-data` (parts `file` and `body`), like\n * the media service's blob upload. Default auth: service.\n */\n readonly references = {\n /**\n * List references, wrapped in {@link PaginatedItems}. Pagination defaults\n * match the rest of this service (`pageNumber: 1`, `pageSize: 60`).\n */\n list: async (\n query: ListSchemaReferencesQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SchemaReference>> => {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.sort) q.sort = query.sort;\n if (query.q) q.q = query.q;\n if (query.fields) q.fields = query.fields;\n if (query.type) q.type = query.type;\n return requestPage<SchemaReference>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.referencesBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n },\n\n /** Retrieve one reference by id. */\n get: async (id: string, auth: AuthContext = SERVICE): Promise<SchemaReference> =>\n this.ctx.http.request<SchemaReference>({\n method: \"GET\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n auth,\n }),\n\n /**\n * Create a reference. `file` is the reference's JSON content — pass a\n * `Blob` to upload as-is, or a plain object to have it serialized into a\n * JSON blob. `body` carries the metadata.\n */\n create: async (\n input: { file: Blob | Record<string, unknown>; body: SchemaReferenceInput },\n auth: AuthContext = SERVICE,\n ): Promise<SchemaReferenceCreated> => {\n const fd = new FormData();\n fd.set(\"file\", toJsonBlob(input.file));\n fd.set(\"body\", JSON.stringify(input.body));\n return this.ctx.http.request<SchemaReferenceCreated>({\n method: \"POST\",\n path: this.referencesBase(),\n auth,\n body: fd,\n });\n },\n\n /**\n * Update a reference (multipart, like {@link create}). `options.version`\n * enables optimistic locking — the server answers 409 on a stale version.\n */\n update: async (\n id: string,\n input: { file: Blob | Record<string, unknown>; body: SchemaReferenceUpdateInput },\n options: { version?: number } = {},\n auth: AuthContext = SERVICE,\n ): Promise<void> => {\n const fd = new FormData();\n fd.set(\"file\", toJsonBlob(input.file));\n fd.set(\"body\", JSON.stringify(input.body));\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n ...(options.version === undefined ? {} : { query: { version: options.version } }),\n auth,\n body: fd,\n });\n },\n\n /** Delete a reference by id. */\n delete: async (id: string, auth: AuthContext = SERVICE): Promise<void> => {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.referencesBase()}/${encodeURIComponent(id)}`,\n auth,\n });\n },\n };\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchQuery,\n Created,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n} from \"./ai-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * A symmetric CRUD resource over an agentic sub-collection (`tools`,\n * `mcp-servers`, `tokens`, `oauths`). All six operations share the upstream\n * shape; only the base path and the Read/Write types differ. Server-side only\n * — every call defaults to the SERVICE (backend) token.\n */\nexport class AgenticCrudResource<Read, Write> {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string,\n ) {}\n\n private item(id: string): string {\n return `${this.path}/${encodeURIComponent(id)}`;\n }\n\n /** List the collection (`GET {path}`). Optional `q`/paging/sort/fields/expand. */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<Read[]> {\n return this.ctx.http.request<Read[]>({ method: \"GET\", path: this.path, auth, query: { ...query } });\n }\n\n /** Structured search (`POST {path}/search`): `q` in the body, paging/sort/fields in the query. */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<Read[]> {\n return this.ctx.http.request<Read[]>({ method: \"POST\", path: `${this.path}/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n\n /** Retrieve one entry by id (`GET {path}/{id}`). */\n get(id: string, opts: GetOptions = {}, auth: AuthContext = SERVICE): Promise<Read> {\n return this.ctx.http.request<Read>({ method: \"GET\", path: this.item(id), auth, query: { ...opts } });\n }\n\n /**\n * Create-or-replace by id (`PUT {path}/{id}`). Resolves to `{ id }` on create\n * (HTTP 201) and `undefined` on update (HTTP 204). `{ force: true }`\n * cascade-disables dependents.\n */\n upsert(\n id: string,\n body: Write,\n opts: MutateOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Created | undefined> {\n return this.ctx.http.request<Created | undefined>({\n method: \"PUT\",\n path: this.item(id),\n auth,\n body,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /**\n * Partial update with an op array (`PATCH {path}/{id}`, 204). `ops` use the\n * upstream UPPERCASE enum (`ADD | REMOVE | REPLACE`), sent verbatim.\n */\n async patch(id: string, ops: AgenticPatchOp[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.item(id), auth, body: ops });\n }\n\n /** Delete by id (`DELETE {path}/{id}`). `{ force: true }` removes even if referenced. */\n async delete(id: string, opts: MutateOptions = {}, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: this.item(id),\n auth,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n}\n\n/**\n * AI async jobs (`/ai-service/{tenant}/jobs`). NOTE: not under `/agentic`.\n * `chatAsync` returns a `jobId`; poll/list/delete it here.\n */\nexport class JobsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly base: string,\n ) {}\n\n /** List jobs (`GET /jobs`). */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<Job[]> {\n return this.ctx.http.request<Job[]>({ method: \"GET\", path: `${this.base}/jobs`, auth, query: { ...query } });\n }\n /** Structured job search (`POST /jobs/search`). */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<Job[]> {\n return this.ctx.http.request<Job[]>({ method: \"POST\", path: `${this.base}/jobs/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /** Retrieve one job (`GET /jobs/{jobId}`). */\n get(jobId: string, auth: AuthContext = SERVICE): Promise<Job> {\n return this.ctx.http.request<Job>({ method: \"GET\", path: `${this.base}/jobs/${encodeURIComponent(jobId)}`, auth });\n }\n /** Delete one job (`DELETE /jobs/{jobId}`). */\n async delete(jobId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: `${this.base}/jobs/${encodeURIComponent(jobId)}`, auth });\n }\n}\n\n/** Agent templates (`/agentic/templates`). `list · search · clone`. */\nexport class TemplatesResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/templates`\n ) {}\n\n /** List available templates (`GET /agentic/templates`). */\n list(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentTemplate[]> {\n return this.ctx.http.request<AgentTemplate[]>({ method: \"GET\", path: this.path, auth, query: { ...query } });\n }\n /** Structured template search (`POST /agentic/templates/search`). */\n search(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentTemplate[]> {\n return this.ctx.http.request<AgentTemplate[]>({ method: \"POST\", path: `${this.path}/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /**\n * Instantiate a new agent from a template\n * (`POST /agentic/templates/{templateId}/agents`, HTTP 201). Returns the\n * created agent's id.\n */\n clone(templateId: string, body: AgentFromTemplate, auth: AuthContext = SERVICE): Promise<Created> {\n return this.ctx.http.request<Created>({\n method: \"POST\",\n path: `${this.path}/${encodeURIComponent(templateId)}/agents`,\n auth,\n body,\n });\n }\n}\n\n/** Agent logs (`/agentic/logs`): request logs and session logs. */\nexport class LogsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/logs`\n ) {}\n\n /** List request logs (`GET /agentic/logs/requests`). */\n listRequests(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentRequestLog[]> {\n return this.ctx.http.request<AgentRequestLog[]>({ method: \"GET\", path: `${this.path}/requests`, auth, query: { ...query } });\n }\n /** Retrieve one request log (`GET /agentic/logs/requests/{requestId}`). */\n getRequest(requestId: string, auth: AuthContext = SERVICE): Promise<AgentRequestLog> {\n return this.ctx.http.request<AgentRequestLog>({ method: \"GET\", path: `${this.path}/requests/${encodeURIComponent(requestId)}`, auth });\n }\n /** Structured request-log search (`POST /agentic/logs/requests/search`). */\n searchRequests(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentRequestLog[]> {\n return this.ctx.http.request<AgentRequestLog[]>({ method: \"POST\", path: `${this.path}/requests/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n /** List session logs (`GET /agentic/logs/sessions`). */\n listSessions(query: ListQuery = {}, auth: AuthContext = SERVICE): Promise<AgentSessionLog[]> {\n return this.ctx.http.request<AgentSessionLog[]>({ method: \"GET\", path: `${this.path}/sessions`, auth, query: { ...query } });\n }\n /** Retrieve one session log (`GET /agentic/logs/sessions/{sessionId}`). */\n getSession(sessionId: string, auth: AuthContext = SERVICE): Promise<AgentSessionLog> {\n return this.ctx.http.request<AgentSessionLog>({ method: \"GET\", path: `${this.path}/sessions/${encodeURIComponent(sessionId)}`, auth });\n }\n /** Structured session-log search (`POST /agentic/logs/sessions/search`). */\n searchSessions(query: SearchQuery, auth: AuthContext = SERVICE): Promise<AgentSessionLog[]> {\n return this.ctx.http.request<AgentSessionLog[]>({ method: \"POST\", path: `${this.path}/sessions/search`, auth, ...splitQuery(query, SEARCH_PAGING) });\n }\n}\n\n/** Agent analytics (`/agentic/analytics`). */\nexport class AnalyticsResource {\n constructor(\n private readonly ctx: ClientContext,\n private readonly path: string, // `${base}/agentic/analytics`\n ) {}\n\n /** Aggregated metrics (`GET /agentic/analytics`); scope with `agentId`. */\n get(opts: AnalyticsQuery = {}, auth: AuthContext = SERVICE): Promise<AgentAnalytics> {\n return this.ctx.http.request<AgentAnalytics>({ method: \"GET\", path: this.path, auth, query: { ...opts } });\n }\n /** Per-agent execution counts (`GET /agentic/analytics/executions`). `agentIds` required. */\n executions(query: ExecutionsQuery, auth: AuthContext = SERVICE): Promise<AgentExecutions> {\n return this.ctx.http.request<AgentExecutions>({ method: \"GET\", path: `${this.path}/executions`, auth, query: { ...query } });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport {\n AgenticCrudResource,\n JobsResource,\n TemplatesResource,\n LogsResource,\n AnalyticsResource,\n} from \"./ai-resources\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n TextRequest,\n TextResponse,\n CompletionRequest,\n CompletionResponse,\n Agent,\n AgentInput,\n AgentPatchOp,\n AgentSearchQuery,\n ChatRequest,\n ChatResponse,\n JobIdResponse,\n DeleteAgentOptions,\n ChatOptions,\n Conversation,\n ConversationSearchQuery,\n Created,\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchQuery,\n OAuthConfig,\n OAuthInput,\n Tool,\n ToolInput,\n Token,\n TokenInput,\n McpServer,\n McpServerInput,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n ProviderModels,\n CommerceEvents,\n Attachment,\n AttachmentOptions,\n AttachmentReuseOptions,\n AgentsExport,\n AgentsExportRequest,\n AgentsImport,\n AgentsImportRequest,\n} from \"./ai-types\";\n\nexport type {\n TextRequest,\n TextResponse,\n CompletionMessage,\n CompletionRequest,\n CompletionResponse,\n Agent,\n AgentInput,\n AgentPatchOp,\n AgentSearchQuery,\n ChatRequest,\n ChatResponse,\n JobIdResponse,\n DeleteAgentOptions,\n ChatOptions,\n ChatStreamOptions,\n Conversation,\n ConversationSearchQuery,\n Created,\n AgenticPatchOp,\n ListQuery,\n GetOptions,\n MutateOptions,\n SearchPaging,\n SearchQuery,\n OAuthConfig,\n OAuthInput,\n Tool,\n ToolInput,\n Token,\n TokenInput,\n McpServer,\n McpServerInput,\n Job,\n AgentTemplate,\n AgentFromTemplate,\n AgentRequestLog,\n AgentSessionLog,\n AgentAnalytics,\n AgentExecutions,\n AnalyticsQuery,\n ExecutionsQuery,\n ProviderModels,\n CommerceEvents,\n Attachment,\n AttachmentOptions,\n AttachmentReuseOptions,\n AgentsExport,\n AgentsExportRequest,\n AgentsImport,\n AgentsImportRequest,\n} from \"./ai-types\";\n\nexport type {\n AgenticCrudResource,\n AnalyticsResource,\n JobsResource,\n LogsResource,\n TemplatesResource,\n} from \"./ai-resources\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * `chat` and `chatAsync` took `auth` second until 4.0.0; now options come\n * second and `auth` third, as on `chatStream`. An old call would otherwise have\n * its auth context read as options and run on the default service token —\n * silently, in plain JavaScript — so it throws instead.\n */\nfunction assertChatOptions(opts: ChatOptions, method: string): void {\n if (typeof opts === \"object\" && opts !== null && \"kind\" in opts) {\n throw new Error(\n `ai.${method}: the second argument is { sessionId? } since 4.0.0 — pass the auth context third`,\n );\n }\n}\n\nfunction sessionHeader(opts: ChatOptions): { headers?: Record<string, string> } {\n return opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {};\n}\n\nconst AUTH_KINDS = new Set([\"service\", \"anonymous\", \"customer\", \"raw\"]);\n\n/**\n * `listAgents` and `listConversations` took only `auth` before they could page.\n * Tells that original call apart from `(query, auth)`, so an auth context is\n * never sent as query parameters — which would put a customer token in the URL.\n */\nfunction isAuthContext(value: ListQuery | AuthContext): value is AuthContext {\n return AUTH_KINDS.has(String((value as { kind?: unknown }).kind));\n}\n\n/**\n * Emporix AI Service (`/ai-service/{tenant}/…`): text generation, chat\n * completions, and the agentic layer (agent CRUD + synchronous/asynchronous\n * chat). Every endpoint requires a backend-only `ai.*` scope and the\n * **service (clientCredentials) token** — default auth: service.\n *\n * Server-side use only; the service token must never reach a browser. A\n * storefront chat (scope `ai.agentexecution_manage_own`) would require a\n * BFF / token-proxy — out of scope for this SDK.\n *\n * The model is server-fixed per tenant; there is no `model` parameter.\n */\nexport class AiService {\n static readonly channel = \"ai\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/ai-service/${this.ctx.tenant}`;\n }\n\n // --- Agentic building blocks (CRUD sub-resources) ----------------------\n\n private _oauths?: AgenticCrudResource<OAuthConfig, OAuthInput>;\n /** OAuth 2.0 client-credentials configs (`/agentic/oauths`). CRUD sub-resource. */\n get oauths(): AgenticCrudResource<OAuthConfig, OAuthInput> {\n return (this._oauths ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/oauths`));\n }\n\n private _tools?: AgenticCrudResource<Tool, ToolInput>;\n /** Agentic tools (`/agentic/tools`). CRUD sub-resource. */\n get tools(): AgenticCrudResource<Tool, ToolInput> {\n return (this._tools ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/tools`));\n }\n\n private _tokens?: AgenticCrudResource<Token, TokenInput>;\n /** Stored tokens (`/agentic/tokens`) — an OAuth config's client secret. CRUD sub-resource. */\n get tokens(): AgenticCrudResource<Token, TokenInput> {\n return (this._tokens ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/tokens`));\n }\n\n private _mcpServers?: AgenticCrudResource<McpServer, McpServerInput>;\n /** MCP-server configs (`/agentic/mcp-servers`). CRUD sub-resource. */\n get mcpServers(): AgenticCrudResource<McpServer, McpServerInput> {\n return (this._mcpServers ??= new AgenticCrudResource(this.ctx, `${this.base()}/agentic/mcp-servers`));\n }\n\n private _jobs?: JobsResource;\n /** AI async jobs (`/jobs`). `list · search · get · delete`. */\n get jobs(): JobsResource {\n return (this._jobs ??= new JobsResource(this.ctx, this.base()));\n }\n\n private _templates?: TemplatesResource;\n /** Agent templates (`/agentic/templates`). `list · search · clone`. */\n get templates(): TemplatesResource {\n return (this._templates ??= new TemplatesResource(this.ctx, `${this.base()}/agentic/templates`));\n }\n\n private _logs?: LogsResource;\n /** Agent logs (`/agentic/logs`): request + session logs. */\n get logs(): LogsResource {\n return (this._logs ??= new LogsResource(this.ctx, `${this.base()}/agentic/logs`));\n }\n\n private _analytics?: AnalyticsResource;\n /** Agent analytics (`/agentic/analytics`). `get · executions`. */\n get analytics(): AnalyticsResource {\n return (this._analytics ??= new AnalyticsResource(this.ctx, `${this.base()}/agentic/analytics`));\n }\n\n /** Generate text from a single prompt (`POST /texts`). Honors `maxTokens`. */\n async generateText(input: TextRequest, auth: AuthContext = SERVICE): Promise<TextResponse> {\n return this.ctx.http.request<TextResponse>({\n method: \"POST\",\n path: `${this.base()}/texts`,\n auth,\n body: input,\n });\n }\n\n /** Run a chat completion over a message list (`POST /completions`). No `maxTokens`. */\n async complete(\n input: CompletionRequest,\n auth: AuthContext = SERVICE,\n ): Promise<CompletionResponse> {\n return this.ctx.http.request<CompletionResponse>({\n method: \"POST\",\n path: `${this.base()}/completions`,\n auth,\n body: input,\n });\n }\n\n /**\n * List agents (`GET /agentic/agents`). `q`, `pageNumber`, `pageSize`, `sort`,\n * `fields` and `expand` go in the query string; without paging keys the\n * server returns its first page. The original `listAgents(auth)` still works.\n */\n listAgents(auth?: AuthContext): Promise<Agent[]>;\n listAgents(query: ListQuery, auth?: AuthContext): Promise<Agent[]>;\n async listAgents(queryOrAuth: ListQuery | AuthContext = {}, auth: AuthContext = SERVICE): Promise<Agent[]> {\n const [query, ctx]: [ListQuery, AuthContext] = isAuthContext(queryOrAuth)\n ? [{}, queryOrAuth]\n : [queryOrAuth, auth];\n return this.ctx.http.request<Agent[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/agents`,\n auth: ctx,\n query: { ...query },\n });\n }\n\n /** Retrieve one agent by id. */\n async getAgent(id: string, auth: AuthContext = SERVICE): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"GET\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Create-or-replace an agent by id (`PUT`). Takes the agent write shape. */\n async upsertAgent(id: string, agent: AgentInput, auth: AuthContext = SERVICE): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"PUT\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n body: agent,\n });\n }\n\n /**\n * Patch an agent with an op array (`PATCH`). `ops` use the upstream\n * UPPERCASE enum (`ADD | REMOVE | REPLACE`) and are sent verbatim — this is\n * NOT RFC-6902 JSON-Patch.\n */\n async patchAgent(\n id: string,\n ops: AgentPatchOp[],\n auth: AuthContext = SERVICE,\n ): Promise<Agent> {\n return this.ctx.http.request<Agent>({\n method: \"PATCH\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n body: ops,\n });\n }\n\n /**\n * Delete an agent by id. Pass `{ force: true }` to delete an agent that is\n * still referenced elsewhere (`?force=true`).\n */\n async deleteAgent(\n id: string,\n auth: AuthContext = SERVICE,\n opts: DeleteAgentOptions = {},\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/agentic/agents/${encodeURIComponent(id)}`,\n auth,\n ...(opts.force ? { query: { force: \"true\" } } : {}),\n });\n }\n\n /**\n * Server-side agent search (`POST /agentic/agents/search`). `q` goes in the\n * body; `pageNumber`, `pageSize`, `sort` and `fields` in the query string.\n */\n async searchAgents(query: AgentSearchQuery, auth: AuthContext = SERVICE): Promise<Agent[]> {\n return this.ctx.http.request<Agent[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n });\n }\n\n /**\n * Synchronous agent chat (`POST /agentic/chat`). Returns the response\n * ARRAY verbatim (the upstream contract is an array, not a single object).\n *\n * `opts.sessionId` is sent as the `session-id` header. It carries the\n * conversation — continuity needs it plus `enabledMemory` on the agent — and\n * it is how a chat reaches an attachment: pass the `sessionId` the upload or\n * reuse returned, and list the file under `input.attachments`.\n */\n async chat(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ChatResponse[]> {\n assertChatOptions(opts, \"chat\");\n return this.ctx.http.request<ChatResponse[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/chat`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n }\n\n /**\n * Fire-and-forget agent chat (`POST /agentic/chat-async`, HTTP 201).\n * Returns the job-id ARRAY verbatim. `opts` as for {@link chat}.\n */\n async chatAsync(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<JobIdResponse[]> {\n assertChatOptions(opts, \"chatAsync\");\n return this.ctx.http.request<JobIdResponse[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/chat-async`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n }\n\n /**\n * Streaming agent chat (`POST /agentic/chat-stream`, `text/event-stream`).\n * Yields each SSE `data` payload verbatim — the upstream contract types the\n * stream body as an opaque string, so chunks are raw strings, not parsed\n * objects. Consume with `for await`. `opts` as for {@link chat}.\n */\n async *chatStream(\n input: ChatRequest,\n opts: ChatOptions = {},\n auth: AuthContext = SERVICE,\n ): AsyncIterable<string> {\n assertChatOptions(opts, \"chatStream\");\n const events = this.ctx.http.requestStream({\n method: \"POST\",\n path: `${this.base()}/agentic/chat-stream`,\n auth,\n body: input,\n ...sessionHeader(opts),\n });\n for await (const ev of events) yield ev.data;\n }\n\n /**\n * List stored agentic conversations (`GET /agentic/conversations`), paged\n * like {@link listAgents}. The original `listConversations(auth)` still works.\n */\n listConversations(auth?: AuthContext): Promise<Conversation[]>;\n listConversations(query: ListQuery, auth?: AuthContext): Promise<Conversation[]>;\n async listConversations(\n queryOrAuth: ListQuery | AuthContext = {},\n auth: AuthContext = SERVICE,\n ): Promise<Conversation[]> {\n const [query, ctx]: [ListQuery, AuthContext] = isAuthContext(queryOrAuth)\n ? [{}, queryOrAuth]\n : [queryOrAuth, auth];\n return this.ctx.http.request<Conversation[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/conversations`,\n auth: ctx,\n query: { ...query },\n });\n }\n\n /** Server-side conversation search (`POST /agentic/conversations/search`), paged like {@link searchAgents}. */\n async searchConversations(\n query: ConversationSearchQuery,\n auth: AuthContext = SERVICE,\n ): Promise<Conversation[]> {\n return this.ctx.http.request<Conversation[]>({\n method: \"POST\",\n path: `${this.base()}/agentic/conversations/search`,\n auth,\n ...splitQuery(query, SEARCH_PAGING),\n });\n }\n\n // --- Standalone agentic reads / bulk operations ------------------------\n\n /** List models available to the tenant, grouped by provider (`GET /agentic/models`). */\n async listModels(auth: AuthContext = SERVICE): Promise<ProviderModels[]> {\n return this.ctx.http.request<ProviderModels[]>({\n method: \"GET\",\n path: `${this.base()}/agentic/models`,\n auth,\n });\n }\n\n /** List commerce events available to agent triggers (`GET /agentic/commerce-events`). */\n async listCommerceEvents(auth: AuthContext = SERVICE): Promise<CommerceEvents> {\n return this.ctx.http.request<CommerceEvents>({\n method: \"GET\",\n path: `${this.base()}/agentic/commerce-events`,\n auth,\n });\n }\n\n /**\n * Upload a chat attachment for an agent\n * (`POST /agentic/{agentId}/attachments`, multipart, HTTP 201). The response\n * `sessionId` must be threaded into subsequent chat calls to bind the file.\n * Pass `opts.sessionId` to attach to an existing session.\n *\n * The endpoint takes exactly one of `attachment` or `attachmentId` — both or\n * neither is a `400`. This method always sends the file; to point a second\n * agent at a file already in the session, use {@link reuseAttachment}.\n */\n async uploadAttachment(\n agentId: string,\n attachment: Blob | File,\n opts: AttachmentOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Attachment> {\n const form = new FormData();\n form.append(\"attachment\", attachment);\n return this.ctx.http.request<Attachment>({\n method: \"POST\",\n path: `${this.base()}/agentic/${encodeURIComponent(agentId)}/attachments`,\n auth,\n body: form,\n ...(opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {}),\n });\n }\n\n /**\n * Assign an existing media asset to an agent as a chat attachment\n * (`POST /agentic/{agentId}/attachments` with the `attachmentId` form field,\n * HTTP 200). Resolves to the attachment `id` and the `sessionId` to send on\n * the following chat calls.\n *\n * Use it to hand a second agent the same file instead of uploading it twice.\n * Pass `opts.sessionId` to attach to an existing chat session; without it the\n * service opens a new one and returns its id — thread that into the chat, or\n * the agent never sees the file. With `ai.agentexecution_manage` the asset may\n * be any media asset, not only one uploaded to this session.\n *\n * ```ts\n * const { id, sessionId } = await client.ai.uploadAttachment(\"agent-a\", file);\n * await client.ai.reuseAttachment(\"agent-b\", id!, { sessionId: sessionId! });\n * ```\n */\n async reuseAttachment(\n agentId: string,\n attachmentId: string,\n opts: AttachmentReuseOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<Attachment> {\n const form = new FormData();\n form.append(\"attachmentId\", attachmentId);\n return this.ctx.http.request<Attachment>({\n method: \"POST\",\n path: `${this.base()}/agentic/${encodeURIComponent(agentId)}/attachments`,\n auth,\n body: form,\n ...(opts.sessionId ? { headers: { \"session-id\": opts.sessionId } } : {}),\n });\n }\n\n /** Export agents + components as a base64/checksum blob (`POST /agentic/agents/export`). */\n async exportAgents(body: AgentsExportRequest, auth: AuthContext = SERVICE): Promise<AgentsExport> {\n return this.ctx.http.request<AgentsExport>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/export`,\n auth,\n body,\n });\n }\n\n /** Import previously-exported agents (`POST /agentic/agents/import`). */\n async importAgents(body: AgentsImportRequest, auth: AuthContext = SERVICE): Promise<AgentsImport> {\n return this.ctx.http.request<AgentsImport>({\n method: \"POST\",\n path: `${this.base()}/agentic/agents/import`,\n auth,\n body,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n TaxConfig,\n TaxConfigInput,\n TaxConfigUpdate,\n TaxConfigCreated,\n TaxCalculationRequest,\n TaxCalculationResult,\n} from \"./tax-types\";\n\nexport type {\n TaxClass,\n TaxLocation,\n TaxConfig,\n TaxConfigInput,\n TaxConfigUpdate,\n TaxConfigCreated,\n TaxCalculationInput,\n TaxCalculationRequest,\n TaxCalculationResult,\n} from \"./tax-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Tax Service (`/tax/{tenant}/…`): CRUD over per-location tax\n * configurations and the net/gross tax-calculation command. Every endpoint\n * requires a backend `tax.tax_read` / `tax.tax_manage` scope and the\n * **service (clientCredentials) token** — default auth: service.\n *\n * Server-side use only; the service token must never reach a browser.\n */\nexport class TaxService {\n static readonly channel = \"tax\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/tax/${this.ctx.tenant}`;\n }\n\n /** List all per-location tax configurations. */\n async listTaxConfigs(auth: AuthContext = SERVICE): Promise<TaxConfig[]> {\n return this.ctx.http.request<TaxConfig[]>({\n method: \"GET\",\n path: `${this.base()}/taxes`,\n auth,\n });\n }\n\n /** Retrieve one tax configuration by its location (country) code. */\n async getTaxConfig(locationCode: string, auth: AuthContext = SERVICE): Promise<TaxConfig> {\n return this.ctx.http.request<TaxConfig>({\n method: \"GET\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n });\n }\n\n /** Create a tax configuration (`POST`). Returns the created `{ locationCode }`. */\n async createTaxConfig(\n input: TaxConfigInput,\n auth: AuthContext = SERVICE,\n ): Promise<TaxConfigCreated> {\n return this.ctx.http.request<TaxConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/taxes`,\n auth,\n body: input,\n });\n }\n\n /**\n * Update a tax configuration by location code (`PUT`). `metadata.version` is\n * required (optimistic locking — a stale version yields 409).\n */\n async updateTaxConfig(\n locationCode: string,\n input: TaxConfigUpdate,\n auth: AuthContext = SERVICE,\n ): Promise<TaxConfig> {\n return this.ctx.http.request<TaxConfig>({\n method: \"PUT\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a tax configuration by location code. */\n async deleteTaxConfig(locationCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/taxes/${encodeURIComponent(locationCode)}`,\n auth,\n });\n }\n\n /**\n * Calculate net/gross values for a price (`PUT /taxes/calculation-commands`).\n * Single command in, single result out.\n */\n async calculateTax(\n request: TaxCalculationRequest,\n auth: AuthContext = SERVICE,\n ): Promise<TaxCalculationResult> {\n return this.ctx.http.request<TaxCalculationResult>({\n method: \"PUT\",\n path: `${this.base()}/taxes/calculation-commands`,\n auth,\n body: request,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n CouponList,\n Coupon,\n CouponInput,\n CouponUpdate,\n CouponCreated,\n Redemption,\n RedemptionInput,\n RedemptionCreated,\n ReferralCoupon,\n} from \"./coupon-types\";\n\nexport type {\n Coupon,\n CouponList,\n CouponInput,\n CouponUpdate,\n CouponCreated,\n Redemption,\n RedemptionInput,\n RedemptionCreated,\n ReferralCoupon,\n} from \"./coupon-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Coupon Service (`/coupon/{tenant}/…`): coupon CRUD, validation,\n * redemptions, and referral coupons.\n *\n * Every method defaults to the **service (clientCredentials) token**. For\n * customer-driven validation/redemption, pass `auth.customer(token)` as the\n * trailing argument (the React hooks do this with the browser context). The\n * service token must never reach a browser.\n */\nexport class CouponService {\n static readonly channel = \"coupon\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/coupon/${this.ctx.tenant}`;\n }\n\n /** List coupons by criteria. Returns a plain array. */\n async listCoupons(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CouponList> {\n return this.ctx.http.request<CouponList>({\n method: \"GET\",\n path: `${this.base()}/coupons`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one coupon by code. */\n async getCoupon(code: string, auth: AuthContext = SERVICE): Promise<Coupon> {\n return this.ctx.http.request<Coupon>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a coupon (`POST`, HTTP 201). Returns the created resource's `{ id?, yrn? }`. */\n async createCoupon(input: CouponInput, auth: AuthContext = SERVICE): Promise<CouponCreated> {\n return this.ctx.http.request<CouponCreated>({\n method: \"POST\",\n path: `${this.base()}/coupons`,\n auth,\n body: input,\n });\n }\n\n /** Replace a coupon by code (`PUT`). Resolves once the update is accepted. */\n async updateCoupon(code: string, input: CouponUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a coupon by code (`PATCH` merge body). */\n async patchCoupon(code: string, patch: CouponUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a coupon by code. */\n async deleteCoupon(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /**\n * Check whether a coupon can be redeemed (`POST /validation`). Resolves when\n * redeemable; throws an `EmporixError` otherwise (no response body).\n */\n async validateCoupon(\n code: string,\n redemption: RedemptionInput,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/validation`,\n auth,\n body: redemption,\n });\n }\n\n /** List a coupon's redemptions by criteria. */\n async listRedemptions(\n code: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<Redemption[]> {\n return this.ctx.http.request<Redemption[]>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Redeem a coupon by creating a redemption (`POST`, HTTP 201). Returns the resource location. */\n async redeemCoupon(\n code: string,\n redemption: RedemptionInput,\n auth: AuthContext = SERVICE,\n ): Promise<RedemptionCreated> {\n return this.ctx.http.request<RedemptionCreated>({\n method: \"POST\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions`,\n auth,\n body: redemption,\n });\n }\n\n /** Retrieve one redemption by id. */\n async getRedemption(code: string, id: string, auth: AuthContext = SERVICE): Promise<Redemption> {\n return this.ctx.http.request<Redemption>({\n method: \"GET\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Delete a redemption by id. */\n async deleteRedemption(code: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/coupons/${encodeURIComponent(code)}/redemptions/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** Retrieve a customer's referral coupon (resolves to an empty body when none exists). */\n async getReferralCoupon(customerNumber: string, auth: AuthContext = SERVICE): Promise<ReferralCoupon> {\n return this.ctx.http.request<ReferralCoupon>({\n method: \"GET\",\n path: `${this.base()}/referral-coupons/${encodeURIComponent(customerNumber)}`,\n auth,\n });\n }\n\n /** Create a referral coupon code for a customer (no request body). */\n async createReferralCoupon(\n customerNumber: string,\n auth: AuthContext = SERVICE,\n ): Promise<ReferralCoupon> {\n return this.ctx.http.request<ReferralCoupon>({\n method: \"POST\",\n path: `${this.base()}/referral-coupons/${encodeURIComponent(customerNumber)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { EmporixNotFoundError } from \"../core/errors\";\nimport type {\n CustomerSummaryBatch,\n PointsSummary,\n NewPointsEntry,\n AddedPoints,\n RedeemedPoints,\n RedeemOption,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"./reward-points-types\";\n\nexport type {\n CustomerSummaryBatch,\n PointsSummary,\n NewPointsEntry,\n AddedPoints,\n RedeemedPoints,\n RedeemOption,\n RedeemOptionList,\n RedeemMyPointsInput,\n RedeemCouponResult,\n} from \"./reward-points-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Reward Points Service (`/reward-points/…`): admin customer-points\n * management, the signed-in customer's own points, and redeem options.\n *\n * Auth differs per group: admin and redeem-option management default to the\n * **service token**; the `/public/*` methods require a **customer token** (they\n * accept only `CustomerAccessToken`). Note the mixed base paths — customer/\n * public/batch endpoints omit `{tenant}`, redeem options include it. A point\n * balance (`getCustomerPoints` / `getMyPoints`) is returned as a bare `number`.\n */\nexport class RewardPointsService {\n static readonly channel = \"reward-points\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n /** Base without tenant (customer / public / batch endpoints). */\n private base(): string {\n return `/reward-points`;\n }\n\n /** Tenant-scoped base (redeem options only). */\n private tenantBase(): string {\n return `/reward-points/${this.ctx.tenant}`;\n }\n\n // --- Admin: customer points management (service token) ---\n\n /** Batch summary across all customers. */\n async listAllSummaries(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CustomerSummaryBatch> {\n return this.ctx.http.request<CustomerSummaryBatch>({\n method: \"GET\",\n path: `${this.base()}/summaryBatch`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one customer's reward-points balance. */\n async getCustomerPoints(customerId: string, auth: AuthContext = SERVICE): Promise<number> {\n return this.ctx.http.request<number>({\n method: \"GET\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Create a reward-points entry for a customer. */\n async createCustomerPoints(\n customerId: string,\n input: NewPointsEntry,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a customer's reward points. */\n async deleteCustomerPoints(customerId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Retrieve a reward-points summary for one customer. */\n async getCustomerSummary(customerId: string, auth: AuthContext = SERVICE): Promise<PointsSummary> {\n return this.ctx.http.request<PointsSummary>({\n method: \"GET\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/summary`,\n auth,\n });\n }\n\n /** Add reward points for a customer. */\n async addPoints(customerId: string, input: AddedPoints, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/addPoints`,\n auth,\n body: input,\n });\n }\n\n /** Redeem a customer's reward points (on behalf). */\n async redeemPoints(customerId: string, input: RedeemedPoints, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/customer/${encodeURIComponent(customerId)}/redeemPoints`,\n auth,\n body: input,\n });\n }\n\n // --- Storefront: the signed-in customer's own points (customer token required) ---\n\n /** The signed-in customer's reward-points balance. Requires a customer `auth`. */\n async getMyPoints(auth: AuthContext): Promise<number> {\n // A customer who has never earned points has no entry, and Emporix answers\n // 404 \"No reward points found\" — for the signed-in customer that simply\n // means zero points, so map it to 0 rather than surfacing an error.\n try {\n return await this.ctx.http.request<number>({\n method: \"GET\",\n path: `${this.base()}/public/customer`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError) return 0;\n throw err;\n }\n }\n\n /** The signed-in customer's reward-points summary. Requires a customer `auth`. */\n async getMySummary(auth: AuthContext): Promise<PointsSummary> {\n // Same as getMyPoints: a 404 means the signed-in customer has no entry yet,\n // i.e. an empty summary (zero active points, no history), not an error.\n try {\n return await this.ctx.http.request<PointsSummary>({\n method: \"GET\",\n path: `${this.base()}/public/customer/summary`,\n auth,\n });\n } catch (err) {\n if (err instanceof EmporixNotFoundError) {\n return { activePoints: 0, summary: { addedPointsList: [] } };\n }\n throw err;\n }\n }\n\n /**\n * Redeem the signed-in customer's points for a coupon code. Requires a\n * customer `auth`. Returns the issued coupon `{ code }`.\n */\n async redeemMyPoints(input: RedeemMyPointsInput, auth: AuthContext): Promise<RedeemCouponResult> {\n return this.ctx.http.request<RedeemCouponResult>({\n method: \"POST\",\n path: `${this.base()}/public/customer/redeem`,\n auth,\n body: input,\n });\n }\n\n // --- Redeem options (tenant-scoped; read open to customer, management service-only) ---\n\n /** List redeem options. Defaults to the service token; pass a customer `auth` for storefront reads. */\n async listRedeemOptions(auth: AuthContext = SERVICE): Promise<RedeemOptionList> {\n return this.ctx.http.request<RedeemOptionList>({\n method: \"GET\",\n path: `${this.tenantBase()}/redeemOptions`,\n auth,\n });\n }\n\n /** Create a redeem option. Returns the updated options list. */\n async createRedeemOption(input: RedeemOption, auth: AuthContext = SERVICE): Promise<RedeemOptionList> {\n return this.ctx.http.request<RedeemOptionList>({\n method: \"POST\",\n path: `${this.tenantBase()}/redeemOptions`,\n auth,\n body: input,\n });\n }\n\n /** Update a redeem option by id. Resolves once accepted (no response body). */\n async updateRedeemOption(\n redeemOptionId: string,\n input: RedeemOption,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.tenantBase()}/redeemOptions/${encodeURIComponent(redeemOptionId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a redeem option by id. */\n async deleteRedeemOption(redeemOptionId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.tenantBase()}/redeemOptions/${encodeURIComponent(redeemOptionId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Brand, BrandList, BrandInput, BrandUpdate } from \"./brand-types\";\n\nexport type { Brand, BrandList, BrandInput, BrandUpdate } from \"./brand-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Brand Service (`/brand/brands`): CRUD over brands. Server-side;\n * defaults to the service token (reads also work with an anonymous token).\n * The path carries no `{tenant}` segment — the tenant comes from the token.\n */\nexport class BrandService {\n static readonly channel = \"brand\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/brand/brands`;\n }\n\n /** List all brands. */\n async listBrands(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<BrandList> {\n return this.ctx.http.request<BrandList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one brand by id. */\n async getBrand(brandId: string, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n });\n }\n\n /** Create a brand. */\n async createBrand(input: BrandInput, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a brand by id. */\n async updateBrand(brandId: string, input: BrandUpdate, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a brand by id. */\n async patchBrand(brandId: string, patch: BrandUpdate, auth: AuthContext = SERVICE): Promise<Brand> {\n return this.ctx.http.request<Brand>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a brand by id. */\n async deleteBrand(brandId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(brandId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Label, LabelList, LabelInput, LabelUpdate } from \"./label-types\";\n\nexport type { Label, LabelList, LabelInput, LabelUpdate } from \"./label-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Label Service (`/label/labels`): CRUD over product labels (e.g.\n * \"Sale\", \"New\"). Server-side; defaults to the service token. The path carries\n * no `{tenant}` segment — the tenant comes from the token.\n */\nexport class LabelService {\n static readonly channel = \"label\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/label/labels`;\n }\n\n /** List all labels. */\n async listLabels(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<LabelList> {\n return this.ctx.http.request<LabelList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one label by id. */\n async getLabel(labelId: string, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n });\n }\n\n /** Create a label. */\n async createLabel(input: LabelInput, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a label by id. */\n async updateLabel(labelId: string, input: LabelUpdate, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a label by id. */\n async patchLabel(labelId: string, patch: LabelUpdate, auth: AuthContext = SERVICE): Promise<Label> {\n return this.ctx.http.request<Label>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a label by id. */\n async deleteLabel(labelId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(labelId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Country, CountryList, CountryUpdate, Region, RegionList } from \"./country-types\";\n\nexport type { Country, CountryList, CountryUpdate, Region, RegionList } from \"./country-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Country Service (`/country/{tenant}/…`): countries and regions\n * master data. Server-side; defaults to the service token (reads also work\n * with an anonymous token). Countries are predefined — list/get/patch only\n * (no create/delete).\n */\nexport class CountryService {\n static readonly channel = \"country\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/country/${this.ctx.tenant}`;\n }\n\n /** List all countries. */\n async listCountries(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CountryList> {\n return this.ctx.http.request<CountryList>({\n method: \"GET\",\n path: `${this.base()}/countries`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one country by code. */\n async getCountry(countryCode: string, auth: AuthContext = SERVICE): Promise<Country> {\n return this.ctx.http.request<Country>({\n method: \"GET\",\n path: `${this.base()}/countries/${encodeURIComponent(countryCode)}`,\n auth,\n });\n }\n\n /** Partially update a country by code. Resolves once accepted (no response body). */\n async patchCountry(countryCode: string, patch: CountryUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/countries/${encodeURIComponent(countryCode)}`,\n auth,\n body: patch,\n });\n }\n\n /** List all regions. */\n async listRegions(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<RegionList> {\n return this.ctx.http.request<RegionList>({\n method: \"GET\",\n path: `${this.base()}/regions`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one region by code. */\n async getRegion(regionCode: string, auth: AuthContext = SERVICE): Promise<Region> {\n return this.ctx.http.request<Region>({\n method: \"GET\",\n path: `${this.base()}/regions/${encodeURIComponent(regionCode)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Currency,\n CurrencyList,\n CurrencyInput,\n CurrencyUpdate,\n CurrencyCreated,\n ExchangeRate,\n ExchangeRateList,\n ExchangeRateInput,\n ExchangeRateUpdate,\n ExchangeRateCreated,\n} from \"./currency-types\";\n\nexport type {\n Currency,\n CurrencyList,\n CurrencyInput,\n CurrencyUpdate,\n CurrencyCreated,\n ExchangeRate,\n ExchangeRateList,\n ExchangeRateInput,\n ExchangeRateUpdate,\n ExchangeRateCreated,\n} from \"./currency-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Currency Service (`/currency/{tenant}/…`): currencies and exchange\n * rates. Server-side; defaults to the service token.\n */\nexport class CurrencyService {\n static readonly channel = \"currency\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/currency/${this.ctx.tenant}`;\n }\n\n // --- Currencies ---\n\n /** List all currencies. */\n async listCurrencies(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CurrencyList> {\n return this.ctx.http.request<CurrencyList>({\n method: \"GET\",\n path: `${this.base()}/currencies`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one currency by code. */\n async getCurrency(code: string, auth: AuthContext = SERVICE): Promise<Currency> {\n return this.ctx.http.request<Currency>({\n method: \"GET\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create a currency. */\n async createCurrency(input: CurrencyInput, auth: AuthContext = SERVICE): Promise<CurrencyCreated> {\n return this.ctx.http.request<CurrencyCreated>({\n method: \"POST\",\n path: `${this.base()}/currencies`,\n auth,\n body: input,\n });\n }\n\n /** Update a currency by code. */\n async updateCurrency(code: string, input: CurrencyUpdate, auth: AuthContext = SERVICE): Promise<Currency> {\n return this.ctx.http.request<Currency>({\n method: \"PUT\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a currency by code. */\n async deleteCurrency(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/currencies/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n // --- Exchange rates ---\n\n /** List all exchange rates. */\n async listExchangeRates(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ExchangeRateList> {\n return this.ctx.http.request<ExchangeRateList>({\n method: \"GET\",\n path: `${this.base()}/exchanges`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one exchange rate by code. */\n async getExchangeRate(code: string, auth: AuthContext = SERVICE): Promise<ExchangeRate> {\n return this.ctx.http.request<ExchangeRate>({\n method: \"GET\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n });\n }\n\n /** Create an exchange rate. */\n async createExchangeRate(input: ExchangeRateInput, auth: AuthContext = SERVICE): Promise<ExchangeRateCreated> {\n return this.ctx.http.request<ExchangeRateCreated>({\n method: \"POST\",\n path: `${this.base()}/exchanges`,\n auth,\n body: input,\n });\n }\n\n /** Update an exchange rate by code. */\n async updateExchangeRate(code: string, input: ExchangeRateUpdate, auth: AuthContext = SERVICE): Promise<ExchangeRate> {\n return this.ctx.http.request<ExchangeRate>({\n method: \"PUT\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete an exchange rate by code. */\n async deleteExchangeRate(code: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/exchanges/${encodeURIComponent(code)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Site,\n SiteList,\n FindSiteInput,\n Zone,\n ZoneList,\n ShippingMethod,\n ShippingMethodList,\n ShippingGroup,\n ShippingGroupList,\n CgRelation,\n CgRelationList,\n QuoteInput,\n QuoteResult,\n QuoteSlotInput,\n ShippingFee,\n MinimumFee,\n ResourceCreated,\n DeliveryWindowList,\n DeliveryWindowValidation,\n DeliveryTime,\n DeliveryTimeList,\n DeliveryTimeInput,\n DeliveryTimeUpdate,\n DeliverySlot,\n DeliverySlotList,\n DeliveryCycleInput,\n ShippingPatch,\n DeliveryCreated,\n} from \"./shipping-types\";\n\nexport type {\n Site,\n SiteList,\n FindSiteInput,\n Zone,\n ZoneList,\n ShippingMethod,\n ShippingMethodList,\n ShippingGroup,\n ShippingGroupList,\n CgRelation,\n CgRelationList,\n QuoteInput,\n QuoteResult,\n QuoteSlotInput,\n ShippingFee,\n MinimumFee,\n ResourceCreated,\n DeliveryWindow,\n DeliveryWindowList,\n DeliveryWindowValidation,\n DeliveryTime,\n DeliveryTimeList,\n DeliveryTimeInput,\n DeliveryTimeUpdate,\n DeliverySlot,\n DeliverySlotList,\n DeliveryCycleInput,\n ShippingPatch,\n DeliveryCreated,\n} from \"./shipping-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * The zone whose `shipTo` covers `country`, else the default zone, else the first.\n *\n * Pure — no client, no request. Pair it with `listZones(site, { expand:\n * \"methods,fees\" })` to turn a zone list into the one zone a checkout should\n * offer.\n *\n * The `?? []` guards a field the generated schema marks required. Emporix'\n * schema has been wrong about optionality before, and a storefront that throws\n * on an unexpected shape is worse than one that finds no zone.\n */\nexport function resolveZone(zones: ZoneList | undefined, country: string): Zone | undefined {\n if (!zones || zones.length === 0) return undefined;\n const c = country.trim().toUpperCase();\n const byCountry = c\n ? zones.find((z) => (z.shipTo ?? []).some((s) => s.country?.toUpperCase() === c))\n : undefined;\n return byCountry ?? zones.find((z) => z.default) ?? zones[0];\n}\n\n/**\n * The applicable fee: the highest `minOrderValue` at or below `cartTotal`, else\n * the first fee.\n *\n * `<=`, not `<`: a total that exactly meets a free-shipping threshold gets free\n * shipping.\n */\nexport function pickFee(fees: ShippingFee[] | undefined, cartTotal: number): ShippingFee | undefined {\n if (!fees || fees.length === 0) return undefined;\n const eligible = fees\n .filter((f) => (f.minOrderValue?.amount ?? 0) <= cartTotal)\n .sort((a, b) => (b.minOrderValue?.amount ?? 0) - (a.minOrderValue?.amount ?? 0));\n return eligible[0] ?? fees[0];\n}\n\n/**\n * Emporix Shipping Service (`/shipping/{tenant}/…`), Phase 1 — config: sites,\n * zones, methods, cost/quote, groups, customer-group relations. Server-side;\n * defaults to the service token. Most methods are site-scoped and take `site`\n * first; `findSites` is tenant-level. Delivery scheduling is Phase 2.\n */\nexport class ShippingService {\n static readonly channel = \"shipping\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/shipping/${this.ctx.tenant}`;\n }\n\n private siteBase(site: string): string {\n return `${this.base()}/${encodeURIComponent(site)}`;\n }\n\n // --- Sites ---\n\n /** Find shipping-related sites by postal code (`POST /findSite`). */\n async findSites(input: FindSiteInput, auth: AuthContext = SERVICE): Promise<SiteList> {\n return this.ctx.http.request<SiteList>({\n method: \"POST\",\n path: `${this.base()}/findSite`,\n auth,\n body: input,\n });\n }\n\n // --- Zones ---\n\n /** List shipping zones for a site. */\n async listZones(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ZoneList> {\n return this.ctx.http.request<ZoneList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping zone. */\n async getZone(site: string, zoneId: string, auth: AuthContext = SERVICE): Promise<Zone> {\n return this.ctx.http.request<Zone>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n });\n }\n\n /** Create a shipping zone. */\n async createZone(site: string, zone: Zone, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/zones`,\n auth,\n body: zone,\n });\n }\n\n /** Replace a shipping zone. */\n async updateZone(site: string, zoneId: string, zone: Zone, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n body: zone,\n });\n }\n\n /** Partially update a shipping zone. */\n async patchZone(site: string, zoneId: string, patch: Zone, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a shipping zone. */\n async deleteZone(site: string, zoneId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}`,\n auth,\n });\n }\n\n // --- Methods (per zone) ---\n\n /** List shipping methods of a zone. */\n async listMethods(\n site: string,\n zoneId: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ShippingMethodList> {\n return this.ctx.http.request<ShippingMethodList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping method. */\n async getMethod(site: string, zoneId: string, methodId: string, auth: AuthContext = SERVICE): Promise<ShippingMethod> {\n return this.ctx.http.request<ShippingMethod>({\n method: \"GET\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n });\n }\n\n /** Create a shipping method in a zone. */\n async createMethod(site: string, zoneId: string, method: ShippingMethod, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods`,\n auth,\n body: method,\n });\n }\n\n /** Replace a shipping method. */\n async updateMethod(site: string, zoneId: string, methodId: string, method: ShippingMethod, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n body: method,\n });\n }\n\n /** Partially update a shipping method. */\n async patchMethod(site: string, zoneId: string, methodId: string, patch: ShippingMethod, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Delete a shipping method. */\n async deleteMethod(site: string, zoneId: string, methodId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/zones/${encodeURIComponent(zoneId)}/methods/${encodeURIComponent(methodId)}`,\n auth,\n });\n }\n\n // --- Cost / quote ---\n\n /** Calculate the final shipping cost (`POST /quote`). */\n async quote(site: string, input: QuoteInput, auth: AuthContext = SERVICE): Promise<QuoteResult> {\n return this.ctx.http.request<QuoteResult>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote`,\n auth,\n body: input,\n });\n }\n\n /** Calculate the minimum shipping cost (`POST /quote/minimum`). */\n async quoteMinimum(site: string, input: QuoteInput, auth: AuthContext = SERVICE): Promise<MinimumFee> {\n return this.ctx.http.request<MinimumFee>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote/minimum`,\n auth,\n body: input,\n });\n }\n\n /** Calculate the shipping cost for a given slot (`POST /quote/slot`). */\n async quoteSlot(site: string, input: QuoteSlotInput, auth: AuthContext = SERVICE): Promise<MinimumFee> {\n return this.ctx.http.request<MinimumFee>({\n method: \"POST\",\n path: `${this.siteBase(site)}/quote/slot`,\n auth,\n body: input,\n });\n }\n\n // --- Groups ---\n\n /** List shipping groups for a site. */\n async listGroups(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ShippingGroupList> {\n return this.ctx.http.request<ShippingGroupList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/groups`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one shipping group. */\n async getGroup(site: string, groupId: string, auth: AuthContext = SERVICE): Promise<ShippingGroup> {\n return this.ctx.http.request<ShippingGroup>({\n method: \"GET\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n });\n }\n\n /** Create a shipping group. */\n async createGroup(site: string, group: ShippingGroup, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/groups`,\n auth,\n body: group,\n });\n }\n\n /** Replace a shipping group. */\n async updateGroup(site: string, groupId: string, group: ShippingGroup, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n body: group,\n });\n }\n\n /** Delete a shipping group. */\n async deleteGroup(site: string, groupId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/groups/${encodeURIComponent(groupId)}`,\n auth,\n });\n }\n\n // --- Customer-group relations ---\n\n /** List customer-group relations for a site. */\n async listCgRelations(\n site: string,\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<CgRelationList> {\n return this.ctx.http.request<CgRelationList>({\n method: \"GET\",\n path: `${this.siteBase(site)}/cgrelations`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a customer's customer-group relations. */\n async getCgRelations(site: string, customerId: string, auth: AuthContext = SERVICE): Promise<CgRelation> {\n return this.ctx.http.request<CgRelation>({\n method: \"GET\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n /** Create a customer-group relation. */\n async createCgRelation(site: string, relation: CgRelation, auth: AuthContext = SERVICE): Promise<ResourceCreated> {\n return this.ctx.http.request<ResourceCreated>({\n method: \"POST\",\n path: `${this.siteBase(site)}/cgrelations`,\n auth,\n body: relation,\n });\n }\n\n /** Update a customer's customer-group relations. */\n async updateCgRelations(site: string, customerId: string, relation: CgRelation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n body: relation,\n });\n }\n\n /** Delete a customer's customer-group relation. */\n async deleteCgRelation(site: string, customerId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.siteBase(site)}/cgrelations/${encodeURIComponent(customerId)}`,\n auth,\n });\n }\n\n // --- Phase 2: delivery windows ---\n\n /** Retrieve delivery windows for a delivery area + cart. */\n async getAreaDeliveryWindows(deliveryAreaId: string, cartId: string, auth: AuthContext = SERVICE): Promise<DeliveryWindowList> {\n return this.ctx.http.request<DeliveryWindowList>({\n method: \"GET\",\n path: `${this.base()}/areaDeliveryTimes/${encodeURIComponent(deliveryAreaId)}/${encodeURIComponent(cartId)}`,\n auth,\n });\n }\n\n /** Retrieve delivery windows for a cart. */\n async getCartDeliveryWindows(cartId: string, auth: AuthContext = SERVICE): Promise<DeliveryWindowList> {\n return this.ctx.http.request<DeliveryWindowList>({\n method: \"GET\",\n path: `${this.base()}/actualDeliveryWindows/${encodeURIComponent(cartId)}`,\n auth,\n });\n }\n\n /** Increment the delivery-window counter. */\n async incrementDeliveryWindowCounter(input: DeliveryWindowValidation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/actualDeliveryWindows/incrementCounter`,\n auth,\n body: input,\n });\n }\n\n /** Validate a delivery window. Resolves when valid; throws otherwise. */\n async validateDeliveryWindow(input: DeliveryWindowValidation, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.base()}/deliveryWindowValidation`,\n auth,\n body: input,\n });\n }\n\n // --- Phase 2: delivery times ---\n\n /** List all delivery times. */\n async listDeliveryTimes(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<DeliveryTimeList> {\n return this.ctx.http.request<DeliveryTimeList>({\n method: \"GET\",\n path: `${this.base()}/delivery-times`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one delivery time. */\n async getDeliveryTime(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<DeliveryTime> {\n return this.ctx.http.request<DeliveryTime>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n });\n }\n\n /** Create a delivery time. */\n async createDeliveryTime(input: DeliveryTimeInput, auth: AuthContext = SERVICE): Promise<DeliveryCreated> {\n return this.ctx.http.request<DeliveryCreated>({\n method: \"POST\",\n path: `${this.base()}/delivery-times`,\n auth,\n body: input,\n });\n }\n\n /** Create multiple delivery times (`POST /delivery-times/bulk`). */\n async createDeliveryTimesBulk(inputs: DeliveryTimeInput[], auth: AuthContext = SERVICE): Promise<DeliveryCreated[]> {\n return this.ctx.http.request<DeliveryCreated[]>({\n method: \"POST\",\n path: `${this.base()}/delivery-times/bulk`,\n auth,\n body: inputs,\n });\n }\n\n /** Replace a delivery time. */\n async updateDeliveryTime(deliveryTimeId: string, input: DeliveryTimeUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a delivery time (JSON-Patch op array). */\n async patchDeliveryTime(deliveryTimeId: string, ops: ShippingPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a delivery time. */\n async deleteDeliveryTime(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}`,\n auth,\n });\n }\n\n // --- Phase 2: delivery time slots ---\n\n /** List slots of a delivery time. */\n async listSlots(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<DeliverySlotList> {\n return this.ctx.http.request<DeliverySlotList>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n });\n }\n\n /** Retrieve one slot. */\n async getSlot(deliveryTimeId: string, slotId: string, auth: AuthContext = SERVICE): Promise<DeliverySlot> {\n return this.ctx.http.request<DeliverySlot>({\n method: \"GET\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n });\n }\n\n /** Create a slot in a delivery time. */\n async createSlot(deliveryTimeId: string, input: DeliverySlot, auth: AuthContext = SERVICE): Promise<DeliveryCreated> {\n return this.ctx.http.request<DeliveryCreated>({\n method: \"POST\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n body: input,\n });\n }\n\n /** Replace a slot. */\n async updateSlot(deliveryTimeId: string, slotId: string, input: DeliverySlot, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a slot (JSON-Patch op array). */\n async patchSlot(deliveryTimeId: string, slotId: string, ops: ShippingPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a slot. */\n async deleteSlot(deliveryTimeId: string, slotId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots/${encodeURIComponent(slotId)}`,\n auth,\n });\n }\n\n /** Delete all slots of a delivery time. */\n async deleteAllSlots(deliveryTimeId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/delivery-times/${encodeURIComponent(deliveryTimeId)}/slots`,\n auth,\n });\n }\n\n // --- Phase 2: delivery cycles ---\n\n /** Generate a delivery cycle (`POST /delivery-cycles/generate`). Returns the cycle id. */\n async generateDeliveryCycle(input: DeliveryCycleInput, auth: AuthContext = SERVICE): Promise<string> {\n return this.ctx.http.request<string>({\n method: \"POST\",\n path: `${this.base()}/delivery-cycles/generate`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { InvoiceJobDraft, InvoiceJobCreated, InvoiceJob } from \"./invoice-types\";\n\nexport type { InvoiceJobDraft, InvoiceJobCreated, InvoiceJob } from \"./invoice-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Invoice Service (`/invoice/{tenant}/…`): create invoice-generation jobs and\n * poll their status. Backend-only — default auth: service.\n */\nexport class InvoiceService {\n static readonly channel = \"invoice\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/invoice/${this.ctx.tenant}/jobs/invoices`;\n }\n\n /** Create an invoice-generation job (`POST …/jobs/invoices`, 201). */\n async createJob(draft: InvoiceJobDraft, auth: AuthContext = SERVICE): Promise<InvoiceJobCreated> {\n return this.ctx.http.request<InvoiceJobCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /** Retrieve a job and its per-order results (`GET …/jobs/invoices/{jobId}`). */\n async getJob(jobId: string, auth: AuthContext = SERVICE): Promise<InvoiceJob> {\n return this.ctx.http.request<InvoiceJob>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(jobId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport { errorFromResponse } from \"../core/errors\";\nimport type {\n Quote,\n QuoteDraft,\n QuoteCreated,\n QuoteUpdate,\n QuoteHistory,\n ListQuotesQuery,\n QuoteReason,\n QuoteReasonDraft,\n QuoteReasonUpdate,\n QuoteReasonCreated,\n ListQuoteReasonsQuery,\n} from \"./quote-types\";\n\nexport type {\n Quote,\n QuoteDraft,\n QuoteCreated,\n QuoteUpdate,\n QuoteHistory,\n ListQuotesQuery,\n QuoteReason,\n QuoteReasonDraft,\n QuoteReasonUpdate,\n QuoteReasonCreated,\n ListQuoteReasonsQuery,\n} from \"./quote-types\";\n\n/**\n * Quote Service (`/quote/{tenant}/…`): B2B quotes and quote reasons. Quotes are\n * customer-owned and never anonymous, so every method takes a REQUIRED `auth`:\n * pass `auth.customer(token)` for a customer's own quotes, or `auth.service()`\n * (an admin token) for `quote_manage`-scoped ops (`delete`, reason mutations).\n */\nexport class QuoteService {\n static readonly channel = \"quote\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private quotesBase(): string {\n return `/quote/${this.ctx.tenant}/quotes`;\n }\n\n private _reasons?: QuoteReasonsResource;\n /** Quote reasons config (`/quote-reasons`). CRUD sub-resource. */\n get reasons(): QuoteReasonsResource {\n return (this._reasons ??= new QuoteReasonsResource(this.ctx));\n }\n\n /** List quotes, wrapped in {@link PaginatedItems}. Pass `{}` for no filter. */\n async list(query: ListQuotesQuery, auth: AuthContext): Promise<PaginatedItems<Quote>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n const q: Record<string, string | number> = { pageNumber, pageSize };\n if (query.q) q.q = query.q;\n if (query.sort) q.sort = query.sort;\n return requestPage<Quote>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.quotesBase(),\n auth,\n query: q,\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Create a quote (`POST /quotes`, 201). */\n async create(draft: QuoteDraft, auth: AuthContext): Promise<QuoteCreated> {\n return this.ctx.http.request<QuoteCreated>({\n method: \"POST\",\n path: this.quotesBase(),\n auth,\n body: draft,\n });\n }\n\n /** Retrieve one quote by id. */\n async get(quoteId: string, auth: AuthContext): Promise<Quote> {\n return this.ctx.http.request<Quote>({\n method: \"GET\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n });\n }\n\n /** Apply an update-op array to a quote (`PATCH /quotes/{id}`, 204). */\n async update(quoteId: string, update: QuoteUpdate, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n body: update,\n });\n }\n\n /** Delete a quote (`DELETE /quotes/{id}`). Requires the admin `quote_manage` scope. */\n async delete(quoteId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}`,\n auth,\n });\n }\n\n /** Retrieve a quote's change history (`GET /quotes/{id}/history`). */\n async history(quoteId: string, auth: AuthContext): Promise<QuoteHistory> {\n return this.ctx.http.request<QuoteHistory>({\n method: \"GET\",\n path: `${this.quotesBase()}/${encodeURIComponent(quoteId)}/history`,\n auth,\n });\n }\n\n /**\n * Generate a quote PDF (`POST /quotes/{id}/pdf`). Returns the raw PDF bytes.\n * Uses `requestRaw` (no typed-error mapping) — a non-2xx is thrown explicitly.\n */\n async generatePdf(quoteId: string, auth: AuthContext): Promise<Blob> {\n const path = `${this.quotesBase()}/${encodeURIComponent(quoteId)}/pdf`;\n const res = await this.ctx.http.requestRaw({ method: \"POST\", path, auth });\n if (!res.ok) {\n const body = await res.text();\n throw errorFromResponse(res.status, `POST ${path} failed: ${res.status}`, body);\n }\n return await res.blob();\n }\n}\n\n/**\n * Quote reasons (`/quote/{tenant}/quote-reasons`). Config data. Like the rest\n * of the quote domain, every method takes a REQUIRED `auth`: reads accept a\n * customer or admin token; `create`/`update`/`delete` need the admin\n * `quote.quote_manage` scope (`auth.service()`).\n */\nexport class QuoteReasonsResource {\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/quote/${this.ctx.tenant}/quote-reasons`;\n }\n\n /** List reasons, wrapped in {@link PaginatedItems}. Pass `{}` for no paging override. */\n async list(query: ListQuoteReasonsQuery, auth: AuthContext): Promise<PaginatedItems<QuoteReason>> {\n const pageNumber = query.pageNumber ?? 1;\n const pageSize = query.pageSize ?? 60;\n return requestPage<QuoteReason>(\n this.ctx.http,\n {\n method: \"GET\",\n path: this.base(),\n auth,\n query: { pageNumber, pageSize },\n },\n {\n pageNumber,\n pageSize,\n ...(query.totalCount === undefined ? {} : { totalCount: query.totalCount }),\n },\n );\n }\n\n /** Retrieve one reason by id. */\n async get(reasonId: string, auth: AuthContext): Promise<QuoteReason> {\n return this.ctx.http.request<QuoteReason>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n });\n }\n\n /** Create a reason (`POST /quote-reasons`). Requires the admin `quote_manage` scope. */\n async create(draft: QuoteReasonDraft, auth: AuthContext): Promise<QuoteReasonCreated> {\n return this.ctx.http.request<QuoteReasonCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: draft,\n });\n }\n\n /**\n * Replace a reason (`PUT /quote-reasons/{id}`, 204). `draft.metadata.version`\n * is required for optimistic locking. Requires the admin `quote_manage` scope.\n */\n async update(reasonId: string, draft: QuoteReasonUpdate, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n body: draft,\n });\n }\n\n /** Delete a reason (`DELETE /quote-reasons/{id}`). Requires the admin `quote_manage` scope. */\n async delete(reasonId: string, auth: AuthContext): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(reasonId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Return, ReturnList, ReturnInput, ReturnUpdate, ReturnPatch, ReturnCreated } from \"./returns-types\";\n\nexport type { Return, ReturnList, ReturnInput, ReturnUpdate, ReturnPatch, ReturnCreated } from \"./returns-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Returns Service (`/return/{tenant}/returns`): CRUD over returns\n * (RMA). Defaults to the service token; for customer self-service (own returns)\n * pass `auth.customer(token)` (the React hooks do this).\n */\nexport class ReturnsService {\n static readonly channel = \"returns\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/return/${this.ctx.tenant}/returns`;\n }\n\n /** List returns (paged; supports `pageSize`/`pageNumber`/`sort`/`q`). */\n async listReturns(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ReturnList> {\n return this.ctx.http.request<ReturnList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve one return by id. */\n async getReturn(returnId: string, auth: AuthContext = SERVICE): Promise<Return> {\n return this.ctx.http.request<Return>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n });\n }\n\n /** Create a return. Returns the created `{ id }`. */\n async createReturn(input: ReturnInput, auth: AuthContext = SERVICE): Promise<ReturnCreated> {\n return this.ctx.http.request<ReturnCreated>({\n method: \"POST\",\n path: this.base(),\n auth,\n body: input,\n });\n }\n\n /** Replace a return by id (`PUT`). */\n async updateReturn(returnId: string, input: ReturnUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a return by id (`PATCH`, JSON-Patch op-array). */\n async patchReturn(returnId: string, ops: ReturnPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete a return by id. */\n async deleteReturn(returnId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(returnId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n IndexConfig,\n IndexConfigCreated,\n IndexPublicConfig,\n ReindexInput,\n ReindexJob,\n ReindexJobInput,\n} from \"./indexing-types\";\n\nexport type {\n IndexConfig,\n IndexConfigCreated,\n IndexPublicConfig,\n ReindexInput,\n ReindexJob,\n ReindexJobInput,\n ReindexEntityType,\n ReindexJobStatus,\n} from \"./indexing-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/** Options for {@link IndexingService.listReindexJobs}. */\nexport interface ListReindexJobsOptions {\n pageNumber?: number;\n pageSize?: number;\n /** Raw Emporix `q` filter string. */\n q?: string;\n /** Emporix sort syntax, e.g. `\"metadata.createdAt:desc\"`. */\n sort?: string;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/**\n * Emporix Indexing Service (`/indexing/{tenant}/…`): search-index provider\n * configurations and reindex. Server-side; defaults to the service token.\n *\n * On the `BATTERY_INCLUDED` provider every write validates the stored\n * `indexName`/`writeKey` against the search backend *before* it takes effect:\n * invalid credentials fail with `400` and when that validation is itself\n * unreachable the call fails with `502`. Either way nothing is written — so a\n * `400` from these methods can mean the credentials are wrong rather than the\n * request body.\n */\nexport class IndexingService {\n static readonly channel = \"indexing\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/indexing/${this.ctx.tenant}`;\n }\n\n /** List indexing configurations. */\n async listConfigurations(auth: AuthContext = SERVICE): Promise<IndexConfig[]> {\n return this.ctx.http.request<IndexConfig[]>({ method: \"GET\", path: `${this.base()}/configurations`, auth });\n }\n\n /** Get a configuration by provider name. */\n async getConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<IndexConfig> {\n return this.ctx.http.request<IndexConfig>({\n method: \"GET\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /** Create a configuration. Nothing is stored if credential validation fails. */\n async createConfiguration(input: IndexConfig, auth: AuthContext = SERVICE): Promise<IndexConfigCreated> {\n return this.ctx.http.request<IndexConfigCreated>({\n method: \"POST\",\n path: `${this.base()}/configurations`,\n auth,\n body: input,\n });\n }\n\n /** Update a configuration. Left unchanged if credential validation fails. */\n async updateConfiguration(provider: string, input: IndexConfig, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a configuration by provider name. */\n async deleteConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /** List public indexing configurations. */\n async listPublicConfigurations(auth: AuthContext = SERVICE): Promise<IndexPublicConfig[]> {\n return this.ctx.http.request<IndexPublicConfig[]>({ method: \"GET\", path: `${this.base()}/public/configurations`, auth });\n }\n\n /** Get a public configuration by provider name. */\n async getPublicConfiguration(provider: string, auth: AuthContext = SERVICE): Promise<IndexPublicConfig> {\n return this.ctx.http.request<IndexPublicConfig>({\n method: \"GET\",\n path: `${this.base()}/public/configurations/${encodeURIComponent(provider)}`,\n auth,\n });\n }\n\n /**\n * Create a reindex job (replaces {@link reindex}). A `FULL` reindex of the\n * given `entityType`; set `rag: true` to also rebuild the RAG vector index\n * (PRODUCT only). Resolves to the created job (`201`) or, when a job for that\n * `entityType` is already `IN_PROGRESS`, that running job (`200`).\n *\n * On `BATTERY_INCLUDED` with `entityType: \"PRODUCT\"` the stored credentials\n * are validated first; no job is created on the `400`/`502` cases above.\n */\n async createReindexJob(input: ReindexJobInput, auth: AuthContext = SERVICE): Promise<ReindexJob> {\n return this.ctx.http.request<ReindexJob>({\n method: \"POST\",\n path: `${this.base()}/reindex-jobs`,\n auth,\n body: input,\n });\n }\n\n /** List reindex jobs (paginated). */\n async listReindexJobs(\n opts: ListReindexJobsOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<ReindexJob>> {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 50;\n const query: Record<string, string | number | undefined> = { pageNumber, pageSize };\n if (opts.q !== undefined) query.q = opts.q;\n if (opts.sort !== undefined) query.sort = opts.sort;\n return requestPage<ReindexJob>(\n this.ctx.http,\n {\n method: \"GET\",\n path: `${this.base()}/reindex-jobs`,\n query,\n auth,\n },\n {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n },\n );\n }\n\n /** Fetch one reindex job by id. */\n async getReindexJob(reindexJobId: string, auth: AuthContext = SERVICE): Promise<ReindexJob> {\n return this.ctx.http.request<ReindexJob>({\n method: \"GET\",\n path: `${this.base()}/reindex-jobs/${encodeURIComponent(reindexJobId)}`,\n auth,\n });\n }\n\n /**\n * Trigger a reindex. On `BATTERY_INCLUDED` the same credential validation\n * runs first, so this can fail with `400`/`502` before any job starts.\n * @deprecated since 2026-06-18, removal 2026-12-01 — use {@link createReindexJob}\n * (`createReindexJob({ entityType: \"PRODUCT\" })`), which returns a trackable job.\n */\n async reindex(input: ReindexInput, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"POST\", path: `${this.base()}/reindex`, auth, body: input });\n }\n}\n","import type { ClientContext, PaginatedItems } from \"../core/context\";\nimport { requestPage, type PageParams } from \"../core/paged\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n FilterNode,\n IndexExportPackage,\n IndexField,\n IndexImportResult,\n IndexJob,\n IndexRequest,\n IndexSelection,\n JobId,\n QueryNode,\n SavedQuery,\n SavedQueryId,\n SavedQueryRequest,\n SearchHit as GenSearchHit,\n SearchIndex as GenSearchIndex,\n SearchPost,\n} from \"../generated/search-service\";\n\n/** A matching document. Stored fields come back as stored, plus `id` and `_score`. */\nexport type SearchHit = GenSearchHit;\n/**\n * Body of {@link SearchService.search}: a direct search (`index` plus `queries`,\n * `filters` or both) or a saved-search call (`searchQueryId` plus `query`).\n */\nexport type SearchInput = SearchPost;\n/** One query node: an `and` group, an `or` group, or one query. */\nexport type SearchQueryNode = QueryNode;\n/** One filter node: an `and` group, an `or` group, or one comparison. */\nexport type SearchFilterNode = FilterNode;\n/** A stored saved search. The request field `index` comes back as `indexId`. */\nexport type SavedSearch = SavedQuery;\n/** Body of {@link SearchService.upsertSavedSearch}. */\nexport type SavedSearchInput = SavedQueryRequest;\n/** `201` response of {@link SearchService.upsertSavedSearch}. */\nexport type SavedSearchCreated = SavedQueryId;\n/** A search index on one custom schema type. */\nexport type SearchIndex = GenSearchIndex;\n/** Body of {@link SearchService.upsertIndex}. */\nexport type SearchIndexInput = IndexRequest;\n/** One field of a search index. */\nexport type SearchIndexField = IndexField;\n/** An index build or deletion job. */\nexport type SearchIndexJob = IndexJob;\n/** The id of the job an index write started. */\nexport type SearchIndexJobRef = JobId;\n/** One index to export: `{ type, id }`. */\nexport type SearchIndexSelection = IndexSelection;\n/**\n * Exported index configuration: `exportedAt` plus `data`, a base64-encoded JSON\n * array. {@link SearchService.importIndexes} takes it back unchanged.\n */\nexport type SearchIndexExport = IndexExportPackage;\n/** Result for one imported index. `jobId` and `jobType` are present when a build job started. */\nexport type SearchIndexImportResult = IndexImportResult;\n\n/** Paging, sort, filter and projection for the list reads. */\nexport interface SearchListOptions {\n pageNumber?: number;\n /** Defaults to 60, the server's default. */\n pageSize?: number;\n /** `field`, `field:ASC` or `field:DESC`, comma-separated. Default: `metadata.createdAt` descending. */\n sort?: string;\n /** Raw Emporix `q` filter string. */\n q?: string;\n /** Comma-separated properties to return. */\n fields?: string;\n /** Ask for `X-Total-Count` — becomes a request header, not a query parameter. */\n totalCount?: boolean;\n}\n\n/** Options for {@link SearchService.listSavedSearches} and {@link SearchService.listIndexes}. */\nexport interface SearchTypeListOptions extends SearchListOptions {\n /** One custom schema type. Omitted, the list spans every custom schema type, and each item carries `type`. */\n type?: string;\n}\n\n/**\n * Options for {@link SearchService.search}. Without `sort`, hits are ordered by\n * relevance; without `fields`, each hit carries `_score`.\n */\nexport type SearchOptions = Omit<SearchListOptions, \"q\">;\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\nfunction pageQuery(opts: SearchListOptions): { query: Record<string, string | number>; page: PageParams } {\n const pageNumber = opts.pageNumber ?? 1;\n const pageSize = opts.pageSize ?? 60;\n const query: Record<string, string | number> = { pageNumber, pageSize };\n if (opts.sort !== undefined) query.sort = opts.sort;\n if (opts.q !== undefined) query.q = opts.q;\n if (opts.fields !== undefined) query.fields = opts.fields;\n const page: PageParams = {\n pageNumber,\n pageSize,\n ...(opts.totalCount === undefined ? {} : { totalCount: opts.totalCount }),\n };\n return { query, page };\n}\n\n/**\n * Emporix Search Service (`/search/{tenant}/…`, **preview**): searches the\n * documents of a custom schema type, stores saved searches, and manages the\n * search indexes and the jobs that build them. Only custom schema types are\n * supported so far. Server-side; defaults to the service token.\n *\n * Scopes: `search.search_read` for every read and for `search`,\n * `search.search_manage` for every write. Searching also needs read access to\n * the documents themselves (`schema.custominstance_read`, `custom.{type}_read`\n * or `custom.{type}_read_own`), or it answers `403`.\n */\nexport class SearchService {\n static readonly channel = \"search\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/search/${this.ctx.tenant}`;\n }\n\n /**\n * Search the documents of one custom schema type. Paging, `sort` and\n * `fields` travel as query parameters, not in the body.\n *\n * Filter and sort fields must be indexed on the index the search uses, or the\n * call answers `400`. A saved-search call (`{ searchQueryId, query }`) answers\n * `404` when no saved search has that id for `type`, and `502` means the\n * Schema Service could not confirm that `type` is a custom entity.\n *\n * @example\n * const hits = await client.search.search(\"vehicle\", {\n * index: \"vehicles\",\n * queries: [{ type: \"TEXT\", query: \"diesel\", field: \"name.en\" }],\n * filters: { field: \"status\", operator: \"EQ\", value: \"ACTIVE\" },\n * });\n */\n async search(\n type: string,\n input: SearchInput,\n opts: SearchOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SearchHit>> {\n const { query, page } = pageQuery(opts);\n return requestPage<SearchHit>(\n this.ctx.http,\n {\n method: \"POST\",\n path: `${this.base()}/search/${encodeURIComponent(type)}`,\n auth,\n query,\n body: input,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n },\n page,\n );\n }\n\n /** List saved searches of one custom schema type (`opts.type`), or of every type. */\n async listSavedSearches(\n opts: SearchTypeListOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SavedSearch>> {\n const { query, page } = pageQuery(opts);\n const t = opts.type;\n return requestPage<SavedSearch>(\n this.ctx.http,\n {\n method: \"GET\",\n path: t === undefined ? `${this.base()}/search/queries` : `${this.base()}/search/${encodeURIComponent(t)}/queries`,\n auth,\n query,\n },\n page,\n );\n }\n\n /** Fetch one saved search. */\n async getSavedSearch(\n type: string,\n id: string,\n opts: { fields?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<SavedSearch> {\n return this.ctx.http.request<SavedSearch>({\n method: \"GET\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n\n /**\n * Create or replace a saved search. Resolves to `{ id }` when it was created\n * (`201`) and to `undefined` when it replaced an existing one (`204`).\n *\n * A replace needs the stored `metadata.version` — `400` without it, `409`\n * when it is stale. `index` must already exist for `type` (`404`\n * otherwise). Saving does not start an index build.\n */\n async upsertSavedSearch(\n type: string,\n id: string,\n input: SavedSearchInput,\n auth: AuthContext = SERVICE,\n ): Promise<SavedSearchCreated | undefined> {\n return this.ctx.http.request<SavedSearchCreated | undefined>({\n method: \"PUT\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a saved search. Does not start an index build. */\n async deleteSavedSearch(type: string, id: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/queries/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List search indexes of one custom schema type (`opts.type`), or of every type. */\n async listIndexes(\n opts: SearchTypeListOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<PaginatedItems<SearchIndex>> {\n const { query, page } = pageQuery(opts);\n const t = opts.type;\n return requestPage<SearchIndex>(\n this.ctx.http,\n {\n method: \"GET\",\n path: t === undefined ? `${this.base()}/search/indexes` : `${this.base()}/search/${encodeURIComponent(t)}/indexes`,\n auth,\n query,\n },\n page,\n );\n }\n\n /** Fetch one search index. */\n async getIndex(\n type: string,\n id: string,\n opts: { fields?: string } = {},\n auth: AuthContext = SERVICE,\n ): Promise<SearchIndex> {\n return this.ctx.http.request<SearchIndex>({\n method: \"GET\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n\n /**\n * Create or update a search index. Resolves to the id of the job that builds\n * it (`202`) — for a new index, a changed field list, or an index whose\n * status is `building` or `failed` — and to `undefined` (`204`) when the\n * index is `ready` and its fields are unchanged; `name` and `description`\n * still change then. Track the job with {@link getJob}.\n *\n * `metadata.version` is optional on an update too. When sent, it is an\n * optimistic lock: a stale one answers `409`, as does a job that is already\n * running for this index.\n */\n async upsertIndex(\n type: string,\n id: string,\n input: SearchIndexInput,\n auth: AuthContext = SERVICE,\n ): Promise<SearchIndexJobRef | undefined> {\n return this.ctx.http.request<SearchIndexJobRef | undefined>({\n method: \"PUT\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n body: input,\n });\n }\n\n /**\n * Start deleting a search index. Resolves to the id of the job that removes\n * it (`202`); `409` means a job for this index is already running.\n */\n async deleteIndex(type: string, id: string, auth: AuthContext = SERVICE): Promise<SearchIndexJobRef> {\n return this.ctx.http.request<SearchIndexJobRef>({\n method: \"DELETE\",\n path: `${this.base()}/search/${encodeURIComponent(type)}/indexes/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * Export the configuration of the selected indexes as one package, to be\n * imported on another tenant with {@link importIndexes}. The decoded `data`\n * holds `id`, `type`, `fields` and the optional `name` and `description` of\n * each index, not its `status` or `metadata`. `404` when a selected index does\n * not exist, `400` for an empty selection.\n */\n async exportIndexes(selections: SearchIndexSelection[], auth: AuthContext = SERVICE): Promise<SearchIndexExport> {\n return this.ctx.http.request<SearchIndexExport>({\n method: \"POST\",\n path: `${this.base()}/search/indexes/export`,\n auth,\n body: selections,\n idempotent: true, // pure read over POST — safe to replay on 5xx/429\n });\n }\n\n /**\n * Create or update every index in a package from {@link exportIndexes}, with\n * the same checks as {@link upsertIndex}. Resolves to one result per index,\n * in package order; `jobId` and `jobType` are absent for a ready index whose\n * fields did not change.\n *\n * Not atomic: when an index fails, the ones before it stay created or updated\n * and the call throws that index's error — `400` for an unreadable package or\n * an invalid field, `409` for a running job or a stale `metadata.version`.\n */\n async importIndexes(pkg: SearchIndexExport, auth: AuthContext = SERVICE): Promise<SearchIndexImportResult[]> {\n return this.ctx.http.request<SearchIndexImportResult[]>({\n method: \"POST\",\n path: `${this.base()}/search/indexes/import`,\n auth,\n body: pkg,\n });\n }\n\n /** List index jobs of the tenant. */\n async listJobs(opts: SearchListOptions = {}, auth: AuthContext = SERVICE): Promise<PaginatedItems<SearchIndexJob>> {\n const { query, page } = pageQuery(opts);\n return requestPage<SearchIndexJob>(\n this.ctx.http,\n { method: \"GET\", path: `${this.base()}/jobs`, auth, query },\n page,\n );\n }\n\n /** Fetch one index job. */\n async getJob(id: string, opts: { fields?: string } = {}, auth: AuthContext = SERVICE): Promise<SearchIndexJob> {\n return this.ctx.http.request<SearchIndexJob>({\n method: \"GET\",\n path: `${this.base()}/jobs/${encodeURIComponent(id)}`,\n auth,\n ...(opts.fields === undefined ? {} : { query: { fields: opts.fields } }),\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { SseEvent } from \"../core/sse\";\nimport type { Page } from \"../generated/import-service\";\nimport type {\n ImportCancelResult,\n ImportConfig,\n ImportHealthThresholds,\n ImportJobGroup,\n ImportLicense,\n ImportStats,\n ImportStatsQuery,\n ImportErrorRecord,\n ImportPage,\n ImportRecordOutcome,\n ImportRun,\n ImportRunDetail,\n ImportRunEvent,\n ImportRunDiagnostics,\n ImportRunDiagnosticsQuery,\n ImportRunInput,\n ImportRunStream,\n ImportSchedule,\n ImportStream,\n ImportStreamOrder,\n ImportedRecord,\n} from \"./imports-types\";\n\nexport type {\n ImportCancelResult,\n ImportConfig,\n ImportDiagnosticKind,\n ImportDiagnosticRecord,\n ImportErrorRecord,\n ImportHealthThresholds,\n ImportJobGroup,\n ImportLicense,\n ImportPage,\n ImportRecordOutcome,\n ImportRun,\n ImportRunDetail,\n ImportRunDiagnostics,\n ImportRunDiagnosticsQuery,\n ImportRunEvent,\n ImportRunInput,\n ImportRunMode,\n ImportRunStatus,\n ImportRunStream,\n ImportSchedule,\n ImportStats,\n ImportStatsQuery,\n ImportStream,\n ImportStreamOrder,\n ImportedRecord,\n} from \"./imports-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\nconst DEFAULT_PAGE_SIZE = 50;\n\n/** One-based paging options, shared by every paginated import endpoint. */\nexport interface ImportPageOptions {\n /** One-based page number. Default `1`. */\n pageNumber?: number;\n /** Page size. Default `50`. The service may clamp this — the result echoes what it used. */\n pageSize?: number;\n}\n\n/** Options for {@link ImportService.searchRecords}. `type` is required. */\nexport interface SearchImportedRecordsOptions extends ImportPageOptions {\n /** The target type to search, one of {@link ImportService.listDataTypes}. */\n type: string;\n /**\n * Case-insensitive substring match on the record's natural key. This is NOT\n * the Emporix query language — `field:value`, comparisons and boolean logic\n * are not supported here.\n */\n search?: string;\n /** Filter by import outcome. Omit for records of all outcomes. */\n outcome?: ImportRecordOutcome;\n}\n\n/** Options for {@link ImportService.searchStreamRecords}. */\nexport type SearchStreamRecordsOptions = Omit<SearchImportedRecordsOptions, \"type\">;\n\n/** The wire shape of a paginated import response. */\ntype WirePage<T> = Page & { content?: T[] };\n\nfunction pageArgs(opts: ImportPageOptions): { pageNumber: number; pageSize: number } {\n return { pageNumber: opts.pageNumber ?? 1, pageSize: opts.pageSize ?? DEFAULT_PAGE_SIZE };\n}\n\n/**\n * Spring page → {@link ImportPage}. `pageNumber` / `pageSize` prefer the\n * server's echo over what was requested, because the service clamps `size`;\n * reporting the requested value would misdescribe the page you actually got.\n */\nfunction toPage<T>(\n wire: WirePage<T>,\n requested: { pageNumber: number; pageSize: number },\n): ImportPage<T> {\n const totalPages = wire.totalPages ?? 0;\n const pageNumber = (wire.number ?? requested.pageNumber - 1) + 1;\n return {\n items: wire.content ?? [],\n pageNumber,\n pageSize: wire.size ?? requested.pageSize,\n hasNextPage: pageNumber < totalPages,\n totalElements: wire.totalElements ?? 0,\n totalPages,\n };\n}\n\n/**\n * One SSE frame → one typed event. Anything unparseable, non-object or under an\n * event name this SDK does not model becomes `unknown` instead of throwing: a\n * preview service is allowed to grow event types, and a run in flight must not\n * die because of one frame we cannot read.\n */\nfunction toRunEvent(ev: SseEvent): ImportRunEvent {\n let payload: unknown;\n try {\n payload = JSON.parse(ev.data);\n } catch {\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n if (typeof payload !== \"object\" || payload === null) {\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n switch (ev.event) {\n case \"snapshot\": {\n const detail = payload as ImportRunDetail;\n return { type: \"snapshot\", run: detail.run, streams: detail.streams ?? [] };\n }\n case \"stream\":\n return { type: \"stream\", stream: payload as ImportRunStream };\n case \"run\":\n return { type: \"run\", run: payload as ImportRun };\n default:\n return { type: \"unknown\", event: ev.event, data: ev.data };\n }\n}\n\n/**\n * Emporix Import Service (`/importtool/{tenant}/…`): import configurations,\n * their streams and schedules, run control, and the records an import produced.\n *\n * **Service-account only.** Every operation requires the\n * `importtool.import_trigger` scope on the client credentials, and the service\n * has no customer or anonymous variant — which is why `@viu/emporix-sdk-react`\n * ships no hooks for it. Call it from a server (Node, a Next Route Handler or\n * Server Action), never from a browser bundle.\n *\n * **Paging is one-based here, zero-based on the wire.** The facade takes\n * `pageNumber` starting at 1 and sends `page = pageNumber - 1`, matching the\n * rest of the SDK.\n *\n * **Upstream marks every operation as preview**: the contract may change without\n * a major version bump, and nearly every response field is optional in the spec.\n * Treat run counters and status as possibly absent.\n */\nexport class ImportService {\n static readonly channel = \"import\" as const;\n\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/importtool/${this.ctx.tenant}`;\n }\n\n /** List every import configuration of the tenant. */\n async listConfigs(auth: AuthContext = SERVICE): Promise<ImportConfig[]> {\n return this.ctx.http.request<ImportConfig[]>({\n method: \"GET\",\n path: `${this.base()}/configs`,\n auth,\n });\n }\n\n /** Fetch one configuration by id. */\n async getConfig(id: string, auth: AuthContext = SERVICE): Promise<ImportConfig> {\n return this.ctx.http.request<ImportConfig>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /** List the streams of one configuration. */\n async listStreams(configId: string, auth: AuthContext = SERVICE): Promise<ImportStream[]> {\n return this.ctx.http.request<ImportStream[]>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/streams`,\n auth,\n });\n }\n\n /** Fetch one stream by id. */\n async getStream(id: string, auth: AuthContext = SERVICE): Promise<ImportStream> {\n return this.ctx.http.request<ImportStream>({\n method: \"GET\",\n path: `${this.base()}/streams/${encodeURIComponent(id)}`,\n auth,\n });\n }\n\n /**\n * The order in which a configuration's streams run, and the dependencies\n * behind it. Read it here instead of deriving it from the stream definitions:\n * mapping transformations add dependencies that no single stream shows, so a\n * self-computed order can differ from the one used at run time.\n *\n * The result lists stream **names**, while {@link triggerRun}'s `streamIds`\n * takes stream **ids** — map through {@link listStreams} before passing a\n * subset back.\n */\n async getStreamOrder(configId: string, auth: AuthContext = SERVICE): Promise<ImportStreamOrder> {\n return this.ctx.http.request<ImportStreamOrder>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/stream-order`,\n auth,\n });\n }\n\n /**\n * Fetch a configuration's schedule. Resolves to `null` when none is\n * configured — the service answers `204`, not `404`, so an absent schedule is\n * a normal result rather than an error.\n */\n async getSchedule(\n configId: string,\n auth: AuthContext = SERVICE,\n ): Promise<ImportSchedule | null> {\n const res = await this.ctx.http.request<ImportSchedule | undefined>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n auth,\n });\n return res ?? null;\n }\n\n /**\n * Create or replace a configuration's schedule.\n *\n * **`cron` is a six-field Spring expression** (`second minute hour\n * day-of-month month day-of-week`). The familiar five-field `\"0 * * * *\"` is\n * not «hourly» here, it is invalid, and the service answers `400` rather than\n * storing it — which it used to do, leaving a schedule that silently never\n * fired.\n *\n * A `404` means no configuration with that id, so there is nothing to\n * schedule. Use {@link deleteSchedule} to clear a schedule that outlived its\n * configuration.\n */\n async setSchedule(\n configId: string,\n input: ImportSchedule,\n auth: AuthContext = SERVICE,\n ): Promise<ImportSchedule> {\n return this.ctx.http.request<ImportSchedule>({\n method: \"PUT\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n body: input,\n auth,\n });\n }\n\n /**\n * Remove a configuration's schedule. It then runs only when triggered.\n *\n * **Idempotent, and deliberately not gated on the configuration existing.**\n * Removing a schedule that is not there also resolves — and unlike\n * {@link setSchedule}, this does not require the configuration to exist. That\n * is the point: a schedule left behind by a deleted configuration is exactly\n * what needs removing, so refusing those would leave them with no way out.\n *\n * The service answers `204`, so this resolves to `void` rather than to the\n * removed schedule.\n */\n async deleteSchedule(configId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/schedule`,\n auth,\n });\n }\n\n /**\n * Trigger a run. `mode` defaults to `DELTA` server-side; `dryRun: true` maps\n * and validates without writing to the target.\n *\n * A dry run can also hand back what it *would* have written: pass\n * `sampleSize` (1–100, default 25) and read the run's `dryRunSample`. Set\n * `origin` to name what asked for the run — `trigger` only distinguishes\n * `MANUAL` from `SCHEDULED`, so without it a dashboard click and an\n * integration scenario are indistinguishable in the history. Note the service\n * **rejects** an `origin` over 40 characters instead of shortening it.\n *\n * `streamIds` runs a subset — see {@link ImportRunInput} for what is rejected,\n * and note it takes ids where {@link getStreamOrder} reports names.\n *\n * A run executes each stream's **published** mappings. Publishing needs\n * `importtool.import_manage` and is not part of the public API, so it happens\n * in the Management Dashboard's Import Tool rather than through this SDK; a dry\n * run with `mappings: \"draft\"` checks unpublished changes first. A stream whose\n * mappings were never published is `ABORTED` in the run details, and the run\n * finishes `PARTIAL`.\n *\n * **A refused run still resolves.** When `streamIds` names such a stream, or\n * every enabled stream is in that state, the service answers `200` with the\n * run anyway, and the run then finishes `ABORTED` with a `message` naming the\n * streams. Read it back with {@link getRun}, or follow it with\n * {@link streamRun}, before treating a resolved call as a started import.\n *\n * Not retried on a 5xx: a POST that timed out may already have queued a run.\n *\n * @example\n * ```ts\n * // Preview the mapping without writing anything.\n * const run = await client.imports.triggerRun(configId, {\n * dryRun: true,\n * sampleSize: 5,\n * origin: \"Dashboard\",\n * });\n * for (const row of run.dryRunSample ?? []) {\n * console.log(row.stream, row.targetType, row.key, row.fields);\n * }\n * ```\n */\n async triggerRun(\n configId: string,\n input: ImportRunInput = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportRun> {\n return this.ctx.http.request<ImportRun>({\n method: \"POST\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/runs`,\n body: input,\n auth,\n });\n }\n\n /** List a configuration's runs, newest first. */\n async listRuns(\n configId: string,\n opts: ImportPageOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportRun>> {\n const args = pageArgs(opts);\n const wire = await this.ctx.http.request<WirePage<ImportRun>>({\n method: \"GET\",\n path: `${this.base()}/configs/${encodeURIComponent(configId)}/runs`,\n query: { page: args.pageNumber - 1, size: args.pageSize },\n auth,\n });\n return toPage(wire, args);\n }\n\n /** Fetch one run with its per-stream progress. */\n async getRun(runId: string, auth: AuthContext = SERVICE): Promise<ImportRunDetail> {\n return this.ctx.http.request<ImportRunDetail>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}`,\n auth,\n });\n }\n\n /**\n * Stream a run's progress as Server-Sent Events: an initial `snapshot`, then a\n * `stream` event per processed batch, then a final `run` event when the run\n * finishes. The iterator ends when the service closes the stream; breaking out\n * of the `for await` aborts the request.\n *\n * Two ways this differs from every other method here. It does not re-auth: a\n * `401` while opening the stream throws instead of minting a fresh token and\n * retrying once, so a long-lived consumer should be ready to re-open (or fall\n * back to polling {@link getRun}). And frames this SDK version cannot read\n * arrive as `{ type: \"unknown\" }` rather than throwing — see\n * {@link ImportRunEvent}.\n */\n async *streamRun(\n runId: string,\n auth: AuthContext = SERVICE,\n ): AsyncIterable<ImportRunEvent> {\n const frames = this.ctx.http.requestStream({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/events`,\n auth,\n });\n for await (const frame of frames) yield toRunEvent(frame);\n }\n\n /**\n * Request cancellation of a run. `force: true` hard-stops it immediately;\n * without it the run stops at the next safe point. The service answers `202`\n * with `accepted: false` when the run is unknown or already finished — that is\n * a result, not an error. A state conflict may instead come back as a `409`,\n * which does throw.\n */\n async cancelRun(\n runId: string,\n opts: { force?: boolean } = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportCancelResult> {\n const query: Record<string, string | number | undefined> = {};\n if (opts.force) query.force = \"true\";\n return this.ctx.http.request<ImportCancelResult>({\n method: \"POST\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/cancel`,\n query,\n auth,\n });\n }\n\n /** List the errors recorded during a run. */\n async listRunErrors(\n runId: string,\n opts: ImportPageOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportErrorRecord>> {\n const args = pageArgs(opts);\n const wire = await this.ctx.http.request<WirePage<ImportErrorRecord>>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/errors`,\n query: { page: args.pageNumber - 1, size: args.pageSize },\n auth,\n });\n return toPage(wire, args);\n }\n\n /**\n * The rows behind a run's feed-quality counters: source rows that repeated a\n * natural key (`kind: \"REPEATED_KEY\"`, counted as `duplicateKeys`) and child\n * lines with no parent to attach to (`\"UNRESOLVED_PARENT\"`, counted as\n * `unresolvedParents`). Neither is a failure, which is why these rows are not\n * in {@link listRunErrors}.\n *\n * **A capped sample** — see {@link ImportRunDiagnostics} before reading\n * `rows.length` as the size of the problem. `limit` defaults to 500 here\n * (1–50 000); {@link downloadRunDiagnosticsCsv} defaults to 50 000.\n */\n async listRunDiagnostics(\n runId: string,\n query: ImportRunDiagnosticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportRunDiagnostics> {\n return this.ctx.http.request<ImportRunDiagnostics>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/diagnostics`,\n query: { ...query },\n auth,\n });\n }\n\n /**\n * The same rows as {@link listRunDiagnostics}, as CSV text for a spreadsheet\n * or a ticket. Comment lines above the header record whether `limit` or the\n * recording cap cut rows off, so the file keeps that context when shared on\n * its own. `limit` defaults to 50 000 here, not 500.\n *\n * Every value is quoted, and a value starting with `=`, `+`, `-` or `@` is\n * prefixed with an apostrophe so spreadsheet software does not evaluate source\n * data as a formula. Strip it if you parse the file instead of opening it.\n */\n async downloadRunDiagnosticsCsv(\n runId: string,\n query: ImportRunDiagnosticsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<string> {\n // `request` falls back to the raw text when a body is not JSON, and a CSV\n // with a quoted multi-column header never is.\n return this.ctx.http.request<string>({\n method: \"GET\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/diagnostics/csv`,\n query: { ...query },\n auth,\n });\n }\n\n /** List the target types that hold imported records — the valid `type` values for {@link searchRecords}. */\n async listDataTypes(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({\n method: \"GET\",\n path: `${this.base()}/data/types`,\n auth,\n });\n }\n\n /** Search imported records of one target type. */\n async searchRecords(\n opts: SearchImportedRecordsOptions,\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportedRecord>> {\n const args = pageArgs(opts);\n const query: Record<string, string | number | undefined> = {\n type: opts.type,\n page: args.pageNumber - 1,\n size: args.pageSize,\n };\n if (opts.search !== undefined) query.search = opts.search;\n if (opts.outcome !== undefined) query.outcome = opts.outcome;\n const wire = await this.ctx.http.request<WirePage<ImportedRecord>>({\n method: \"GET\",\n path: `${this.base()}/data/records`,\n query,\n auth,\n });\n return toPage(wire, args);\n }\n\n /** Search the imported records produced by one stream. */\n async searchStreamRecords(\n streamId: string,\n opts: SearchStreamRecordsOptions = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportPage<ImportedRecord>> {\n const args = pageArgs(opts);\n const query: Record<string, string | number | undefined> = {\n page: args.pageNumber - 1,\n size: args.pageSize,\n };\n if (opts.search !== undefined) query.search = opts.search;\n if (opts.outcome !== undefined) query.outcome = opts.outcome;\n const wire = await this.ctx.http.request<WirePage<ImportedRecord>>({\n method: \"GET\",\n path: `${this.base()}/data/streams/${encodeURIComponent(streamId)}/records`,\n query,\n auth,\n });\n return toPage(wire, args);\n }\n\n // ─── Analytics and retry (upstream release 2026-08-26) ─────────────────────\n\n /**\n * Aggregated import analytics.\n *\n * Every section is optional in the response, and `sections` is what decides\n * which the service computes — asking for all of them on a tenant with a long\n * history is the expensive call, so name the ones you render.\n *\n * `from` / `to` are ISO timestamps. Omitted, the service picks its own window;\n * do not assume it is «everything».\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async stats(\n query: ImportStatsQuery = {},\n auth: AuthContext = SERVICE,\n ): Promise<ImportStats> {\n return this.ctx.http.request<ImportStats>({\n method: \"GET\",\n path: `${this.base()}/stats`,\n query: { ...query },\n auth,\n });\n }\n\n /**\n * The dashboard's job groups: configurations with their runs grouped under\n * them.\n *\n * Named after the path rather than the summary («Retrieving job groups»)\n * because the resource lives under `/dashboard` and is shaped for that view —\n * a caller wanting plain run history wants {@link listRuns}.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async listJobGroups(auth: AuthContext = SERVICE): Promise<ImportJobGroup[]> {\n return this.ctx.http.request<ImportJobGroup[]>({\n method: \"GET\",\n path: `${this.base()}/dashboard/job-groups`,\n auth,\n });\n }\n\n /**\n * The tenant's health thresholds — the error rates above which a stream counts\n * as degraded or failing in {@link stats}.\n *\n * Read-only here: changing them needs `importtool.import_manage`, which this\n * service does not cover.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async getHealthThresholds(\n auth: AuthContext = SERVICE,\n ): Promise<ImportHealthThresholds> {\n return this.ctx.http.request<ImportHealthThresholds>({\n method: \"GET\",\n path: `${this.base()}/settings/health-thresholds`,\n auth,\n });\n }\n\n /**\n * The tenant's import limits and current consumption.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async getLicense(auth: AuthContext = SERVICE): Promise<ImportLicense> {\n return this.ctx.http.request<ImportLicense>({\n method: \"GET\",\n path: `${this.base()}/license`,\n auth,\n });\n }\n\n /**\n * Retry only the failed records of a finished run.\n *\n * Returns a **new** run — the retry is its own run with `retry: true`, not a\n * mutation of the original. Poll it with {@link getRun} or follow it with\n * {@link streamRun} exactly as you would a triggered run. Like one, it runs the\n * published mappings and can finish `ABORTED`.\n *\n * Not retried on a 5xx, for the same reason {@link triggerRun} is not: a POST\n * that timed out may already have queued the retry.\n *\n * **Preview upstream**: the contract may change without a major bump.\n */\n async retryRun(runId: string, auth: AuthContext = SERVICE): Promise<ImportRun> {\n return this.ctx.http.request<ImportRun>({\n method: \"POST\",\n path: `${this.base()}/runs/${encodeURIComponent(runId)}/retry`,\n auth,\n });\n }\n\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { ChangelogHistoryResponse } from \"../generated/audit-logs-changelog\";\nimport type { AuditLogPage, AuditLogQuery } from \"./audit-log-types\";\n\nexport type {\n AuditLogChangeType,\n AuditLogEntry,\n AuditLogPage,\n AuditLogPathChange,\n AuditLogQuery,\n AuditLogRelatedEntity,\n} from \"./audit-log-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * The body envelope → {@link AuditLogPage}. `pageNumber` / `pageSize` come from\n * the server's echo rather than from what was requested, so the page describes\n * what actually came back.\n */\nfunction toPage(wire: ChangelogHistoryResponse): AuditLogPage {\n const pageNumber = wire.page ?? 1;\n const totalPages = wire.totalPages ?? 0;\n return {\n items: wire.items ?? [],\n pageNumber,\n pageSize: wire.size ?? 0,\n hasNextPage: pageNumber < totalPages,\n totalElements: wire.totalElements ?? 0,\n totalPages,\n };\n}\n\n/**\n * Emporix Audit Log Service, upstream «Audit Logs (Changelog) Service»\n * (`/changelog/{tenant}/changelogs`): tenant-wide change history for platform\n * entities — who changed what, when, and from which value to which.\n *\n * **Service-account only.** Reads need the `changelog.changelog_read` scope\n * (`changelog.changelog_manage` also grants it) on the client credentials. There\n * is no customer or anonymous variant, which is why `@viu/emporix-sdk-react`\n * ships no hooks for it — call it from a server, never from a browser bundle.\n *\n * **Upstream marks this service as preview**: the contract may change without a\n * major version bump, and nearly every field of an entry is optional in the\n * spec.\n */\nexport class AuditLogService {\n static readonly channel = \"audit-log\" as const;\n\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/changelog/${this.ctx.tenant}`;\n }\n\n /**\n * List changes across the tenant, newest occurrence first.\n *\n * **The window defaults to the last 30 days.** When `q` carries no\n * conjunctive `occurredAt` lower bound, the service silently applies a\n * trailing 30-day window — an unfiltered call is *not* «everything ever». Pass\n * an explicit top-level or `AND`-ed `occurredAt` range to widen it; an\n * `occurredAt` that appears only inside an `OR` arm does not lift the default.\n *\n * **`entityId` needs `entity`.** Filtering by id alone is a `400`, not an\n * empty page. There is no path-based history endpoint either — scoping to one\n * document means naming both in `q`:\n *\n * @example\n * ```ts\n * // The history of one order.\n * const page = await client.auditLogs.list({\n * q: `entity:order entityId:${orderId}`,\n * });\n * for (const entry of page.items) {\n * console.log(entry.at, entry.actor, entry.paths);\n * }\n *\n * // Everything a given person changed in June, across all entities.\n * await client.auditLogs.list({\n * q: 'actor:\"Jane Doe\" occurredAt:(>\"2026-06-01T00:00:00.000Z\" AND <\"2026-07-01T00:00:00.000Z\")',\n * pageSize: 100,\n * });\n * ```\n */\n async list(opts: AuditLogQuery = {}, auth: AuthContext = SERVICE): Promise<AuditLogPage> {\n const wire = await this.ctx.http.request<ChangelogHistoryResponse>({\n method: \"GET\",\n path: `${this.base()}/changelogs`,\n // Absent options are left off the wire entirely; the service applies its\n // own defaults (page 1, size 20) and sends back what it used.\n query: { q: opts.q, page: opts.pageNumber, size: opts.pageSize },\n auth,\n });\n return toPage(wire);\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Unit,\n UnitInput,\n UnitUpdate,\n UnitCreated,\n ConversionFactorInput,\n ConversionFactorResult,\n ConvertUnitInput,\n ConvertUnitResult,\n} from \"./unit-handling-types\";\n\nexport type {\n Unit,\n UnitInput,\n UnitUpdate,\n UnitCreated,\n ConversionFactorInput,\n ConversionFactorResult,\n ConvertUnitInput,\n ConvertUnitResult,\n} from \"./unit-handling-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Unit Handling Service (`/unit-handling/{tenant}/…`): units CRUD, unit\n * types, and conversion commands. Server-side; defaults to the service token.\n */\nexport class UnitHandlingService {\n static readonly channel = \"unit-handling\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/unit-handling/${this.ctx.tenant}`;\n }\n\n /** Find units (filter/sort/page). */\n async listUnits(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<Unit[]> {\n return this.ctx.http.request<Unit[]>({\n method: \"GET\",\n path: `${this.base()}/units`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a unit by code. */\n async getUnit(unitCode: string, auth: AuthContext = SERVICE): Promise<Unit> {\n return this.ctx.http.request<Unit>({\n method: \"GET\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n });\n }\n\n /** Add a new unit. */\n async createUnit(input: UnitInput, auth: AuthContext = SERVICE): Promise<UnitCreated> {\n return this.ctx.http.request<UnitCreated>({ method: \"POST\", path: `${this.base()}/units`, auth, body: input });\n }\n\n /** Update a unit by code. */\n async updateUnit(unitCode: string, input: UnitUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a unit by code. */\n async deleteUnit(unitCode: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/units/${encodeURIComponent(unitCode)}`,\n auth,\n });\n }\n\n /** Delete multiple units by code (bulk). The codes are sent as the request body. */\n async deleteUnits(codes: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/units`,\n auth,\n body: codes,\n });\n }\n\n /** Fetch a conversion factor (`PUT /units/conversion-factor-commands`). */\n async getConversionFactor(input: ConversionFactorInput, auth: AuthContext = SERVICE): Promise<ConversionFactorResult> {\n return this.ctx.http.request<ConversionFactorResult>({\n method: \"PUT\",\n path: `${this.base()}/units/conversion-factor-commands`,\n auth,\n body: input,\n });\n }\n\n /** Convert a value between units (`PUT /units/convert-unit-commands`). */\n async convertUnit(input: ConvertUnitInput, auth: AuthContext = SERVICE): Promise<ConvertUnitResult> {\n return this.ctx.http.request<ConvertUnitResult>({\n method: \"PUT\",\n path: `${this.base()}/units/convert-unit-commands`,\n auth,\n body: input,\n });\n }\n\n /** List all unit types. */\n async listUnitTypes(auth: AuthContext = SERVICE): Promise<string[]> {\n return this.ctx.http.request<string[]>({ method: \"GET\", path: `${this.base()}/types`, auth });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type { Catalog, CatalogList, CatalogInput, CatalogUpdate, CatalogPatch, CatalogCreated } from \"./catalog-types\";\n\nexport type { Catalog, CatalogList, CatalogInput, CatalogUpdate, CatalogPatch, CatalogCreated } from \"./catalog-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Catalog Management (`/catalog/{tenant}/catalogs`): CRUD over catalogs.\n * Server-side; defaults to the service token. `updateCatalog` is an upsert (PUT).\n */\nexport class CatalogService {\n static readonly channel = \"catalog\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/catalog/${this.ctx.tenant}/catalogs`;\n }\n\n /** List catalogs (filtered/sorted). */\n async listCatalogs(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<CatalogList> {\n return this.ctx.http.request<CatalogList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a catalog by id. */\n async getCatalog(catalogId: string, auth: AuthContext = SERVICE): Promise<Catalog> {\n return this.ctx.http.request<Catalog>({\n method: \"GET\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n });\n }\n\n /** Retrieve all catalogs that contain a category. */\n async getCatalogsForCategory(categoryId: string, auth: AuthContext = SERVICE): Promise<CatalogList> {\n return this.ctx.http.request<CatalogList>({\n method: \"GET\",\n path: `${this.base()}/categories/${encodeURIComponent(categoryId)}`,\n auth,\n });\n }\n\n /** Create a catalog. */\n async createCatalog(input: CatalogInput, auth: AuthContext = SERVICE): Promise<CatalogCreated> {\n return this.ctx.http.request<CatalogCreated>({ method: \"POST\", path: this.base(), auth, body: input });\n }\n\n /** Upsert a catalog by id (`PUT`). */\n async updateCatalog(catalogId: string, input: CatalogUpdate, auth: AuthContext = SERVICE): Promise<CatalogCreated> {\n return this.ctx.http.request<CatalogCreated>({\n method: \"PUT\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n body: input,\n });\n }\n\n /** Partially update a catalog by id (`PATCH`). */\n async patchCatalog(catalogId: string, patch: CatalogPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n body: patch,\n });\n }\n\n /** Remove a catalog by id. */\n async deleteCatalog(catalogId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/${encodeURIComponent(catalogId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery } from \"../core/query\";\nimport { SEARCH_PAGING, splitQuery } from \"../core/search\";\nimport type {\n Vendor,\n VendorList,\n VendorInput,\n VendorUpdate,\n VendorCreated,\n VendorSearchQuery,\n VendorLocation,\n VendorLocationList,\n VendorLocationInput,\n VendorLocationUpdate,\n} from \"./vendor-types\";\n\nexport type {\n Vendor,\n VendorList,\n VendorInput,\n VendorUpdate,\n VendorCreated,\n VendorSearchQuery,\n VendorLocation,\n VendorLocationList,\n VendorLocationInput,\n VendorLocationUpdate,\n} from \"./vendor-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Vendor Service (`/vendor/{tenant}/…`): vendors and their locations.\n * Server-side; defaults to the service token. PUT methods are upserts. Vendor\n * locations are the vendor's own pickup/warehouse locations (distinct from the\n * customer-management `client.locations`).\n */\nexport class VendorService {\n static readonly channel = \"vendor\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/vendor/${this.ctx.tenant}`;\n }\n\n // --- Vendors ---\n\n /** List all vendors. */\n async listVendors(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<VendorList> {\n return this.ctx.http.request<VendorList>({\n method: \"GET\",\n path: `${this.base()}/vendors`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a vendor by id. */\n async getVendor(vendorId: string, auth: AuthContext = SERVICE): Promise<Vendor> {\n return this.ctx.http.request<Vendor>({\n method: \"GET\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n });\n }\n\n /**\n * Search vendors (`POST /vendors/search`). A built filter in `q` is resolved to\n * a string; paging, sort and fields go in the query string.\n */\n async searchVendors(query: VendorSearchQuery, auth: AuthContext = SERVICE): Promise<VendorList> {\n const input =\n query.q !== undefined\n ? { ...query, q: resolveQuery(query.q, { compoundLogicalQuery: false }) }\n : query;\n return this.ctx.http.request<VendorList>({\n method: \"POST\",\n path: `${this.base()}/vendors/search`,\n auth,\n ...splitQuery(input, SEARCH_PAGING),\n });\n }\n\n /** Create a vendor. */\n async createVendor(input: VendorInput, auth: AuthContext = SERVICE): Promise<VendorCreated> {\n return this.ctx.http.request<VendorCreated>({ method: \"POST\", path: `${this.base()}/vendors`, auth, body: input });\n }\n\n /** Upsert a vendor by id (`PUT`). */\n async updateVendor(vendorId: string, input: VendorUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a vendor by id. */\n async deleteVendor(vendorId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/vendors/${encodeURIComponent(vendorId)}`,\n auth,\n });\n }\n\n // --- Vendor locations ---\n\n /** List all vendor locations. */\n async listVendorLocations(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<VendorLocationList> {\n return this.ctx.http.request<VendorLocationList>({\n method: \"GET\",\n path: `${this.base()}/locations`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a vendor location by id. */\n async getVendorLocation(locationId: string, auth: AuthContext = SERVICE): Promise<VendorLocation> {\n return this.ctx.http.request<VendorLocation>({\n method: \"GET\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n });\n }\n\n /** Create a vendor location. */\n async createVendorLocation(input: VendorLocationInput, auth: AuthContext = SERVICE): Promise<VendorCreated> {\n return this.ctx.http.request<VendorCreated>({ method: \"POST\", path: `${this.base()}/locations`, auth, body: input });\n }\n\n /** Upsert a vendor location by id (`PUT`). */\n async updateVendorLocation(locationId: string, input: VendorLocationUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PUT\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n body: input,\n });\n }\n\n /** Delete a vendor location by id. */\n async deleteVendorLocation(locationId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/locations/${encodeURIComponent(locationId)}`,\n auth,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport { resolveQuery } from \"../core/query\";\nimport { splitQuery } from \"../core/search\";\nimport type {\n AdminCustomer,\n AdminCustomerList,\n AdminCustomerInput,\n AdminCustomerUpdate,\n AdminCustomerPatch,\n AdminCustomerCreated,\n AdminCustomerSearchQuery,\n AdminCustomerAddress,\n AdminCustomerAddressList,\n AdminCustomerAddressInput,\n AdminCustomerAddressUpdate,\n AdminPasswordMigrationRetention,\n AdminPasswordMigrationRetentionInput,\n AdminCustomerImport,\n AdminCustomerImportResult,\n} from \"./customer-admin-types\";\n\nexport type {\n AdminCustomer,\n AdminCustomerList,\n AdminCustomerInput,\n AdminCustomerUpdate,\n AdminCustomerPatch,\n AdminCustomerCreated,\n AdminCustomerSearchQuery,\n AdminCustomerAddress,\n AdminCustomerAddressList,\n AdminCustomerAddressInput,\n AdminCustomerAddressUpdate,\n AdminPasswordMigrationRetention,\n AdminPasswordMigrationRetentionInput,\n AdminCustomerImport,\n AdminCustomerImportAccount,\n AdminCustomerLegacyAuth,\n AdminCustomerImportResult,\n} from \"./customer-admin-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Customer Service — tenant/seller-managed customer profiles and\n * addresses (`/customer/{tenant}/customers`). Server-side; defaults to the\n * service token. Distinct from the storefront `client.customers`.\n */\nexport class CustomerAdminService {\n static readonly channel = \"customer-admin\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/customer/${this.ctx.tenant}/customers`;\n }\n\n private customerPath(customerNumber: string): string {\n return `${this.base()}/${encodeURIComponent(customerNumber)}`;\n }\n\n private configPath(): string {\n return `/customer/${this.ctx.tenant}/config/password-migration-retention`;\n }\n\n private addressPath(customerNumber: string, addressId: string): string {\n return `${this.customerPath(customerNumber)}/addresses/${encodeURIComponent(addressId)}`;\n }\n\n // --- Customers ---\n\n /** List customers. */\n async listCustomers(query: Record<string, string | number> = {}, auth: AuthContext = SERVICE): Promise<AdminCustomerList> {\n return this.ctx.http.request<AdminCustomerList>({\n method: \"GET\",\n path: this.base(),\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /**\n * Search customers (`POST /customers/search`). A built filter in `q` is resolved\n * to a string; `pageNumber`, `pageSize`, `sort` and `expand` go in the query string.\n */\n async searchCustomers(query: AdminCustomerSearchQuery, auth: AuthContext = SERVICE): Promise<AdminCustomerList> {\n const input =\n query.q !== undefined\n ? { ...query, q: resolveQuery(query.q, { compoundLogicalQuery: false }) }\n : query;\n return this.ctx.http.request<AdminCustomerList>({\n method: \"POST\",\n path: `${this.base()}/search`,\n auth,\n ...splitQuery(input, [\"pageNumber\", \"pageSize\", \"sort\", \"expand\"]),\n });\n }\n\n /** Retrieve a customer profile by number. */\n async getCustomer(customerNumber: string, auth: AuthContext = SERVICE): Promise<AdminCustomer> {\n return this.ctx.http.request<AdminCustomer>({ method: \"GET\", path: this.customerPath(customerNumber), auth });\n }\n\n /** Create a customer. */\n async createCustomer(input: AdminCustomerInput, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"POST\", path: this.base(), auth, body: input });\n }\n\n /** Upsert a customer profile by number (`PUT`). */\n async upsertCustomer(customerNumber: string, input: AdminCustomerUpdate, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"PUT\", path: this.customerPath(customerNumber), auth, body: input });\n }\n\n /** Partially update a customer profile (`PATCH`). */\n async patchCustomer(customerNumber: string, patch: AdminCustomerPatch, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.customerPath(customerNumber), auth, body: patch });\n }\n\n /** Delete a customer profile. */\n async deleteCustomer(customerNumber: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.customerPath(customerNumber), auth });\n }\n\n // --- Addresses ---\n\n /** List a customer's addresses. */\n async listAddresses(customerNumber: string, auth: AuthContext = SERVICE): Promise<AdminCustomerAddressList> {\n return this.ctx.http.request<AdminCustomerAddressList>({\n method: \"GET\",\n path: `${this.customerPath(customerNumber)}/addresses`,\n auth,\n });\n }\n\n /** Retrieve one address. */\n async getAddress(customerNumber: string, addressId: string, auth: AuthContext = SERVICE): Promise<AdminCustomerAddress> {\n return this.ctx.http.request<AdminCustomerAddress>({ method: \"GET\", path: this.addressPath(customerNumber, addressId), auth });\n }\n\n /** Add an address. */\n async addAddress(customerNumber: string, input: AdminCustomerAddressInput, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({\n method: \"POST\",\n path: `${this.customerPath(customerNumber)}/addresses`,\n auth,\n body: input,\n });\n }\n\n /** Upsert an address by id (`PUT`). */\n async upsertAddress(customerNumber: string, addressId: string, input: AdminCustomerAddressUpdate, auth: AuthContext = SERVICE): Promise<AdminCustomerCreated> {\n return this.ctx.http.request<AdminCustomerCreated>({ method: \"PUT\", path: this.addressPath(customerNumber, addressId), auth, body: input });\n }\n\n /** Partially update an address by id (`PATCH`). */\n async patchAddress(customerNumber: string, addressId: string, patch: AdminCustomerAddressUpdate, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"PATCH\", path: this.addressPath(customerNumber, addressId), auth, body: patch });\n }\n\n /** Delete an address by id. */\n async deleteAddress(customerNumber: string, addressId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.addressPath(customerNumber, addressId), auth });\n }\n\n /** Add tags to an address (`?tags=` query). */\n async addAddressTags(customerNumber: string, addressId: string, tags: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"POST\",\n path: `${this.addressPath(customerNumber, addressId)}/tags`,\n auth,\n query: { tags: tags.join(\",\") },\n });\n }\n\n /** Remove tags from an address (`?tags=` query). */\n async removeAddressTags(customerNumber: string, addressId: string, tags: string[], auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.addressPath(customerNumber, addressId)}/tags`,\n auth,\n query: { tags: tags.join(\",\") },\n });\n }\n\n // --- Password-migration retention ---\n\n /**\n * Retrieves the tenant's password-migration retention config. Requires the\n * `customer.import_read` scope. An unconfigured tenant answers with an empty\n * object rather than a 404.\n */\n async getPasswordMigrationRetention(auth: AuthContext = SERVICE): Promise<AdminPasswordMigrationRetention> {\n return this.ctx.http.request<AdminPasswordMigrationRetention>({\n method: \"GET\",\n path: this.configPath(),\n auth,\n });\n }\n\n /**\n * Creates or updates the retention config (`POST`). Requires the\n * `customer.import_manage` scope. **Call this before importing customers with\n * `legacyAuth`** — that import is rejected without an active config. Re-POST with\n * an earlier `retentionEndDate` to shorten a running window.\n */\n async configurePasswordMigrationRetention(\n input: AdminPasswordMigrationRetentionInput,\n auth: AuthContext = SERVICE,\n ): Promise<AdminPasswordMigrationRetention> {\n return this.ctx.http.request<AdminPasswordMigrationRetention>({\n method: \"POST\",\n path: this.configPath(),\n auth,\n body: input,\n });\n }\n\n /**\n * Removes the retention config. Requires the `customer.import_manage` scope.\n * Intended for after the migration window: when the window ends, unmigrated\n * accounts need a password reset and their legacy credentials are cleared.\n */\n async deletePasswordMigrationRetention(auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({ method: \"DELETE\", path: this.configPath(), auth });\n }\n\n // --- Bulk import ---\n\n /**\n * Bulk-imports customers (`POST /customers/import`). Requires the\n * `customer.import_manage` scope.\n *\n * Responds **207 Multi-Status**: per-item failures do **not** throw — inspect each\n * entry's `code`. Each item must carry exactly one of `account.passwordHash` or\n * `account.legacyAuth`, and importing `legacyAuth` requires an active retention\n * config (see `configurePasswordMigrationRetention`).\n */\n async importCustomers(\n input: AdminCustomerImport[],\n auth: AuthContext = SERVICE,\n ): Promise<AdminCustomerImportResult[]> {\n return this.ctx.http.request<AdminCustomerImportResult[]>({\n method: \"POST\",\n path: `${this.base()}/import`,\n auth,\n body: input,\n });\n }\n}\n","import type { ClientContext } from \"../core/context\";\nimport type { AuthContext } from \"../core/auth\";\nimport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n ApprovalPermittedInput,\n ApprovalPermittedResult,\n ApprovalUsersQuery,\n ApprovalUsersResult,\n} from \"./approval-types\";\n\nexport type {\n Approval,\n ApprovalList,\n ApprovalInput,\n ApprovalPatch,\n ApprovalCreated,\n ApprovalPermittedInput,\n ApprovalPermittedResult,\n ApprovalUsersQuery,\n ApprovalUsersResult,\n} from \"./approval-types\";\n\nconst SERVICE: AuthContext = { kind: \"service\" };\n\n/**\n * Emporix Approval Service (`/approval/{tenant}/…`): B2B cart/quote approval\n * workflows — list/view approvals, create an approval request, approve or reject\n * via JSON-Patch, plus permitted-checks and approver search.\n *\n * Every endpoint is **CustomerAccessToken-only**. The trailing `auth` keeps the\n * SDK's uniform method shape, but a customer token is required in practice — pass\n * `auth.customer(token)` (the React hooks supply the browser context). The\n * service token will be rejected by Emporix.\n */\nexport class ApprovalService {\n static readonly channel = \"approval\" as const;\n constructor(private readonly ctx: ClientContext) {}\n\n private base(): string {\n return `/approval/${this.ctx.tenant}`;\n }\n\n /** List approvals (paged via `pageNumber`/`pageSize`/`sort`/`q`). Returns an array. */\n async listApprovals(\n query: Record<string, string | number> = {},\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalList> {\n return this.ctx.http.request<ApprovalList>({\n method: \"GET\",\n path: `${this.base()}/approvals`,\n auth,\n ...(Object.keys(query).length ? { query } : {}),\n });\n }\n\n /** Retrieve a single approval by id. */\n async getApproval(approvalId: string, auth: AuthContext = SERVICE): Promise<Approval> {\n return this.ctx.http.request<Approval>({\n method: \"GET\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n });\n }\n\n /** Create an approval request (cart or quote). Returns the created `{ id }`. */\n async createApproval(input: ApprovalInput, auth: AuthContext = SERVICE): Promise<ApprovalCreated> {\n return this.ctx.http.request<ApprovalCreated>({\n method: \"POST\",\n path: `${this.base()}/approvals`,\n auth,\n body: input,\n });\n }\n\n /** Approve/reject/amend an approval via a JSON-Patch op-array (`PATCH`). */\n async updateApproval(\n approvalId: string,\n ops: ApprovalPatch,\n auth: AuthContext = SERVICE,\n ): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"PATCH\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n body: ops,\n });\n }\n\n /** Delete an approval by id. */\n async deleteApproval(approvalId: string, auth: AuthContext = SERVICE): Promise<void> {\n await this.ctx.http.request<void>({\n method: \"DELETE\",\n path: `${this.base()}/approvals/${encodeURIComponent(approvalId)}`,\n auth,\n });\n }\n\n /** Check whether an operation on a resource is permitted / needs approval. */\n async checkPermitted(\n input: ApprovalPermittedInput,\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalPermittedResult> {\n return this.ctx.http.request<ApprovalPermittedResult>({\n method: \"POST\",\n path: `${this.base()}/approval/permitted`,\n auth,\n body: input,\n });\n }\n\n /** Search for users eligible to approve a resource. Returns an array. */\n async searchApprovers(\n input: ApprovalUsersQuery,\n auth: AuthContext = SERVICE,\n ): Promise<ApprovalUsersResult> {\n return this.ctx.http.request<ApprovalUsersResult>({\n method: \"POST\",\n path: `${this.base()}/search/users`,\n auth,\n body: input,\n });\n }\n}\n\n/** The status transitions a client can request. `PENDING` and `EXPIRED` are set by Emporix. */\nexport type ApprovalDecision = \"APPROVED\" | \"DECLINED\" | \"CLOSED\";\n\n/**\n * Builds the JSON-Patch for an approval decision, with both measured quirks baked in.\n *\n * Two things about this patch are counter-intuitive, both measured against tenant\n * `viu` on 2026-08-18:\n *\n * 1. **`replace` is lowercase.** The upstream spec shipped the enum uppercase and the\n * live API answers `REPLACE` with 400. That is repaired at the spec level (see\n * `scripts/spec-patches.ts`), so the type now guides you correctly.\n * 2. **The approver comment needs `add`, not `replace`.** `approverComment` does not\n * exist on a fresh approval, and `replace` on an absent field answers\n * `APPROVAL-400010` «Missing field \"approverComment\"». Because PATCH is atomic,\n * that failure takes the status change down with it — the decision silently does\n * not happen. `add` creates the field and overwrites it on a second decision, so\n * it is correct in both cases. The upstream spec's own «Add comment by the\n * approver» example agrees; only its enum did not.\n *\n * Status and comment travel in one request on purpose: since PATCH is atomic, a\n * rejection can never land without its reason.\n *\n * @example\n * await client.approvals.updateApproval(id, approvalStatusPatch(\"DECLINED\", \"Over budget\"), auth);\n */\nexport function approvalStatusPatch(\n status: ApprovalDecision,\n approverComment?: string,\n): ApprovalPatch {\n const comment = approverComment?.trim() ?? \"\";\n return [\n { op: \"replace\", path: \"/status\", value: status },\n // `as const` on both fields: the generated type narrows `path` to an enum too, so\n // a widened `string` from the spread would not be assignable.\n ...(comment !== \"\"\n ? [{ op: \"add\" as const, path: \"/approverComment\" as const, value: comment }]\n : []),\n ];\n}\n","import type { EmporixConfig, ResolvedConfig } from \"./core/config\";\nimport type { TokenProvider, CustomerTokenRefresher } from \"./core/auth\";\nimport type { LogLevel, ServiceName } from \"./core/logger\";\nimport { createCore, type EmporixCore } from \"./core/create-core\";\nimport { CustomerService } from \"./services/customer\";\nimport { ProductService } from \"./services/product\";\nimport { CategoryService } from \"./services/category\";\nimport { CartService } from \"./services/cart\";\nimport { CheckoutService } from \"./services/checkout\";\nimport { PaymentGatewayService } from \"./services/payment\";\nimport { PriceService } from \"./services/price\";\nimport { MediaService } from \"./services/media\";\nimport { SegmentService } from \"./services/segment\";\nimport { SiteService } from \"./services/site\";\nimport { SessionContextService } from \"./services/session-context\";\nimport { CompaniesService } from \"./services/companies\";\nimport { ContactsService } from \"./services/contacts\";\nimport { LocationsService } from \"./services/locations\";\nimport { CustomerGroupsService } from \"./services/customer-groups\";\nimport { IamService } from \"./services/iam\";\nimport { OrdersService, SalesOrdersService } from \"./services/orders\";\nimport { AvailabilityService } from \"./services/availability\";\nimport { TenantConfigService } from \"./services/tenant-config\";\nimport { ClientConfigService } from \"./services/client-config\";\nimport { ShoppingListService } from \"./services/shopping-list\";\nimport { RagIndexerService } from \"./services/ai-rag-indexer\";\nimport { SequentialIdService } from \"./services/sequential-id\";\nimport { FeeService } from \"./services/fee\";\nimport { CloudFunctionsService } from \"./services/cloud-functions\";\nimport { WebhookService } from \"./services/webhook\";\nimport { SchemaService } from \"./services/schema\";\nimport { AiService } from \"./services/ai\";\nimport { TaxService } from \"./services/tax\";\nimport { CouponService } from \"./services/coupon\";\nimport { RewardPointsService } from \"./services/reward-points\";\nimport { BrandService } from \"./services/brand\";\nimport { LabelService } from \"./services/label\";\nimport { CountryService } from \"./services/country\";\nimport { CurrencyService } from \"./services/currency\";\nimport { ShippingService } from \"./services/shipping\";\nimport { InvoiceService } from \"./services/invoice\";\nimport { QuoteService } from \"./services/quote\";\nimport { ReturnsService } from \"./services/returns\";\nimport { IndexingService } from \"./services/indexing\";\nimport { SearchService } from \"./services/search\";\nimport { ImportService } from \"./services/imports\";\nimport { AuditLogService } from \"./services/audit-log\";\nimport { UnitHandlingService } from \"./services/unit-handling\";\nimport { CatalogService } from \"./services/catalog\";\nimport { VendorService } from \"./services/vendor\";\nimport { CustomerAdminService } from \"./services/customer-admin\";\nimport { ApprovalService } from \"./services/approval\";\n\n/** The Emporix SDK entry point. One instance safely serves many concurrent shoppers. */\nexport class EmporixClient {\n readonly customers: CustomerService;\n readonly products: ProductService;\n readonly categories: CategoryService;\n readonly carts: CartService;\n readonly checkout: CheckoutService;\n readonly payments: PaymentGatewayService;\n readonly prices: PriceService;\n readonly media: MediaService;\n readonly segments: SegmentService;\n readonly sites: SiteService;\n readonly sessionContext: SessionContextService;\n readonly companies: CompaniesService;\n readonly contacts: ContactsService;\n readonly locations: LocationsService;\n readonly customerGroups: CustomerGroupsService;\n readonly iam: IamService;\n readonly orders: OrdersService;\n readonly salesOrders: SalesOrdersService;\n readonly availability: AvailabilityService;\n readonly tenantConfig: TenantConfigService;\n readonly clientConfig: ClientConfigService;\n readonly shoppingLists: ShoppingListService;\n readonly ragIndexer: RagIndexerService;\n readonly sequentialIds: SequentialIdService;\n readonly fees: FeeService;\n readonly cloudFunctions: CloudFunctionsService;\n readonly webhooks: WebhookService;\n readonly schemas: SchemaService;\n readonly ai: AiService;\n readonly taxes: TaxService;\n readonly coupons: CouponService;\n readonly rewardPoints: RewardPointsService;\n readonly brands: BrandService;\n readonly labels: LabelService;\n readonly countries: CountryService;\n readonly currencies: CurrencyService;\n readonly shipping: ShippingService;\n readonly invoices: InvoiceService;\n readonly quotes: QuoteService;\n readonly returns: ReturnsService;\n readonly indexing: IndexingService;\n readonly search: SearchService;\n readonly imports: ImportService;\n readonly auditLogs: AuditLogService;\n readonly units: UnitHandlingService;\n readonly catalogs: CatalogService;\n readonly vendors: VendorService;\n readonly customerAdmin: CustomerAdminService;\n readonly approvals: ApprovalService;\n /** The validated tenant this client is bound to. */\n readonly tenant: string;\n /**\n * The token provider in use by this client. Exposed so React/Next hosts can\n * call `attachAnonymousStore` to wire session persistence. Treat as\n * read-only — replacing it after construction is not supported.\n */\n readonly tokenProvider: TokenProvider;\n /**\n * The validated config used to construct this client. Exposed so React /\n * Next hosts can read static settings such as `credentials.storefront.context`\n * (siteCode, currency, targetLocation) without re-plumbing them through the\n * Provider tree. Treat as read-only.\n */\n readonly config: ResolvedConfig;\n private readonly core: EmporixCore;\n\n constructor(config: EmporixConfig) {\n const core = createCore(config);\n this.core = core;\n this.tenant = core.tenant;\n this.config = core.config;\n this.tokenProvider = core.tokenProvider;\n\n const mk = core.mk;\n this.customers = new CustomerService(mk(CustomerService.channel));\n this.products = new ProductService(mk(ProductService.channel));\n this.categories = new CategoryService(mk(CategoryService.channel));\n this.carts = new CartService(mk(CartService.channel));\n this.checkout = new CheckoutService(mk(CheckoutService.channel));\n this.payments = new PaymentGatewayService(mk(PaymentGatewayService.channel));\n this.prices = new PriceService(mk(PriceService.channel));\n this.media = new MediaService(mk(MediaService.channel));\n this.segments = new SegmentService(mk(SegmentService.channel), {\n products: this.products,\n categories: this.categories,\n });\n this.sites = new SiteService(mk(SiteService.channel));\n this.sessionContext = new SessionContextService(mk(SessionContextService.channel));\n this.companies = new CompaniesService(mk(CompaniesService.channel));\n this.contacts = new ContactsService(mk(ContactsService.channel));\n this.locations = new LocationsService(mk(LocationsService.channel));\n this.customerGroups = new CustomerGroupsService(mk(CustomerGroupsService.channel));\n this.iam = new IamService(mk(IamService.channel));\n this.orders = new OrdersService(mk(OrdersService.channel));\n this.salesOrders = new SalesOrdersService(mk(SalesOrdersService.channel));\n this.availability = new AvailabilityService(mk(AvailabilityService.channel));\n this.tenantConfig = new TenantConfigService(mk(TenantConfigService.channel));\n this.clientConfig = new ClientConfigService(mk(ClientConfigService.channel));\n this.shoppingLists = new ShoppingListService(mk(ShoppingListService.channel));\n this.ragIndexer = new RagIndexerService(mk(RagIndexerService.channel));\n this.sequentialIds = new SequentialIdService(mk(SequentialIdService.channel));\n this.fees = new FeeService(mk(FeeService.channel));\n this.cloudFunctions = new CloudFunctionsService(mk(CloudFunctionsService.channel));\n this.webhooks = new WebhookService(mk(WebhookService.channel));\n this.schemas = new SchemaService(mk(SchemaService.channel));\n this.ai = new AiService(mk(AiService.channel));\n this.taxes = new TaxService(mk(TaxService.channel));\n this.coupons = new CouponService(mk(CouponService.channel));\n this.rewardPoints = new RewardPointsService(mk(RewardPointsService.channel));\n this.brands = new BrandService(mk(BrandService.channel));\n this.labels = new LabelService(mk(LabelService.channel));\n this.countries = new CountryService(mk(CountryService.channel));\n this.currencies = new CurrencyService(mk(CurrencyService.channel));\n this.shipping = new ShippingService(mk(ShippingService.channel));\n this.invoices = new InvoiceService(mk(InvoiceService.channel));\n this.quotes = new QuoteService(mk(QuoteService.channel));\n this.returns = new ReturnsService(mk(ReturnsService.channel));\n this.indexing = new IndexingService(mk(IndexingService.channel));\n this.search = new SearchService(mk(SearchService.channel));\n this.imports = new ImportService(mk(ImportService.channel));\n this.auditLogs = new AuditLogService(mk(AuditLogService.channel));\n this.units = new UnitHandlingService(mk(UnitHandlingService.channel));\n this.catalogs = new CatalogService(mk(CatalogService.channel));\n this.vendors = new VendorService(mk(VendorService.channel));\n this.customerAdmin = new CustomerAdminService(mk(CustomerAdminService.channel));\n this.approvals = new ApprovalService(mk(ApprovalService.channel));\n }\n\n /**\n * Re-binds the storefront price context (currency / siteCode / targetLocation)\n * for anonymous pricing and invalidates the current anonymous session, so the\n * next request re-mints a token bound to the new context. Use this to switch\n * currency at runtime. Carts are currency-bound — clear the cart after a\n * currency change (the React `setCurrency` does this for you).\n *\n * Also sets the storefront `language` (an `Accept-Language` header on every\n * read); a language-only change does NOT re-mint the token.\n */\n setStorefrontContext(ctx: {\n currency?: string;\n siteCode?: string;\n targetLocation?: string;\n language?: string;\n }): void {\n this.core.setStorefrontContext(ctx);\n }\n\n /** Sets the runtime log level globally or for one service. */\n setLogLevel(level: LogLevel, opts: { service?: ServiceName; force?: boolean } = {}): void {\n this.core.setLogLevel(level, opts);\n }\n\n /** Returns the effective log level for a service. */\n getLogLevel(service: ServiceName): LogLevel {\n return this.core.getLogLevel(service);\n }\n\n /**\n * Registers (or clears with `null`) a customer-token refresher. When set, a\n * `customer`-kind 401 triggers one refresh-and-retry. Off by default — the\n * customer token stays caller-owned. The React `EmporixProvider` wires this\n * automatically via `autoRefreshCustomerToken`.\n */\n setCustomerTokenRefresher(refresher: CustomerTokenRefresher | null): void {\n this.core.setCustomerTokenRefresher(refresher);\n }\n}\n","import type { EmporixConfig } from \"./core/config\";\nimport type { ServiceName } from \"./core/logger\";\nimport { EmporixError } from \"./core/errors\";\nimport { createCore, type EmporixCore } from \"./core/create-core\";\n\n/**\n * A service class the factory can instantiate: carries its channel + optional\n * deps. The constructor signature is intentionally loose (`...args: any[]`) so\n * both dep-free services (`new Svc(ctx)`) and dependent ones\n * (`new Svc(ctx, deps)` — e.g. `SegmentService`) satisfy it.\n */\nexport interface ServiceClass<I> {\n readonly channel: ServiceName;\n readonly deps?: readonly string[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): I;\n}\n\n/**\n * Tree-shakeable client factory. Builds ONLY the service classes you pass —\n * imports no services itself, so a bundler drops every service you don't use.\n * `EmporixClient` remains the batteries-included default; reach for this when\n * bundle size matters. Dependent services (e.g. `segments`) require their deps\n * to be present in the map under their public names (`products`, `categories`).\n */\nexport function createEmporixClient<S extends Record<string, ServiceClass<unknown>>>(\n config: EmporixConfig,\n services: S,\n): Omit<EmporixCore, \"mk\"> & { [K in keyof S]: InstanceType<S[K]> } {\n const { mk, ...core } = createCore(config);\n const built: Record<string, unknown> = {};\n const entries = Object.entries(services) as [string, ServiceClass<unknown>][];\n\n // Pass 1: dependency-free services.\n for (const [key, Svc] of entries) {\n if (!Svc.deps?.length) built[key] = new Svc(mk(Svc.channel));\n }\n // Pass 2: dependents (only `segments` today; deps are all dep-free, so two\n // passes suffice — a deeper graph would need a topological sort).\n for (const [key, Svc] of entries) {\n if (!Svc.deps?.length) continue;\n const deps: Record<string, unknown> = {};\n for (const dep of Svc.deps) {\n if (!(dep in built)) {\n throw new EmporixError(\n `createEmporixClient: \"${key}\" requires \"${dep}\" in the services map`,\n );\n }\n deps[dep] = built[dep];\n }\n built[key] = new Svc(mk(Svc.channel), deps);\n }\n\n return { ...core, ...built } as Omit<EmporixCore, \"mk\"> & {\n [K in keyof S]: InstanceType<S[K]>;\n };\n}\n","/**\n * Extracts the product id from a product `itemYrn`\n * (`urn:yaas:hybris:product:product:<tenant>;<productId>`). Cart and order line\n * items carry only the YRN, not a bare product id. Returns \"\" when the YRN is\n * missing or has no `;` segment.\n *\n * Approval resource items are an exception: their `itemYrn` is frequently the bare\n * product id with no YRN wrapper, so this returns \"\" and you want the sibling\n * `itemId` as a fallback. Measured on tenant `viu`, 2026-08-18.\n */\nexport function productIdFromYrn(yrn: string | undefined): string {\n if (!yrn) return \"\";\n const semi = yrn.lastIndexOf(\";\");\n return semi >= 0 ? yrn.slice(semi + 1) : \"\";\n}\n\n/**\n * Builds a product `itemYrn` — the form `carts.addItem` requires.\n *\n * The inverse of {@link productIdFromYrn}. Emporix rejects anything else with\n * «Given yrn does not match yaas urn scheme».\n */\nexport function productYrn(tenant: string, productId: string): string {\n return `urn:yaas:hybris:product:product:${tenant};${productId}`;\n}\n"]}