{"version":3,"file":"ContactsTranslationBridge-DecIljB_.cjs","names":["toApiErrorBody","ApiError","toApiErrorData","useAccount","ContactsApiProvider","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict","ContactsTranslationProvider"],"sources":["../../../platform/api-client-core/src/hey-api-error-policy.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/bodySerializer.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/params.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/serverSentEvents.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/pathSerializer.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/utils.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/core/auth.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/client/utils.gen.ts","../../../api-clients/hey-api-fetch-runtime/src/generated/client/client.gen.ts","../../../api-clients/portal-tenant-contacts/src/hey-api-client.ts","../../../api-clients/portal-tenant-contacts/src/hey-api/sdk.gen.ts","../src/adapters/contacts-api-adapter.ts","../src/providers/FluidConfigProvider.tsx","../src/contacts/PortalContactsApiProvider.tsx","../../../contacts/core/src/translation-dictionary.ts","../../../contacts/core/src/translation-adapter.ts","../src/providers/ContactsTranslationBridge.tsx"],"sourcesContent":["import type { ApiErrorBody, ApiErrorData } from \"./api-error-shape\";\nimport { toApiErrorBody, toApiErrorData } from \"./api-error-shape\";\nimport { ApiError } from \"./fetch-client\";\n\nexport interface HeyApiErrorRequestOptions {\n  method?: string;\n}\n\nexport interface HeyApiErrorInterceptorOptions {\n  onResponseError?: (response: Response) => void;\n  shouldPassThroughTransportError?: (error: unknown) => boolean;\n}\n\nexport type HeyApiErrorInterceptor = (\n  error: unknown,\n  response: Response | undefined,\n  request: Request | undefined,\n  options: HeyApiErrorRequestOptions,\n) => unknown;\n\nfunction getNonEmptyString(value: unknown): string | undefined {\n  if (typeof value !== \"string\") {\n    return undefined;\n  }\n\n  const trimmed = value.trim();\n  return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction getRequestId(\n  response: Response,\n  error: ApiErrorBody,\n): string | undefined {\n  const meta = toApiErrorBody(error?.meta);\n\n  return (\n    getNonEmptyString(response.headers.get(\"x-request-id\")) ??\n    getNonEmptyString(response.headers.get(\"request-id\")) ??\n    getNonEmptyString(error?.request_id) ??\n    getNonEmptyString(error?.requestId) ??\n    getNonEmptyString(meta?.request_id) ??\n    getNonEmptyString(meta?.requestId)\n  );\n}\n\nfunction getErrorMessage(\n  error: Record<string, unknown>,\n  fallback: string,\n): string {\n  const nestedError = toApiErrorBody(error.error);\n\n  return (\n    getNonEmptyString(error.message) ??\n    getNonEmptyString(error.error_message) ??\n    getNonEmptyString(nestedError?.message) ??\n    fallback\n  );\n}\n\n/**\n * Creates an error interceptor compatible with generated Hey API fetch clients.\n * Consumer-specific auth and cancellation policy is supplied through callbacks,\n * keeping this package independent from generated client types.\n */\nexport function createHeyApiErrorInterceptor(\n  options: HeyApiErrorInterceptorOptions = {},\n): HeyApiErrorInterceptor {\n  return (error, response, request, requestOptions) => {\n    if (!response) {\n      if (error instanceof ApiError) {\n        return error;\n      }\n\n      if (options.shouldPassThroughTransportError?.(error)) {\n        return error;\n      }\n\n      // Request construction and auth callbacks run before dispatch. Preserve\n      // those errors instead of reporting them as network failures.\n      if (!request) {\n        return error;\n      }\n\n      return new ApiError(\n        `Network error: ${error instanceof Error ? error.message : \"Unknown network error\"}`,\n        0,\n        null,\n      );\n    }\n\n    // Generated clients surface malformed JSON bodies as SyntaxError. Map an\n    // otherwise successful response to the shared strict parse contract.\n    if (response.ok && error instanceof SyntaxError) {\n      return new ApiError(\n        \"Failed to parse response as JSON\",\n        response.status,\n        null,\n        getRequestId(response, null),\n      );\n    }\n\n    options.onResponseError?.(response);\n\n    const method = request?.method ?? requestOptions.method ?? \"GET\";\n    const errorRecord = toApiErrorBody(error);\n    const requestId = getRequestId(response, errorRecord);\n\n    if (errorRecord) {\n      // `data` is the unwrapped field-error bag, `body` the whole envelope.\n      // Both derive from one shared rule — see docs/api-error-data-contract.md.\n      return new ApiError(\n        getErrorMessage(errorRecord, `${method} request failed`),\n        response.status,\n        toApiErrorData(errorRecord),\n        requestId,\n        errorRecord,\n      );\n    }\n\n    const isJson = response.headers\n      .get(\"content-type\")\n      ?.includes(\"application/json\");\n    const text = getNonEmptyString(error);\n\n    return new ApiError(\n      isJson && text\n        ? text.slice(0, 200)\n        : `${method} request failed with status ${response.status}`,\n      response.status,\n      // A parsed JSON string is a legal `ApiErrorData` member, so it is kept\n      // rather than dropped — the shared fetch client already preserves it, and\n      // discarding it here made the two producers disagree.\n      isJson ? (error as ApiErrorData) : null,\n      requestId,\n      // Unreachable as an envelope: this branch runs only when the payload is\n      // not a plain object, which is exactly what `toApiErrorBody` rejects.\n      null,\n    );\n  };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n  ArrayStyle,\n  ObjectStyle,\n  SerializerOptions,\n} from \"./pathSerializer.gen\";\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: unknown) => unknown;\n\ntype QuerySerializerOptionsObject = {\n  allowReserved?: boolean;\n  array?: Partial<SerializerOptions<ArrayStyle>>;\n  object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n  /**\n   * Per-parameter serialization overrides. When provided, these settings\n   * override the global array/object settings for specific parameter names.\n   */\n  parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (\n  data: FormData,\n  key: string,\n  value: unknown,\n): void => {\n  if (typeof value === \"string\" || value instanceof Blob) {\n    data.append(key, value);\n  } else if (value instanceof Date) {\n    data.append(key, value.toISOString());\n  } else {\n    data.append(key, JSON.stringify(value));\n  }\n};\n\nconst serializeUrlSearchParamsPair = (\n  data: URLSearchParams,\n  key: string,\n  value: unknown,\n): void => {\n  if (typeof value === \"string\") {\n    data.append(key, value);\n  } else {\n    data.append(key, JSON.stringify(value));\n  }\n};\n\nexport const formDataBodySerializer = {\n  bodySerializer: (body: unknown): FormData => {\n    const data = new FormData();\n\n    Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n      if (value === undefined || value === null) {\n        return;\n      }\n      if (Array.isArray(value)) {\n        value.forEach((v) => serializeFormDataPair(data, key, v));\n      } else {\n        serializeFormDataPair(data, key, value);\n      }\n    });\n\n    return data;\n  },\n};\n\nexport const jsonBodySerializer = {\n  bodySerializer: (body: unknown): string =>\n    JSON.stringify(body, (_key, value) =>\n      typeof value === \"bigint\" ? value.toString() : value,\n    ),\n};\n\nexport const urlSearchParamsBodySerializer = {\n  bodySerializer: (body: unknown): string => {\n    const data = new URLSearchParams();\n\n    Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n      if (value === undefined || value === null) {\n        return;\n      }\n      if (Array.isArray(value)) {\n        value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n      } else {\n        serializeUrlSearchParamsPair(data, key, value);\n      }\n    });\n\n    return data.toString();\n  },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\ntype Slot = \"body\" | \"headers\" | \"path\" | \"query\";\n\nexport type Field =\n  | {\n      in: Exclude<Slot, \"body\">;\n      /**\n       * Field name. This is the name we want the user to see and use.\n       */\n      key: string;\n      /**\n       * Field mapped name. This is the name we want to use in the request.\n       * If omitted, we use the same value as `key`.\n       */\n      map?: string;\n    }\n  | {\n      in: Extract<Slot, \"body\">;\n      /**\n       * Key isn't required for bodies.\n       */\n      key?: string;\n      map?: string;\n    }\n  | {\n      /**\n       * Field name. This is the name we want the user to see and use.\n       */\n      key: string;\n      /**\n       * Field mapped name. This is the name we want to use in the request.\n       * If `in` is omitted, `map` aliases `key` to the transport layer.\n       */\n      map: Slot;\n    };\n\nexport interface Fields {\n  allowExtra?: Partial<Record<Slot, boolean>>;\n  args?: ReadonlyArray<Field>;\n}\n\nexport type FieldsConfig = ReadonlyArray<Field | Fields>;\n\nconst extraPrefixesMap: Record<string, Slot> = {\n  $body_: \"body\",\n  $headers_: \"headers\",\n  $path_: \"path\",\n  $query_: \"query\",\n};\nconst extraPrefixes = Object.entries(extraPrefixesMap);\n\ntype KeyMap = Map<\n  string,\n  | {\n      in: Slot;\n      map?: string;\n    }\n  | {\n      in?: never;\n      map: Slot;\n    }\n>;\n\nfunction buildKeyMap(fields: FieldsConfig, map?: KeyMap): KeyMap {\n  if (!map) {\n    map = new Map();\n  }\n\n  for (const config of fields) {\n    if (\"in\" in config) {\n      if (config.key) {\n        map.set(config.key, {\n          in: config.in,\n          map: config.map,\n        });\n      }\n    } else if (\"key\" in config) {\n      map.set(config.key, {\n        map: config.map,\n      });\n    } else if (config.args) {\n      buildKeyMap(config.args, map);\n    }\n  }\n\n  return map;\n}\n\ninterface Params {\n  body?: unknown;\n  headers: Record<string, unknown>;\n  path: Record<string, unknown>;\n  query: Record<string, unknown>;\n}\n\nfunction stripEmptySlots(params: Params): void {\n  for (const [slot, value] of Object.entries(params)) {\n    if (slot === \"body\") continue;\n    if (\n      value &&\n      typeof value === \"object\" &&\n      !Array.isArray(value) &&\n      !Object.keys(value).length\n    ) {\n      delete params[slot as Slot];\n    }\n  }\n}\n\nexport function buildClientParams(\n  args: ReadonlyArray<unknown>,\n  fields: FieldsConfig,\n): Params {\n  const params: Params = {\n    headers: Object.create(null),\n    path: Object.create(null),\n    query: Object.create(null),\n  };\n\n  const map = buildKeyMap(fields);\n\n  function writeSlot(slot: Slot, key: string, value: unknown): void {\n    let record = params[slot] as Record<string, unknown> | undefined;\n    if (record === undefined) {\n      record = Object.create(null) as Record<string, unknown>;\n      params[slot] = record;\n    }\n    record[key] = value;\n  }\n\n  let config: FieldsConfig[number] | undefined;\n\n  for (const [index, arg] of args.entries()) {\n    if (fields[index]) {\n      config = fields[index];\n    }\n\n    if (!config) {\n      continue;\n    }\n\n    if (\"in\" in config) {\n      if (config.key) {\n        const field = map.get(config.key)!;\n        const name = field.map || config.key;\n        if (field.in) {\n          writeSlot(field.in, name, arg);\n        }\n      } else {\n        params.body = arg;\n      }\n    } else {\n      for (const [key, value] of Object.entries(arg ?? {})) {\n        const field = map.get(key);\n\n        if (field) {\n          if (field.in) {\n            const name = field.map || key;\n            writeSlot(field.in, name, value);\n          } else {\n            params[field.map] = value;\n          }\n        } else {\n          const extra = extraPrefixes.find(([prefix]) =>\n            key.startsWith(prefix),\n          );\n\n          if (extra) {\n            const [prefix, slot] = extra;\n            writeSlot(slot, key.slice(prefix.length), value);\n          } else if (\"allowExtra\" in config && config.allowExtra) {\n            for (const [slot, allowed] of Object.entries(config.allowExtra)) {\n              if (allowed) {\n                writeSlot(slot as Slot, key, value);\n                break;\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  stripEmptySlots(params);\n\n  return params;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from \"./types.gen\";\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<\n  RequestInit,\n  \"method\"\n> &\n  Pick<Config, \"method\" | \"responseTransformer\" | \"responseValidator\"> & {\n    /**\n     * Fetch API implementation. You can use this option to provide a custom\n     * fetch instance.\n     *\n     * @default globalThis.fetch\n     */\n    fetch?: typeof fetch;\n    /**\n     * Implementing clients can call request interceptors inside this hook.\n     */\n    onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n    /**\n     * Callback invoked when a network or parsing error occurs during streaming.\n     *\n     * This option applies only if the endpoint returns a stream of events.\n     *\n     * @param error The error that occurred.\n     */\n    onSseError?: (error: unknown) => void;\n    /**\n     * Callback invoked when an event is streamed from the server.\n     *\n     * This option applies only if the endpoint returns a stream of events.\n     *\n     * @param event Event streamed from the server.\n     * @returns Nothing (void).\n     */\n    onSseEvent?: (event: StreamEvent<TData>) => void;\n    serializedBody?: RequestInit[\"body\"];\n    /**\n     * Default retry delay in milliseconds.\n     *\n     * This option applies only if the endpoint returns a stream of events.\n     *\n     * @default 3000\n     */\n    sseDefaultRetryDelay?: number;\n    /**\n     * Maximum number of retry attempts before giving up.\n     */\n    sseMaxRetryAttempts?: number;\n    /**\n     * Maximum retry delay in milliseconds.\n     *\n     * Applies only when exponential backoff is used.\n     *\n     * This option applies only if the endpoint returns a stream of events.\n     *\n     * @default 30000\n     */\n    sseMaxRetryDelay?: number;\n    /**\n     * Optional sleep function for retry backoff.\n     *\n     * Defaults to using `setTimeout`.\n     */\n    sseSleepFn?: (ms: number) => Promise<void>;\n    url: string;\n  };\n\nexport interface StreamEvent<TData = unknown> {\n  data: TData;\n  event?: string;\n  id?: string;\n  retry?: number;\n}\n\nexport type ServerSentEventsResult<\n  TData = unknown,\n  TReturn = void,\n  TNext = unknown,\n> = {\n  stream: AsyncGenerator<\n    TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n    TReturn,\n    TNext\n  >;\n};\n\nexport function createSseClient<TData = unknown>({\n  onRequest,\n  onSseError,\n  onSseEvent,\n  responseTransformer,\n  responseValidator,\n  sseDefaultRetryDelay,\n  sseMaxRetryAttempts,\n  sseMaxRetryDelay,\n  sseSleepFn,\n  url,\n  ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> {\n  let lastEventId: string | undefined;\n\n  const sleep =\n    sseSleepFn ??\n    ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n  const createStream = async function* () {\n    let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n    let attempt = 0;\n    const signal = options.signal ?? new AbortController().signal;\n\n    while (true) {\n      if (signal.aborted) break;\n\n      attempt++;\n\n      const headers =\n        options.headers instanceof Headers\n          ? options.headers\n          : new Headers(options.headers as Record<string, string> | undefined);\n\n      if (lastEventId !== undefined) {\n        headers.set(\"Last-Event-ID\", lastEventId);\n      }\n\n      try {\n        const requestInit: RequestInit = {\n          redirect: \"follow\",\n          ...options,\n          body: options.serializedBody,\n          headers,\n          signal,\n        };\n        let request = new Request(url, requestInit);\n        if (onRequest) {\n          request = await onRequest(url, requestInit);\n        }\n        // fetch must be assigned here, otherwise it would throw the error:\n        // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n        const _fetch = options.fetch ?? globalThis.fetch;\n        const response = await _fetch(request);\n\n        if (!response.ok)\n          throw new Error(\n            `SSE failed: ${response.status} ${response.statusText}`,\n          );\n\n        if (!response.body) throw new Error(\"No body in SSE response\");\n\n        const reader = response.body\n          .pipeThrough(new TextDecoderStream())\n          .getReader();\n\n        let buffer = \"\";\n\n        const abortHandler = () => {\n          try {\n            reader.cancel();\n          } catch {\n            // noop\n          }\n        };\n\n        signal.addEventListener(\"abort\", abortHandler);\n\n        try {\n          while (true) {\n            const { done, value } = await reader.read();\n            if (done) break;\n            buffer += value;\n            buffer = buffer.replace(/\\r\\n?/g, \"\\n\"); // normalize line endings\n\n            const chunks = buffer.split(\"\\n\\n\");\n            buffer = chunks.pop() ?? \"\";\n\n            for (const chunk of chunks) {\n              const lines = chunk.split(\"\\n\");\n              const dataLines: Array<string> = [];\n              let eventName: string | undefined;\n\n              for (const line of lines) {\n                if (line.startsWith(\"data:\")) {\n                  dataLines.push(line.replace(/^data:\\s*/, \"\"));\n                } else if (line.startsWith(\"event:\")) {\n                  eventName = line.replace(/^event:\\s*/, \"\");\n                } else if (line.startsWith(\"id:\")) {\n                  lastEventId = line.replace(/^id:\\s*/, \"\");\n                } else if (line.startsWith(\"retry:\")) {\n                  const parsed = Number.parseInt(\n                    line.replace(/^retry:\\s*/, \"\"),\n                    10,\n                  );\n                  if (!Number.isNaN(parsed)) {\n                    retryDelay = parsed;\n                  }\n                }\n              }\n\n              let data: unknown;\n              let parsedJson = false;\n\n              if (dataLines.length) {\n                const rawData = dataLines.join(\"\\n\");\n                try {\n                  data = JSON.parse(rawData);\n                  parsedJson = true;\n                } catch {\n                  data = rawData;\n                }\n              }\n\n              if (parsedJson) {\n                if (responseValidator) {\n                  await responseValidator(data);\n                }\n\n                if (responseTransformer) {\n                  data = await responseTransformer(data);\n                }\n              }\n\n              onSseEvent?.({\n                data,\n                event: eventName,\n                id: lastEventId,\n                retry: retryDelay,\n              });\n\n              if (dataLines.length) {\n                yield data as any;\n              }\n            }\n          }\n        } finally {\n          signal.removeEventListener(\"abort\", abortHandler);\n          reader.releaseLock();\n        }\n\n        break; // exit loop on normal completion\n      } catch (error) {\n        // connection failed or aborted; retry after delay\n        onSseError?.(error);\n\n        if (\n          sseMaxRetryAttempts !== undefined &&\n          attempt >= sseMaxRetryAttempts\n        ) {\n          break; // stop after firing error\n        }\n\n        // exponential backoff: double retry each attempt, cap at 30s\n        const backoff = Math.min(\n          retryDelay * 2 ** (attempt - 1),\n          sseMaxRetryDelay ?? 30000,\n        );\n        await sleep(backoff);\n      }\n    }\n  };\n\n  const stream = createStream();\n\n  return { stream };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T>\n  extends SerializePrimitiveOptions, SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n  allowReserved?: boolean;\n  name: string;\n}\n\nexport interface SerializerOptions<T> {\n  /**\n   * @default true\n   */\n  explode: boolean;\n  style: T;\n}\n\nexport type ArrayStyle = \"form\" | \"spaceDelimited\" | \"pipeDelimited\";\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = \"label\" | \"matrix\" | \"simple\";\nexport type ObjectStyle = \"form\" | \"deepObject\";\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n  value: string;\n}\n\nexport const separatorArrayExplode = (\n  style: ArraySeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\n  switch (style) {\n    case \"label\":\n      return \".\";\n    case \"matrix\":\n      return \";\";\n    case \"simple\":\n      return \",\";\n    default:\n      return \"&\";\n  }\n};\n\nexport const separatorArrayNoExplode = (\n  style: ArraySeparatorStyle,\n): \",\" | \"|\" | \"%20\" => {\n  switch (style) {\n    case \"form\":\n      return \",\";\n    case \"pipeDelimited\":\n      return \"|\";\n    case \"spaceDelimited\":\n      return \"%20\";\n    default:\n      return \",\";\n  }\n};\n\nexport const separatorObjectExplode = (\n  style: ObjectSeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\n  switch (style) {\n    case \"label\":\n      return \".\";\n    case \"matrix\":\n      return \";\";\n    case \"simple\":\n      return \",\";\n    default:\n      return \"&\";\n  }\n};\n\nexport const serializeArrayParam = ({\n  allowReserved,\n  explode,\n  name,\n  style,\n  value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n  value: unknown[];\n}): string => {\n  if (!explode) {\n    const joinedValues = (\n      allowReserved ? value : value.map((v) => encodeURIComponent(v as string))\n    ).join(separatorArrayNoExplode(style));\n    switch (style) {\n      case \"label\":\n        return `.${joinedValues}`;\n      case \"matrix\":\n        return `;${name}=${joinedValues}`;\n      case \"simple\":\n        return joinedValues;\n      default:\n        return `${name}=${joinedValues}`;\n    }\n  }\n\n  const separator = separatorArrayExplode(style);\n  const joinedValues = value\n    .map((v) => {\n      if (style === \"label\" || style === \"simple\") {\n        return allowReserved ? v : encodeURIComponent(v as string);\n      }\n\n      return serializePrimitiveParam({\n        allowReserved,\n        name,\n        value: v as string,\n      });\n    })\n    .join(separator);\n  return style === \"label\" || style === \"matrix\"\n    ? separator + joinedValues\n    : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n  allowReserved,\n  name,\n  value,\n}: SerializePrimitiveParam): string => {\n  if (value === undefined || value === null) {\n    return \"\";\n  }\n\n  if (typeof value === \"object\") {\n    throw new Error(\n      \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n    );\n  }\n\n  return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\n\nexport const serializeObjectParam = ({\n  allowReserved,\n  explode,\n  name,\n  style,\n  value,\n  valueOnly,\n}: SerializeOptions<ObjectSeparatorStyle> & {\n  value: Record<string, unknown> | Date;\n  valueOnly?: boolean;\n}): string => {\n  if (value instanceof Date) {\n    return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n  }\n\n  if (style !== \"deepObject\" && !explode) {\n    let values: string[] = [];\n    Object.entries(value).forEach(([key, v]) => {\n      values = [\n        ...values,\n        key,\n        allowReserved ? (v as string) : encodeURIComponent(v as string),\n      ];\n    });\n    const joinedValues = values.join(\",\");\n    switch (style) {\n      case \"form\":\n        return `${name}=${joinedValues}`;\n      case \"label\":\n        return `.${joinedValues}`;\n      case \"matrix\":\n        return `;${name}=${joinedValues}`;\n      default:\n        return joinedValues;\n    }\n  }\n\n  const separator = separatorObjectExplode(style);\n  const joinedValues = Object.entries(value)\n    .map(([key, v]) =>\n      serializePrimitiveParam({\n        allowReserved,\n        name: style === \"deepObject\" ? `${name}[${key}]` : key,\n        value: v as string,\n      }),\n    )\n    .join(separator);\n  return style === \"label\" || style === \"matrix\"\n    ? separator + joinedValues\n    : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from \"./bodySerializer.gen\";\nimport {\n  type ArraySeparatorStyle,\n  serializeArrayParam,\n  serializeObjectParam,\n  serializePrimitiveParam,\n} from \"./pathSerializer.gen\";\n\nexport interface PathSerializer {\n  path: Record<string, unknown>;\n  url: string;\n}\n\nexport const PATH_PARAM_RE: RegExp = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({\n  path,\n  url: _url,\n}: PathSerializer): string => {\n  let url = _url;\n  const matches = _url.match(PATH_PARAM_RE);\n  if (matches) {\n    for (const match of matches) {\n      let explode = false;\n      let name = match.substring(1, match.length - 1);\n      let style: ArraySeparatorStyle = \"simple\";\n\n      if (name.endsWith(\"*\")) {\n        explode = true;\n        name = name.substring(0, name.length - 1);\n      }\n\n      if (name.startsWith(\".\")) {\n        name = name.substring(1);\n        style = \"label\";\n      } else if (name.startsWith(\";\")) {\n        name = name.substring(1);\n        style = \"matrix\";\n      }\n\n      const value = path[name];\n\n      if (value === undefined || value === null) {\n        continue;\n      }\n\n      if (Array.isArray(value)) {\n        url = url.replace(\n          match,\n          serializeArrayParam({ explode, name, style, value }),\n        );\n        continue;\n      }\n\n      if (typeof value === \"object\") {\n        url = url.replace(\n          match,\n          serializeObjectParam({\n            explode,\n            name,\n            style,\n            value: value as Record<string, unknown>,\n            valueOnly: true,\n          }),\n        );\n        continue;\n      }\n\n      if (style === \"matrix\") {\n        url = url.replace(\n          match,\n          `;${serializePrimitiveParam({\n            name,\n            value: value as string,\n          })}`,\n        );\n        continue;\n      }\n\n      const replaceValue = encodeURIComponent(\n        style === \"label\" ? `.${value as string}` : (value as string),\n      );\n      url = url.replace(match, replaceValue);\n    }\n  }\n  return url;\n};\n\nexport const getUrl = ({\n  baseUrl,\n  path,\n  query,\n  querySerializer,\n  url: _url,\n}: {\n  baseUrl?: string;\n  path?: Record<string, unknown>;\n  query?: Record<string, unknown>;\n  querySerializer: QuerySerializer;\n  url: string;\n}): string => {\n  const pathUrl = _url.startsWith(\"/\") ? _url : `/${_url}`;\n  let url = (baseUrl ?? \"\") + pathUrl;\n  if (path) {\n    url = defaultPathSerializer({ path, url });\n  }\n  let search = query ? querySerializer(query) : \"\";\n  if (search.startsWith(\"?\")) {\n    search = search.substring(1);\n  }\n  if (search) {\n    url += `?${search}`;\n  }\n  return url;\n};\n\nexport function getValidRequestBody(options: {\n  body?: unknown;\n  bodySerializer?: BodySerializer | null;\n  serializedBody?: unknown;\n}): unknown {\n  const hasBody = options.body !== undefined;\n  const isSerializedBody = hasBody && options.bodySerializer;\n\n  if (isSerializedBody) {\n    if (\"serializedBody\" in options) {\n      const hasSerializedBody =\n        options.serializedBody !== undefined && options.serializedBody !== \"\";\n\n      return hasSerializedBody ? options.serializedBody : null;\n    }\n\n    // not all clients implement a serializedBody property (i.e., client-axios)\n    return options.body !== \"\" ? options.body : null;\n  }\n\n  // plain/text body\n  if (hasBody) {\n    return options.body;\n  }\n\n  // no body was provided\n  return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nexport type AuthToken = string | undefined;\n\nexport interface Auth {\n  /**\n   * Which part of the request do we use to send the auth?\n   *\n   * @default 'header'\n   */\n  in?: \"header\" | \"query\" | \"cookie\";\n  /**\n   * A unique identifier for the security scheme.\n   *\n   * Defined only when there are multiple security schemes whose `Auth`\n   * shape would otherwise be identical.\n   */\n  key?: string;\n  /**\n   * Header or query parameter name.\n   *\n   * @default 'Authorization'\n   */\n  name?: string;\n  scheme?: \"basic\" | \"bearer\";\n  type: \"apiKey\" | \"http\";\n}\n\nexport const getAuthToken = async (\n  auth: Auth,\n  callback: ((auth: Auth) => Promise<AuthToken> | AuthToken) | AuthToken,\n): Promise<string | undefined> => {\n  const token =\n    typeof callback === \"function\" ? await callback(auth) : callback;\n\n  if (!token) {\n    return;\n  }\n\n  if (auth.scheme === \"bearer\") {\n    return `Bearer ${token}`;\n  }\n\n  if (auth.scheme === \"basic\") {\n    return `Basic ${btoa(token)}`;\n  }\n\n  return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from \"../core/auth.gen\";\nimport type { QuerySerializerOptions } from \"../core/bodySerializer.gen\";\nimport { jsonBodySerializer } from \"../core/bodySerializer.gen\";\nimport {\n  serializeArrayParam,\n  serializeObjectParam,\n  serializePrimitiveParam,\n} from \"../core/pathSerializer.gen\";\nimport { getUrl } from \"../core/utils.gen\";\nimport type {\n  Client,\n  ClientOptions,\n  Config,\n  RequestOptions,\n} from \"./types.gen\";\n\nexport const createQuerySerializer = <T = unknown>({\n  parameters = {},\n  ...args\n}: QuerySerializerOptions = {}): ((queryParams: T) => string) => {\n  const querySerializer = (queryParams: T): string => {\n    const search: string[] = [];\n    if (queryParams && typeof queryParams === \"object\") {\n      for (const name in queryParams) {\n        const value = queryParams[name];\n\n        if (value === undefined || value === null) {\n          continue;\n        }\n\n        const options = parameters[name] || args;\n\n        if (Array.isArray(value)) {\n          const serializedArray = serializeArrayParam({\n            allowReserved: options.allowReserved,\n            explode: true,\n            name,\n            style: \"form\",\n            value,\n            ...options.array,\n          });\n          if (serializedArray) search.push(serializedArray);\n        } else if (typeof value === \"object\") {\n          const serializedObject = serializeObjectParam({\n            allowReserved: options.allowReserved,\n            explode: true,\n            name,\n            style: \"deepObject\",\n            value: value as Record<string, unknown>,\n            ...options.object,\n          });\n          if (serializedObject) search.push(serializedObject);\n        } else {\n          const serializedPrimitive = serializePrimitiveParam({\n            allowReserved: options.allowReserved,\n            name,\n            value: value as string,\n          });\n          if (serializedPrimitive) search.push(serializedPrimitive);\n        }\n      }\n    }\n    return search.join(\"&\");\n  };\n  return querySerializer;\n};\n\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (\n  contentType: string | null,\n): Exclude<Config[\"parseAs\"], \"auto\"> => {\n  if (!contentType) {\n    // If no Content-Type header is provided, the best we can do is return the raw response body,\n    // which is effectively the same as the 'stream' option.\n    return \"stream\";\n  }\n\n  const cleanContent = contentType.split(\";\")[0]?.trim();\n\n  if (!cleanContent) {\n    return;\n  }\n\n  if (\n    cleanContent.startsWith(\"application/json\") ||\n    cleanContent.endsWith(\"+json\")\n  ) {\n    return \"json\";\n  }\n\n  if (cleanContent === \"multipart/form-data\") {\n    return \"formData\";\n  }\n\n  if (\n    [\"application/\", \"audio/\", \"image/\", \"video/\"].some((type) =>\n      cleanContent.startsWith(type),\n    )\n  ) {\n    return \"blob\";\n  }\n\n  if (cleanContent.startsWith(\"text/\")) {\n    return \"text\";\n  }\n\n  return;\n};\n\nconst checkForExistence = (\n  options: Pick<RequestOptions, \"auth\" | \"query\"> & {\n    headers: Headers;\n  },\n  name?: string,\n): boolean => {\n  if (!name) {\n    return false;\n  }\n  if (\n    options.headers.has(name) ||\n    options.query?.[name] ||\n    options.headers.get(\"Cookie\")?.includes(`${name}=`)\n  ) {\n    return true;\n  }\n  return false;\n};\n\nexport async function setAuthParams(\n  options: Pick<RequestOptions, \"auth\" | \"query\" | \"security\"> & {\n    headers: Headers;\n  },\n): Promise<void> {\n  for (const auth of options.security ?? []) {\n    if (checkForExistence(options, auth.name)) {\n      continue;\n    }\n\n    const token = await getAuthToken(auth, options.auth);\n\n    if (!token) {\n      continue;\n    }\n\n    const name = auth.name ?? \"Authorization\";\n\n    switch (auth.in) {\n      case \"query\":\n        if (!options.query) {\n          options.query = {};\n        }\n        options.query[name] = token;\n        break;\n      case \"cookie\":\n        options.headers.append(\"Cookie\", `${name}=${token}`);\n        break;\n      case \"header\":\n      default:\n        options.headers.set(name, token);\n        break;\n    }\n  }\n}\n\nexport const buildUrl: Client[\"buildUrl\"] = (options) =>\n  getUrl({\n    baseUrl: options.baseUrl as string,\n    path: options.path,\n    query: options.query,\n    querySerializer:\n      typeof options.querySerializer === \"function\"\n        ? options.querySerializer\n        : createQuerySerializer(options.querySerializer),\n    url: options.url,\n  });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n  const config = { ...a, ...b };\n  if (config.baseUrl?.endsWith(\"/\")) {\n    config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n  }\n  config.headers = mergeHeaders(a.headers, b.headers);\n  return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n  const entries: Array<[string, string]> = [];\n  headers.forEach((value, key) => {\n    entries.push([key, value]);\n  });\n  return entries;\n};\n\nexport const mergeHeaders = (\n  ...headers: Array<Required<Config>[\"headers\"] | undefined>\n): Headers => {\n  const mergedHeaders = new Headers();\n  for (const header of headers) {\n    if (!header) {\n      continue;\n    }\n\n    const iterator =\n      header instanceof Headers\n        ? headersEntries(header)\n        : Object.entries(header);\n\n    for (const [key, value] of iterator) {\n      if (value === null) {\n        mergedHeaders.delete(key);\n      } else if (Array.isArray(value)) {\n        for (const v of value) {\n          mergedHeaders.append(key, v as string);\n        }\n      } else if (value !== undefined) {\n        // assume object headers are meant to be JSON stringified, i.e., their\n        // content value in OpenAPI specification is 'application/json'\n        mergedHeaders.set(\n          key,\n          typeof value === \"object\" ? JSON.stringify(value) : (value as string),\n        );\n      }\n    }\n  }\n  return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n  error: Err,\n  /** response may be undefined due to a network error where no response object is produced */\n  response: Res | undefined,\n  /** request may be undefined, because error may be from building the request object itself */\n  request: Req | undefined,\n  options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (\n  request: Req,\n  options: Options,\n) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n  response: Res,\n  request: Req,\n  options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n  fns: Array<Interceptor | null> = [];\n\n  clear(): void {\n    this.fns = [];\n  }\n\n  eject(id: number | Interceptor): void {\n    const index = this.getInterceptorIndex(id);\n    if (this.fns[index]) {\n      this.fns[index] = null;\n    }\n  }\n\n  exists(id: number | Interceptor): boolean {\n    const index = this.getInterceptorIndex(id);\n    return Boolean(this.fns[index]);\n  }\n\n  getInterceptorIndex(id: number | Interceptor): number {\n    if (typeof id === \"number\") {\n      return this.fns[id] ? id : -1;\n    }\n    return this.fns.indexOf(id);\n  }\n\n  update(\n    id: number | Interceptor,\n    fn: Interceptor,\n  ): number | Interceptor | false {\n    const index = this.getInterceptorIndex(id);\n    if (this.fns[index]) {\n      this.fns[index] = fn;\n      return id;\n    }\n    return false;\n  }\n\n  use(fn: Interceptor): number {\n    this.fns.push(fn);\n    return this.fns.length - 1;\n  }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n  error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n  request: Interceptors<ReqInterceptor<Req, Options>>;\n  response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n  Req,\n  Res,\n  Err,\n  Options\n> => ({\n  error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n  request: new Interceptors<ReqInterceptor<Req, Options>>(),\n  response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n  allowReserved: false,\n  array: {\n    explode: true,\n    style: \"form\",\n  },\n  object: {\n    explode: true,\n    style: \"deepObject\",\n  },\n});\n\nconst defaultHeaders = {\n  \"Content-Type\": \"application/json\",\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n  override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n  ...jsonBodySerializer,\n  headers: defaultHeaders,\n  parseAs: \"auto\",\n  querySerializer: defaultQuerySerializer,\n  ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from \"../core/serverSentEvents.gen\";\nimport type { HttpMethod } from \"../core/types.gen\";\nimport { getValidRequestBody } from \"../core/utils.gen\";\nimport type {\n  Client,\n  Config,\n  RequestOptions,\n  ResolvedRequestOptions,\n} from \"./types.gen\";\nimport {\n  buildUrl,\n  createConfig,\n  createInterceptors,\n  getParseAs,\n  mergeConfigs,\n  mergeHeaders,\n  setAuthParams,\n} from \"./utils.gen\";\n\ntype ReqInit = Omit<RequestInit, \"body\" | \"headers\"> & {\n  body?: any;\n  headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n  let _config = mergeConfigs(createConfig(), config);\n\n  const getConfig = (): Config => ({ ..._config });\n\n  const setConfig = (config: Config): Config => {\n    _config = mergeConfigs(_config, config);\n    return getConfig();\n  };\n\n  const interceptors = createInterceptors<\n    Request,\n    Response,\n    unknown,\n    ResolvedRequestOptions\n  >();\n\n  const beforeRequest = async <\n    TData = unknown,\n    TResponseStyle extends \"data\" | \"fields\" = \"fields\",\n    ThrowOnError extends boolean = boolean,\n    Url extends string = string,\n  >(\n    options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,\n  ) => {\n    const opts = {\n      ..._config,\n      ...options,\n      fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n      headers: mergeHeaders(_config.headers, options.headers),\n      serializedBody: undefined as string | undefined,\n    };\n\n    if (opts.security) {\n      await setAuthParams(opts);\n    }\n\n    if (opts.requestValidator) {\n      await opts.requestValidator(opts);\n    }\n\n    if (opts.body !== undefined && opts.bodySerializer) {\n      opts.serializedBody = opts.bodySerializer(opts.body) as\n        | string\n        | undefined;\n    }\n\n    // remove Content-Type header if body is empty to avoid sending invalid requests\n    if (opts.body === undefined || opts.serializedBody === \"\") {\n      opts.headers.delete(\"Content-Type\");\n    }\n\n    const resolvedOpts = opts as typeof opts &\n      ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;\n    const url = buildUrl(resolvedOpts);\n\n    return { opts: resolvedOpts, url };\n  };\n\n  const request: Client[\"request\"] = async (options) => {\n    const throwOnError = options.throwOnError ?? _config.throwOnError;\n    const responseStyle = options.responseStyle ?? _config.responseStyle;\n\n    let request: Request | undefined;\n    let response: Response | undefined;\n\n    try {\n      const { opts, url } = await beforeRequest(options);\n      const requestInit: ReqInit = {\n        redirect: \"follow\",\n        ...opts,\n        body: getValidRequestBody(opts),\n      };\n\n      request = new Request(url, requestInit);\n\n      for (const fn of interceptors.request.fns) {\n        if (fn) {\n          request = await fn(request, opts);\n        }\n      }\n\n      // fetch must be assigned here, otherwise it would throw the error:\n      // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n      const _fetch = opts.fetch!;\n\n      response = await _fetch(request);\n\n      for (const fn of interceptors.response.fns) {\n        if (fn) {\n          response = await fn(response, request, opts);\n        }\n      }\n\n      const result = {\n        request,\n        response,\n      };\n\n      if (response.ok) {\n        const parseAs =\n          (opts.parseAs === \"auto\"\n            ? getParseAs(response.headers.get(\"Content-Type\"))\n            : opts.parseAs) ?? \"json\";\n\n        if (\n          response.status === 204 ||\n          response.headers.get(\"Content-Length\") === \"0\"\n        ) {\n          let emptyData: any;\n          switch (parseAs) {\n            case \"arrayBuffer\":\n            case \"blob\":\n            case \"text\":\n              emptyData = await response[parseAs]();\n              break;\n            case \"formData\":\n              emptyData = new FormData();\n              break;\n            case \"stream\":\n              emptyData = response.body;\n              break;\n            case \"json\":\n            default:\n              emptyData = {};\n              break;\n          }\n          return opts.responseStyle === \"data\"\n            ? emptyData\n            : {\n                data: emptyData,\n                ...result,\n              };\n        }\n\n        let data: any;\n        switch (parseAs) {\n          case \"arrayBuffer\":\n          case \"blob\":\n          case \"formData\":\n          case \"text\":\n            data = await response[parseAs]();\n            break;\n          case \"json\": {\n            // Some servers return 200 with no Content-Length and empty body.\n            // response.json() would throw; read as text and parse if non-empty.\n            const text = await response.text();\n            data = text ? JSON.parse(text) : {};\n            break;\n          }\n          case \"stream\":\n            return opts.responseStyle === \"data\"\n              ? response.body\n              : {\n                  data: response.body,\n                  ...result,\n                };\n        }\n\n        if (parseAs === \"json\") {\n          if (opts.responseValidator) {\n            await opts.responseValidator(data);\n          }\n\n          if (opts.responseTransformer) {\n            data = await opts.responseTransformer(data);\n          }\n        }\n\n        return opts.responseStyle === \"data\"\n          ? data\n          : {\n              data,\n              ...result,\n            };\n      }\n\n      const textError = await response.text();\n      let jsonError: unknown;\n\n      try {\n        jsonError = JSON.parse(textError);\n      } catch {\n        // noop\n      }\n\n      throw jsonError ?? textError;\n    } catch (error) {\n      let finalError = error;\n\n      for (const fn of interceptors.error.fns) {\n        if (fn) {\n          finalError = await fn(\n            finalError,\n            response,\n            request,\n            options as ResolvedRequestOptions,\n          );\n        }\n      }\n\n      finalError = finalError || {};\n\n      if (throwOnError) {\n        throw finalError;\n      }\n\n      // TODO: we probably want to return error and improve types\n      return responseStyle === \"data\"\n        ? undefined\n        : {\n            error: finalError,\n            request,\n            response,\n          };\n    }\n  };\n\n  const makeMethodFn =\n    (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n      request({ ...options, method });\n\n  const makeSseFn =\n    (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n      const { opts, url } = await beforeRequest(options);\n      return createSseClient({\n        ...opts,\n        body: opts.body as BodyInit | null | undefined,\n        method,\n        onRequest: async (url, init) => {\n          let request = new Request(url, init);\n          for (const fn of interceptors.request.fns) {\n            if (fn) {\n              request = await fn(request, opts);\n            }\n          }\n          return request;\n        },\n        serializedBody: getValidRequestBody(opts) as\n          | BodyInit\n          | null\n          | undefined,\n        url,\n      });\n    };\n\n  const _buildUrl: Client[\"buildUrl\"] = (options) =>\n    buildUrl({ ..._config, ...options });\n\n  return {\n    buildUrl: _buildUrl,\n    connect: makeMethodFn(\"CONNECT\"),\n    delete: makeMethodFn(\"DELETE\"),\n    get: makeMethodFn(\"GET\"),\n    getConfig,\n    head: makeMethodFn(\"HEAD\"),\n    interceptors,\n    options: makeMethodFn(\"OPTIONS\"),\n    patch: makeMethodFn(\"PATCH\"),\n    post: makeMethodFn(\"POST\"),\n    put: makeMethodFn(\"PUT\"),\n    request,\n    setConfig,\n    sse: {\n      connect: makeSseFn(\"CONNECT\"),\n      delete: makeSseFn(\"DELETE\"),\n      get: makeSseFn(\"GET\"),\n      head: makeSseFn(\"HEAD\"),\n      options: makeSseFn(\"OPTIONS\"),\n      patch: makeSseFn(\"PATCH\"),\n      post: makeSseFn(\"POST\"),\n      put: makeSseFn(\"PUT\"),\n      trace: makeSseFn(\"TRACE\"),\n    },\n    trace: makeMethodFn(\"TRACE\"),\n  } as Client;\n};\n","import { createHeyApiErrorInterceptor } from \"@fluid-app/api-client-core\";\nimport { type Client, createClient } from \"@fluid-app/hey-api-fetch-runtime\";\n\nexport type PortalTenantContactsHeyApiClient = Client;\n\nexport interface PortalTenantContactsHeyApiClientConfig {\n  baseUrl: string;\n  fetch?: typeof fetch;\n  credentials?: RequestCredentials;\n  defaultHeaders?: Readonly<Record<string, string>>;\n  onAuthError?: () => void;\n}\n\nfunction isAbortError(error: unknown): boolean {\n  return (\n    (error instanceof DOMException && error.name === \"AbortError\") ||\n    (error instanceof Error && error.name === \"AbortError\")\n  );\n}\n\nexport function createPortalTenantContactsHeyApiClient(\n  config: PortalTenantContactsHeyApiClientConfig,\n): PortalTenantContactsHeyApiClient {\n  const client = createClient({\n    baseUrl: config.baseUrl,\n    credentials: config.credentials,\n    fetch: config.fetch,\n    headers: {\n      Accept: \"application/json\",\n      ...config.defaultHeaders,\n    },\n    throwOnError: true,\n  });\n\n  client.interceptors.error.use(\n    createHeyApiErrorInterceptor({\n      onResponseError: (response) => {\n        if (response.status === 401) {\n          config.onAuthError?.();\n        }\n      },\n      shouldPassThroughTransportError: isAbortError,\n    }),\n  );\n\n  return client;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n  Client,\n  ClientMeta,\n  Options as Options2,\n  RequestResult,\n  TDataShape,\n} from \"@fluid-app/hey-api-fetch-runtime\";\n\nimport type {\n  ContactsBulkDestroyData,\n  ContactsBulkDestroyErrors,\n  ContactsBulkDestroyResponses,\n  ContactsCreateData,\n  ContactsCreateErrors,\n  ContactsCreateResponses,\n  ContactsDestroyData,\n  ContactsDestroyErrors,\n  ContactsDestroyResponses,\n  ContactsGroupsCreateData,\n  ContactsGroupsCreateErrors,\n  ContactsGroupsCreateResponses,\n  ContactsGroupsDestroyData,\n  ContactsGroupsDestroyErrors,\n  ContactsGroupsDestroyResponses,\n  ContactsGroupsListData,\n  ContactsGroupsListErrors,\n  ContactsGroupsListResponses,\n  ContactsGroupsUpdateData,\n  ContactsGroupsUpdateErrors,\n  ContactsGroupsUpdateResponses,\n  ContactsListData,\n  ContactsListErrors,\n  ContactsListResponses,\n  ContactsNotesCreateData,\n  ContactsNotesCreateErrors,\n  ContactsNotesCreateResponses,\n  ContactsNotesDestroyData,\n  ContactsNotesDestroyErrors,\n  ContactsNotesDestroyResponses,\n  ContactsNotesListData,\n  ContactsNotesListErrors,\n  ContactsNotesListResponses,\n  ContactsNotesUpdateData,\n  ContactsNotesUpdateErrors,\n  ContactsNotesUpdateResponses,\n  ContactsShowData,\n  ContactsShowErrors,\n  ContactsShowResponses,\n  ContactsTasksCreateData,\n  ContactsTasksCreateErrors,\n  ContactsTasksCreateResponses,\n  ContactsTasksDestroyData,\n  ContactsTasksDestroyErrors,\n  ContactsTasksDestroyResponses,\n  ContactsTasksListData,\n  ContactsTasksListErrors,\n  ContactsTasksListResponses,\n  ContactsTasksUpdateData,\n  ContactsTasksUpdateErrors,\n  ContactsTasksUpdateResponses,\n  ContactsUpdateData,\n  ContactsUpdateErrors,\n  ContactsUpdateResponses,\n} from \"./types.gen\";\n\nexport type Options<\n  TData extends TDataShape = TDataShape,\n  ThrowOnError extends boolean = boolean,\n  TResponse = unknown,\n> = Options2<TData, ThrowOnError, TResponse> & {\n  /**\n   * You can provide a client instance returned by `createClient()` instead of\n   * individual options. This might be also useful if you want to implement a\n   * custom client.\n   */\n  client: Client;\n  /**\n   * You can pass arbitrary values through the `meta` object. This can be\n   * used to access values that aren't defined as part of the SDK function.\n   */\n  meta?: keyof ClientMeta extends never ? Record<string, unknown> : ClientMeta;\n};\n\n/**\n * List contacts with cursor pagination\n *\n * Returns a paginated list of contacts belonging to the authenticated member.\n */\nexport const contactsList = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsListData, ThrowOnError>,\n): RequestResult<\n  ContactsListResponses,\n  ContactsListErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.get<\n    ContactsListResponses,\n    ContactsListErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts\",\n    ...options,\n  });\n\n/**\n * Create a new contact\n *\n * Creates a new contact for the authenticated member.\n */\nexport const contactsCreate = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsCreateData, ThrowOnError>,\n): RequestResult<\n  ContactsCreateResponses,\n  ContactsCreateErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.post<\n    ContactsCreateResponses,\n    ContactsCreateErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n\n/**\n * Delete a contact\n *\n * Soft-deletes a contact by ID.\n */\nexport const contactsDestroy = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsDestroyData, ThrowOnError>,\n): RequestResult<\n  ContactsDestroyResponses,\n  ContactsDestroyErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.delete<\n    ContactsDestroyResponses,\n    ContactsDestroyErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{id}\",\n    ...options,\n  });\n\n/**\n * Get a specific contact\n *\n * Returns a single contact by ID.\n */\nexport const contactsShow = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsShowData, ThrowOnError>,\n): RequestResult<\n  ContactsShowResponses,\n  ContactsShowErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.get<\n    ContactsShowResponses,\n    ContactsShowErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{id}\",\n    ...options,\n  });\n\n/**\n * Update a contact\n *\n * Updates an existing contact's attributes.\n */\nexport const contactsUpdate = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsUpdateData, ThrowOnError>,\n): RequestResult<\n  ContactsUpdateResponses,\n  ContactsUpdateErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.patch<\n    ContactsUpdateResponses,\n    ContactsUpdateErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{id}\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n\n/**\n * Delete multiple contacts\n *\n * Soft-deletes multiple contacts by their IDs.\n */\nexport const contactsBulkDestroy = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsBulkDestroyData, ThrowOnError>,\n): RequestResult<\n  ContactsBulkDestroyResponses,\n  ContactsBulkDestroyErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.delete<\n    ContactsBulkDestroyResponses,\n    ContactsBulkDestroyErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/bulk\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n\n/**\n * List contact groups\n *\n * Returns a paginated list of contact groups belonging to the authenticated member.\n */\nexport const contactsGroupsList = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsGroupsListData, ThrowOnError>,\n): RequestResult<\n  ContactsGroupsListResponses,\n  ContactsGroupsListErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.get<\n    ContactsGroupsListResponses,\n    ContactsGroupsListErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/groups\",\n    ...options,\n  });\n\n/**\n * Create a new group\n *\n * Creates a new contact group for the authenticated member.\n */\nexport const contactsGroupsCreate = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsGroupsCreateData, ThrowOnError>,\n): RequestResult<\n  ContactsGroupsCreateResponses,\n  ContactsGroupsCreateErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.post<\n    ContactsGroupsCreateResponses,\n    ContactsGroupsCreateErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/groups\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n\n/**\n * Delete a group\n *\n * Removes a contact group.\n */\nexport const contactsGroupsDestroy = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsGroupsDestroyData, ThrowOnError>,\n): RequestResult<\n  ContactsGroupsDestroyResponses,\n  ContactsGroupsDestroyErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.delete<\n    ContactsGroupsDestroyResponses,\n    ContactsGroupsDestroyErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/groups/{id}\",\n    ...options,\n  });\n\n/**\n * Update a group\n *\n * Updates an existing contact group.\n */\nexport const contactsGroupsUpdate = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsGroupsUpdateData, ThrowOnError>,\n): RequestResult<\n  ContactsGroupsUpdateResponses,\n  ContactsGroupsUpdateErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.patch<\n    ContactsGroupsUpdateResponses,\n    ContactsGroupsUpdateErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/groups/{id}\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n\n/**\n * List notes for a contact\n *\n * Returns notes attached to a contact.\n */\nexport const contactsNotesList = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsNotesListData, ThrowOnError>,\n): RequestResult<\n  ContactsNotesListResponses,\n  ContactsNotesListErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.get<\n    ContactsNotesListResponses,\n    ContactsNotesListErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{contact_id}/notes\",\n    ...options,\n  });\n\n/**\n * Create a note for a contact\n *\n * Adds a new note to a contact.\n */\nexport const contactsNotesCreate = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsNotesCreateData, ThrowOnError>,\n): RequestResult<\n  ContactsNotesCreateResponses,\n  ContactsNotesCreateErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.post<\n    ContactsNotesCreateResponses,\n    ContactsNotesCreateErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{contact_id}/notes\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n\n/**\n * List tasks for a contact\n *\n * Returns tasks assigned to a contact.\n */\nexport const contactsTasksList = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsTasksListData, ThrowOnError>,\n): RequestResult<\n  ContactsTasksListResponses,\n  ContactsTasksListErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.get<\n    ContactsTasksListResponses,\n    ContactsTasksListErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{contact_id}/tasks\",\n    ...options,\n  });\n\n/**\n * Create a task for a contact\n *\n * Adds a new task to a contact.\n */\nexport const contactsTasksCreate = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsTasksCreateData, ThrowOnError>,\n): RequestResult<\n  ContactsTasksCreateResponses,\n  ContactsTasksCreateErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.post<\n    ContactsTasksCreateResponses,\n    ContactsTasksCreateErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{contact_id}/tasks\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n\n/**\n * Delete a note\n *\n * Removes a note from a contact.\n */\nexport const contactsNotesDestroy = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsNotesDestroyData, ThrowOnError>,\n): RequestResult<\n  ContactsNotesDestroyResponses,\n  ContactsNotesDestroyErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.delete<\n    ContactsNotesDestroyResponses,\n    ContactsNotesDestroyErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{contact_id}/notes/{id}\",\n    ...options,\n  });\n\n/**\n * Update a note\n *\n * Updates an existing note on a contact.\n */\nexport const contactsNotesUpdate = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsNotesUpdateData, ThrowOnError>,\n): RequestResult<\n  ContactsNotesUpdateResponses,\n  ContactsNotesUpdateErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.patch<\n    ContactsNotesUpdateResponses,\n    ContactsNotesUpdateErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{contact_id}/notes/{id}\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n\n/**\n * Delete a task\n *\n * Removes a task from a contact.\n */\nexport const contactsTasksDestroy = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsTasksDestroyData, ThrowOnError>,\n): RequestResult<\n  ContactsTasksDestroyResponses,\n  ContactsTasksDestroyErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.delete<\n    ContactsTasksDestroyResponses,\n    ContactsTasksDestroyErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{contact_id}/tasks/{id}\",\n    ...options,\n  });\n\n/**\n * Update a task\n *\n * Updates an existing task on a contact.\n */\nexport const contactsTasksUpdate = <ThrowOnError extends boolean = true>(\n  options: Options<ContactsTasksUpdateData, ThrowOnError>,\n): RequestResult<\n  ContactsTasksUpdateResponses,\n  ContactsTasksUpdateErrors,\n  ThrowOnError,\n  \"data\"\n> =>\n  options.client.patch<\n    ContactsTasksUpdateResponses,\n    ContactsTasksUpdateErrors,\n    ThrowOnError,\n    \"data\"\n  >({\n    responseStyle: \"data\",\n    security: [\n      {\n        in: \"cookie\",\n        name: \"portal_tenant_user_id\",\n        type: \"apiKey\",\n      },\n    ],\n    url: \"/api/contacts/{contact_id}/tasks/{id}\",\n    ...options,\n    headers: {\n      \"Content-Type\": \"application/json\",\n      ...options.headers,\n    },\n  });\n","import type { ContactsApi } from \"@fluid-app/contacts-core/contacts-api\";\nimport type { ContactsDomainApi } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport type { GroupsApi } from \"@fluid-app/contacts-core/groups-api\";\nimport type { NotesApi } from \"@fluid-app/contacts-core/notes-api\";\nimport type { TasksApi } from \"@fluid-app/contacts-core/tasks-api\";\nimport type {\n  Contact,\n  ContactGroup,\n  ContactNote,\n  ContactTask,\n  PaginationMeta,\n} from \"@fluid-app/contacts-core/types\";\nimport type { PortalTenantContactsHeyApiClient } from \"@fluid-app/portal-tenant-contacts-api-client/client\";\nimport {\n  contactsBulkDestroy,\n  contactsCreate,\n  contactsDestroy,\n  contactsGroupsCreate,\n  contactsGroupsDestroy,\n  contactsGroupsList,\n  contactsGroupsUpdate,\n  contactsList,\n  contactsNotesCreate,\n  contactsNotesDestroy,\n  contactsNotesList,\n  contactsNotesUpdate,\n  contactsShow,\n  contactsTasksCreate,\n  contactsTasksDestroy,\n  contactsTasksList,\n  contactsTasksUpdate,\n  contactsUpdate,\n} from \"@fluid-app/portal-tenant-contacts-api-client/sdk\";\nimport type {\n  Contact as BffContact,\n  ContactCreate,\n  ContactUpdate,\n  ContactsListData,\n  Group,\n  Note,\n  Task,\n} from \"@fluid-app/portal-tenant-contacts-api-client/types\";\n\nconst EMPTY_META: PaginationMeta = {\n  total_count: 0,\n  total_pages: 0,\n  current_page: 1,\n  next_cursor: null,\n};\n\nfunction toNumericId(id: string): number {\n  return Number(id);\n}\n\nfunction paginationFromBff(\n  meta:\n    | {\n        request_id?: string | null;\n        timestamp?: string;\n        total_count?: number;\n        pagination?: { next_cursor?: string | null };\n      }\n    | undefined,\n  itemCount: number,\n  currentPage: number,\n  pageSize: number,\n): PaginationMeta {\n  if (!meta) return EMPTY_META;\n\n  const nextCursor = meta.pagination?.next_cursor ?? null;\n  const totalCount =\n    meta.total_count ??\n    (nextCursor\n      ? (currentPage + 1) * pageSize\n      : (currentPage - 1) * pageSize + itemCount);\n\n  return {\n    total_count: totalCount,\n    total_pages: Math.max(1, Math.ceil(totalCount / pageSize)),\n    current_page: currentPage,\n    next_cursor: nextCursor,\n    request_id: meta.request_id ?? undefined,\n    timestamp: meta.timestamp,\n  };\n}\n\nfunction mapContact(raw: BffContact): Contact {\n  const extended = raw as BffContact & { country?: Contact[\"country\"] };\n\n  return {\n    id: raw.id ?? 0,\n    full_name: `${raw.first_name ?? \"\"} ${raw.last_name ?? \"\"}`.trim(),\n    first_name: raw.first_name ?? null,\n    last_name: raw.last_name ?? null,\n    email: raw.email ?? null,\n    phone: raw.phone ?? null,\n    status: raw.status ?? null,\n    address: raw.address ?? null,\n    city: raw.city ?? null,\n    state: raw.state ?? null,\n    postal_code: raw.postal_code ?? null,\n    avatar_url: raw.avatar_url ?? null,\n    country: extended.country ?? null,\n    tags: raw.tags ?? [],\n    metadata: {},\n    created_at: raw.created_at ?? \"\",\n    updated_at: raw.updated_at ?? \"\",\n  } satisfies Contact;\n}\n\nfunction mapNote(raw: Note): ContactNote {\n  return {\n    id: raw.id ?? 0,\n    title: raw.title ?? \"\",\n    body: raw.body ?? \"\",\n    note_type: null,\n    due_date: null,\n    due_time: null,\n    pinned: null,\n    created_at: raw.created_at ?? \"\",\n    updated_at: raw.updated_at ?? \"\",\n    contact_id: raw.contact_id ?? 0,\n    assets: [],\n  } satisfies ContactNote;\n}\n\nfunction mapTask(raw: Task): ContactTask {\n  const extended = raw as Task & { completed_at?: string | null };\n\n  return {\n    id: raw.id ?? 0,\n    body: raw.title ?? \"\",\n    due_at: raw.due_date ?? null,\n    completed_at:\n      extended.completed_at ??\n      (raw.completed ? new Date().toISOString() : null),\n    created_at: raw.created_at ?? \"\",\n    contact_id: raw.contact_id ?? null,\n  } satisfies ContactTask;\n}\n\nfunction mapGroup(raw: Group): ContactGroup {\n  return {\n    id: raw.id ?? 0,\n    name: raw.name ?? \"\",\n    avatar: raw.avatar ?? null,\n    avatar_background: raw.avatar_background ?? null,\n    contacts_count: raw.contacts_count ?? 0,\n    created_at: raw.created_at ?? \"\",\n    updated_at: raw.updated_at ?? \"\",\n  } satisfies ContactGroup;\n}\n\nconst cursorCachesByClient = new WeakMap<\n  PortalTenantContactsHeyApiClient,\n  Map<string, Map<number, string>>\n>();\n\nfunction cursorCacheKey(params: Record<string, unknown> | undefined): string {\n  return JSON.stringify({\n    limit: params?.per_page ?? params?.limit ?? null,\n    search: params?.search_query ?? params?.search ?? params?.query ?? null,\n    tags: params?.tags ?? null,\n  });\n}\n\nfunction cursorCacheFor(\n  client: PortalTenantContactsHeyApiClient,\n  params: Record<string, unknown> | undefined,\n): Map<number, string> {\n  let byQuery = cursorCachesByClient.get(client);\n  if (!byQuery) {\n    byQuery = new Map();\n    cursorCachesByClient.set(client, byQuery);\n  }\n\n  const key = cursorCacheKey(params);\n  const existing = byQuery.get(key);\n  if (existing) return existing;\n\n  const cache = new Map<number, string>();\n  byQuery.set(key, cache);\n  return cache;\n}\n\nfunction mapListParams(\n  params: Record<string, unknown> | undefined,\n  cursorCache: ReadonlyMap<number, string>,\n): ContactsListData[\"query\"] | null {\n  if (!params) return undefined;\n\n  const page = typeof params.page === \"number\" ? params.page : 1;\n  const limitValue = params.per_page ?? params.limit;\n  const searchValue = params.search_query ?? params.search ?? params.query;\n  const tags = Array.isArray(params.tags)\n    ? params.tags.filter((tag): tag is string => typeof tag === \"string\")\n    : undefined;\n\n  const cursor = page > 1 ? cursorCache.get(page) : undefined;\n  if (page > 1 && cursor === undefined) return null;\n\n  return {\n    ...(typeof limitValue === \"number\" ? { \"page[limit]\": limitValue } : {}),\n    ...(cursor !== undefined ? { \"page[cursor]\": cursor } : {}),\n    ...(typeof searchValue === \"string\" ? { search: searchValue } : {}),\n    ...(tags ? { tags } : {}),\n  };\n}\n\nfunction createContactsAdapter(\n  client: PortalTenantContactsHeyApiClient,\n): ContactsApi {\n  return {\n    getContact: async (id) => {\n      const response = await contactsShow({\n        client,\n        path: { id: toNumericId(id) },\n      });\n      return { contact: mapContact(response.contact ?? {}) };\n    },\n    listContacts: async (params) => {\n      const page = typeof params?.page === \"number\" ? params.page : 1;\n      const pageSize =\n        typeof params?.per_page === \"number\" ? params.per_page : 25;\n      const cursorCache = cursorCacheFor(client, params);\n      const query = mapListParams(params, cursorCache);\n      if (query === null) {\n        return {\n          contacts: [],\n          meta: paginationFromBff(undefined, 0, page, pageSize),\n        };\n      }\n      const response = await contactsList({\n        client,\n        ...(query ? { query } : {}),\n      });\n      const nextCursor = response.meta?.pagination?.next_cursor;\n      if (nextCursor) cursorCache.set(page + 1, nextCursor);\n\n      const contacts = (response.contacts ?? []).map(mapContact);\n      return {\n        contacts,\n        meta: paginationFromBff(response.meta, contacts.length, page, pageSize),\n      };\n    },\n    createContact: (data) =>\n      contactsCreate({\n        client,\n        body: { contact: data as ContactCreate },\n      }),\n    updateContact: (id, data) =>\n      contactsUpdate({\n        client,\n        path: { id: toNumericId(id) },\n        body: { contact: data as ContactUpdate },\n      }),\n    deleteContact: (id) =>\n      contactsDestroy({ client, path: { id: toNumericId(id) } }),\n    bulkDeleteContacts: (ids) => contactsBulkDestroy({ client, body: { ids } }),\n  };\n}\n\nfunction createNotesAdapter(\n  client: PortalTenantContactsHeyApiClient,\n): NotesApi {\n  return {\n    listNotes: async (contactId) => {\n      const response = await contactsNotesList({\n        client,\n        path: { contact_id: toNumericId(contactId) },\n      });\n      return { notes: (response.notes ?? []).map(mapNote) };\n    },\n    createNote: (contactId, input) =>\n      contactsNotesCreate({\n        client,\n        path: { contact_id: toNumericId(contactId) },\n        body: { note: { title: input.title, body: input.body } },\n      }),\n    updateNote: (noteId, contactId, input) =>\n      contactsNotesUpdate({\n        client,\n        path: { contact_id: toNumericId(contactId), id: noteId },\n        body: { note: { title: input.title, body: input.body } },\n      }),\n    deleteNote: (noteId, contactId) =>\n      contactsNotesDestroy({\n        client,\n        path: { contact_id: toNumericId(contactId), id: noteId },\n      }),\n  };\n}\n\nfunction createTasksAdapter(\n  client: PortalTenantContactsHeyApiClient,\n): TasksApi {\n  return {\n    listTasks: async (contactId) => {\n      const response = await contactsTasksList({\n        client,\n        path: { contact_id: toNumericId(contactId) },\n      });\n      return { tasks: (response.tasks ?? []).map(mapTask) };\n    },\n    createTask: (contactId, input) =>\n      contactsTasksCreate({\n        client,\n        path: { contact_id: toNumericId(contactId) },\n        body: { task: { title: input.body, due_date: input.due_at } },\n      }),\n    updateTask: (taskId, contactId, input) =>\n      contactsTasksUpdate({\n        client,\n        path: { contact_id: toNumericId(contactId), id: taskId },\n        body: {\n          task: {\n            title: input.body ?? undefined,\n            completed:\n              input.completed_at === undefined\n                ? undefined\n                : input.completed_at !== null,\n            due_date: input.due_at,\n          },\n        },\n      }),\n    deleteTask: (taskId, contactId) =>\n      contactsTasksDestroy({\n        client,\n        path: { contact_id: toNumericId(contactId), id: taskId },\n      }),\n  };\n}\n\nfunction createGroupsAdapter(\n  client: PortalTenantContactsHeyApiClient,\n): GroupsApi {\n  return {\n    listGroups: async () => {\n      const response = await contactsGroupsList({ client });\n      return { groups: (response.groups ?? []).map(mapGroup) };\n    },\n    createGroup: async (input) => {\n      const response = await contactsGroupsCreate({\n        client,\n        body: { group: input },\n      });\n      return { group: mapGroup(response.group ?? {}) };\n    },\n    updateGroup: async (groupId, input) => {\n      const response = await contactsGroupsUpdate({\n        client,\n        path: { id: groupId },\n        body: { group: input },\n      });\n      return { group: mapGroup(response.group ?? {}) };\n    },\n    deleteGroup: (groupId) =>\n      contactsGroupsDestroy({ client, path: { id: groupId } }),\n  };\n}\n\nexport function createPortalContactsDomainApiAdapter(\n  client: PortalTenantContactsHeyApiClient,\n): ContactsDomainApi {\n  return {\n    contacts: createContactsAdapter(client),\n    notes: createNotesAdapter(client),\n    tasks: createTasksAdapter(client),\n    groups: createGroupsAdapter(client),\n  };\n}\n","import { createContext, type ReactNode, use, useMemo } from \"react\";\nimport { useAccount } from \"../hooks/use-account\";\nimport type { FluidSDKConfig } from \"../types/config\";\n\nexport interface FluidContextValue {\n  readonly config: FluidSDKConfig;\n}\n\nconst FluidContext = createContext<FluidContextValue | null>(null);\n\n/**\n * Provides SDK configuration and hydrates its country from the authenticated\n * account. Shared widget hosts use this provider as part of the exhaustive\n * portal runtime contract.\n */\nexport function FluidConfigProvider({\n  children,\n  config,\n}: {\n  children: ReactNode;\n  config: FluidSDKConfig;\n}): React.JSX.Element {\n  const { data: account } = useAccount();\n  const value = useMemo<FluidContextValue>(() => {\n    const countryIso =\n      account?.market_country_iso ?? account?.default_country_iso;\n\n    return {\n      config: countryIso ? { ...config, countryIso } : config,\n    };\n  }, [config, account?.market_country_iso, account?.default_country_iso]);\n\n  return (\n    <FluidContext.Provider value={value}>{children}</FluidContext.Provider>\n  );\n}\n\nexport function useFluidContext(): FluidContextValue {\n  const context = use(FluidContext);\n  if (!context) {\n    throw new Error(\"useFluidContext must be used within a FluidProvider\");\n  }\n  return context;\n}\n","import { useMemo, useRef, type ReactElement, type ReactNode } from \"react\";\nimport type { ContactsDomainApi } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport { ContactsApiProvider } from \"@fluid-app/contacts-core/contacts-api-context\";\nimport { createPortalTenantContactsHeyApiClient } from \"@fluid-app/portal-tenant-contacts-api-client/client\";\nimport { createPortalContactsDomainApiAdapter } from \"../adapters/contacts-api-adapter\";\nimport { useFluidContext } from \"../providers/FluidConfigProvider\";\n\nexport function PortalContactsApiProvider({\n  children,\n  api: injectedApi,\n}: {\n  api?: ContactsDomainApi;\n  children: ReactNode;\n}): ReactElement {\n  const { config } = useFluidContext();\n  const configRef = useRef(config);\n  configRef.current = config;\n  const { baseUrl } = config;\n  const csrfToken =\n    typeof document === \"undefined\"\n      ? null\n      : document\n          .querySelector('meta[name=\"csrf-token\"]')\n          ?.getAttribute(\"content\");\n\n  const client = useMemo(\n    () =>\n      createPortalTenantContactsHeyApiClient({\n        baseUrl,\n        credentials: \"include\",\n        defaultHeaders: {\n          ...configRef.current.defaultHeaders,\n          ...(csrfToken ? { \"X-CSRF-Token\": csrfToken } : {}),\n        },\n        onAuthError: () => configRef.current.onAuthError?.(),\n      }),\n    [baseUrl, csrfToken],\n  );\n\n  const api = useMemo(\n    () => createPortalContactsDomainApiAdapter(client),\n    [client],\n  );\n\n  return (\n    <ContactsApiProvider value={injectedApi ?? api}>\n      {children}\n    </ContactsApiProvider>\n  );\n}\n","export const contactsEn = {\n  breadcrumb: \"Contacts\",\n  breadcrumb_new: \"New Contact\",\n  contact_label: \"Contact\",\n  contacts_deleted_successfully: \"Contacts deleted successfully\",\n  add: \"Add\",\n  add_contact: \"Add Contact\",\n  add_todo: \"Add to-do\",\n  add_todo_dialog_title: \"Add a to-do\",\n  adding: \"Adding...\",\n  update_contact: \"Update Contact\",\n  saving: \"Saving\",\n  cancel: \"Cancel\",\n  save: \"Save\",\n  delete: \"Delete\",\n  delete_name: \"Delete {{name}}?\",\n  delete_confirm_permanent:\n    \"This permanently removes the contact and all of their notes, tasks, and activity. This can't be undone.\",\n  delete_contact: \"Delete contact\",\n  delete_contact_confirm_one:\n    \"Are you sure you want to delete this contact? This action cannot be undone.\",\n  delete_contact_confirm_other:\n    \"Are you sure you want to delete {{count}} contacts? This action cannot be undone.\",\n  delete_contact_title: \"Delete contact?\",\n  deleting: \"Deleting...\",\n  search_placeholder: \"Search contacts\",\n  error_loading: \"Couldn't load contact\",\n  error_loading_description:\n    \"This contact may have been deleted, you may not have permission to view it, or there was a network error. Try selecting them again.\",\n  error_loading_list: \"Couldn't load contacts. Pull down to retry.\",\n  error_generic: \"Something went wrong. Please try again later.\",\n  loading: \"Loading...\",\n  loading_more: \"Loading more...\",\n  searching: \"Searching...\",\n  people_count: \"{{count}} people across your network\",\n  person_count: \"{{count}} person across your network\",\n  no_contacts_search: 'No contacts match \"{{term}}\".',\n  no_contacts_yet: \"No contacts yet.\",\n  no_contacts_filter: \"No contacts match this filter.\",\n  empty_select_contact: \"Select a contact\",\n  empty_select_description:\n    \"Pick someone from your list on the left to see their details, notes, and tasks.\",\n  tab_tasks: \"Tasks\",\n  tab_notes: \"Notes\",\n  edit_profile: \"Edit profile\",\n  editing_name: \"Editing {{name}}\",\n  profile_edit_description:\n    \"Update details below. Your contact card above is paused while you edit.\",\n  new_task: \"New task\",\n  last_updated: \"Last updated {{date}}\",\n  label_email: \"Email\",\n  label_phone: \"Phone\",\n  label_address: \"Address\",\n  label_call: \"Call\",\n  label_first_name: \"First Name\",\n  label_last_name: \"Last Name\",\n  label_city: \"City\",\n  label_country: \"Country\",\n  label_full_address: \"Full Address\",\n  label_postal_code: \"Postal Code\",\n  label_state: \"State/Province\",\n  label_status: \"Status\",\n  not_set: \"Not set\",\n  more_actions: \"More actions\",\n  back_to_contacts: \"Back to contacts\",\n  back_to_tasks: \"Back to Tasks\",\n  filter_all: \"All\",\n  filter_leads: \"Leads\",\n  filter_customers: \"Customers\",\n  note_placeholder: \"Leave a note about this contact…\",\n  note_body_aria: \"Note body\",\n  add_note: \"Add note\",\n  tip_save_shortcut_mac: \"Tip: ⌘ + Enter to save\",\n  tip_save_shortcut_other: \"Tip: Ctrl + Enter to save\",\n  task_describe_placeholder: \"Describe the task…\",\n  task_description_aria: \"Task description\",\n  task_discard_aria: \"Discard task\",\n  add_task: \"Add task\",\n  quick_today: \"Today\",\n  quick_tomorrow: \"Tomorrow\",\n  task_select_date: \"Select Date\",\n  task_due_in_days: \"In {{count}} days\",\n  task_next_week: \"Next Week\",\n  task_no_date: \"No Date\",\n  task_custom_calendar: \"Custom Calendar\",\n  task_time_label: \"Time\",\n  task_time_aria: \"Select due time\",\n  calendar_next_month: \"Go to next month\",\n  calendar_previous_month: \"Go to previous month\",\n  calendar_month_dropdown: \"Month: \",\n  calendar_year_dropdown: \"Year: \",\n  calendar_week_number: \"Week {{number}}\",\n  task_custom_date_selected_aria: \"Change due date: {{date}}\",\n  task_custom_date_aria: \"Select due date\",\n  edit_contact_name: \"Edit {{name}}\",\n  save_changes: \"Save changes\",\n  add_field: \"Add {{field}}\",\n  copy_field: \"Copy {{field}}\",\n  copied_field: \"Copied {{field}}\",\n  attachment_one: \"1 attachment\",\n  attachment_other: \"{{count}} attachments\",\n  note_actions: \"Note actions\",\n  delete_note_title: \"Delete note?\",\n  delete_note_irreversible: \"This action cannot be undone.\",\n  task_yesterday: \"Yesterday\",\n  task_days_ago_one: \"1 day ago\",\n  task_days_ago_other: \"{{count}} days ago\",\n  task_overdue_due: \"Overdue · {{date}}\",\n  task_due: \"Due {{date}}\",\n  mark_as_open: \"Mark as open\",\n  mark_as_completed: \"Mark as completed\",\n  task_actions: \"Task actions\",\n  delete_task_title: \"Delete task?\",\n  delete_task_confirm:\n    \"Are you sure you want to delete this task? This action cannot be undone.\",\n  groups_manage_groups: \"Manage Groups\",\n  groups_manage_title: \"Manage Groups\",\n  groups_back_to_contacts: \"Back to contacts\",\n  groups_new_group: \"New Group\",\n  groups_empty: \"No groups yet. Create a group to get started.\",\n  groups_delete_title: \"Delete group?\",\n  groups_delete_confirm:\n    \"Are you sure you want to delete “{{name}}”? Contacts in this group will not be deleted, but they will be removed from the group.\",\n  groups_create_title: \"Create Group\",\n  groups_edit_title: \"Edit Group\",\n  groups_remove_emoji: \"Remove emoji\",\n  groups_avatar: \"Avatar\",\n  groups_name_label: \"Group Name\",\n  groups_name_placeholder: \"Group name\",\n  groups_tab_change_emoji: \"Change Emoji\",\n  groups_tab_change_color: \"Change color\",\n  groups_no_emoji_found: \"No emoji found.\",\n  groups_close: \"Close\",\n  groups_creating: \"Creating...\",\n  groups_create: \"Create\",\n  groups_created_toast: 'Group \"{{name}}\" created',\n  groups_create_failed: \"Failed to create group\",\n  groups_create_new_group: \"Create New Group\",\n  groups_updated_toast: \"Group updated\",\n  groups_update_failed: \"Failed to update group\",\n  groups_deleted_toast: 'Group \"{{name}}\" deleted',\n  groups_delete_failed: \"Failed to delete group\",\n  groups_contact_one: \"{{count}} contact\",\n  groups_contact_other: \"{{count}} contacts\",\n  groups_member_one: \"{{count}} member\",\n  groups_member_other: \"{{count}} members\",\n  groups_search_contacts_to_add: \"Search contacts to add...\",\n  groups_no_contacts_found: \"No contacts found\",\n  groups_loading_members: \"Loading members...\",\n  groups_empty_members:\n    \"No contacts in this group yet. Use the search above to add contacts.\",\n  groups_edit_aria: \"Edit {{name}}\",\n  groups_delete_aria: \"Delete {{name}}\",\n  groups_remove_member_aria: \"Remove {{name}}\",\n  groups_member_added_toast: \"{{contact}} added to {{group}}\",\n  groups_member_removed_toast: \"{{contact}} removed from {{group}}\",\n  groups_member_add_failed: \"Failed to add {{contact}} to {{group}}\",\n  groups_member_remove_failed: \"Failed to remove {{contact}} from {{group}}\",\n  groups_inline_search_placeholder: \"Search\",\n  groups_inline_create: 'Create \"{{name}}\"',\n  groups_inline_create_failed: 'Failed to create group \"{{name}}\"',\n  groups_inline_no_groups_found: \"No groups found\",\n  groups_inline_selected_one: \"{{count}} group selected\",\n  groups_inline_selected_other: \"{{count}} groups selected\",\n  groups_color_red: \"Red\",\n  groups_color_orange: \"Orange\",\n  groups_color_yellow: \"Yellow\",\n  groups_color_green: \"Green\",\n  groups_color_teal: \"Teal\",\n  groups_color_cyan: \"Cyan\",\n  groups_color_blue: \"Blue\",\n  groups_color_indigo: \"Indigo\",\n  groups_color_purple: \"Purple\",\n  groups_color_pink: \"Pink\",\n  groups_add_group: \"Add Group\",\n  groups_add_to_group: \"Add to Group\",\n  groups_no_groups_yet: \"No groups yet\",\n  groups_tags_save_failed: \"Failed to save group changes\",\n  groups_title: \"Groups\",\n  groups_options_aria: \"Group options\",\n  contacts_deleted_one: \"{{count}} contact deleted\",\n  contacts_deleted_other: \"{{count}} contacts deleted\",\n  contact_deleted_toast: \"{{name}} deleted\",\n  contact_delete_failed: \"Failed to delete contact\",\n  contacts_delete_failed_one: \"Failed to delete contact\",\n  contacts_delete_failed_other: \"Failed to delete contacts\",\n  contacts_added_to_group_one: \"Added {{count}} contact to {{group}}\",\n  contacts_added_to_group_other: \"Added {{count}} contacts to {{group}}\",\n  contacts_add_to_group_failed_one: \"Failed to add contact to {{group}}\",\n  contacts_add_to_group_failed_other: \"Failed to add contacts to {{group}}\",\n  delete_contact_aria: \"Delete {{name}}\",\n  placeholder_first_name: \"Enter first name\",\n  placeholder_last_name: \"Enter last name\",\n  placeholder_email: \"Enter email address\",\n  placeholder_phone: \"Enter phone number\",\n  placeholder_full_address: \"Enter street address\",\n  placeholder_city: \"Enter city\",\n  placeholder_country: \"Select country\",\n  placeholder_state: \"Enter state or province\",\n  placeholder_postal_code: \"Enter postal code\",\n  placeholder_status: \"Select status\",\n  status_new: \"New\",\n  status_active: \"Active\",\n  status_inactive: \"Inactive\",\n  status_cold: \"Cold\",\n  status_lead: \"Lead\",\n  status_customer: \"Customer\",\n  // ManageGroupsModal / CreateGroupModal\n  groups_manage_for_contact: \"Manage Groups for {{name}}\",\n  groups_available: \"Available Groups\",\n  groups_name_required_title: \"Group name required\",\n  groups_name_required_description: \"Please enter a name for the new group\",\n  groups_already_exists_title: \"Group already exists\",\n  groups_already_exists_description: 'A group named \"{{name}}\" already exists',\n  groups_choose_emoji: \"Choose Emoji\",\n  groups_choose_color: \"Choose Color\",\n  // Task toasts\n  task_updated: \"Task updated\",\n  task_created: \"Task created\",\n  task_deleted: \"Task deleted\",\n  task_update_failed: \"Failed to update task\",\n  task_create_failed: \"Failed to create task\",\n  task_delete_failed: \"Failed to delete task\",\n  // Note toasts\n  note_created: \"Note created\",\n  note_updated: \"Note updated\",\n  note_deleted: \"Note deleted\",\n  note_create_failed: \"Failed to create note\",\n  note_update_failed: \"Failed to update note\",\n  note_delete_failed: \"Failed to delete note\",\n  // Contact mutation toasts (shared hooks)\n  contact_created: \"Contact created successfully\",\n  contact_updated: \"Contact updated successfully\",\n  contact_deleted: \"Contact deleted successfully\",\n  contact_create_failed: \"Failed to create contact\",\n  contact_save_failed: \"Failed to save contact\",\n  form_errors_title: \"Please fix the form errors before saving\",\n  // Validation\n  validation_first_name_required: \"First name is required\",\n  validation_last_name_required: \"Last name is required\",\n  // Orders\n  orders_title: \"Orders\",\n  orders_empty: \"No orders yet\",\n  orders_empty_description: \"Orders placed by this contact will appear here\",\n  orders_failed: \"Failed to load orders\",\n  orders_retry: \"Please try again later\",\n  orders_no_match: \"No orders match this filter\",\n  // Notes sidebar\n  notes_title: \"Notes\",\n  notes_empty: \"No notes yet\",\n  notes_view_all: \"View all\",\n  pagination_page_of: \"Page {{current}} of {{total}} ({{count}} total)\",\n  pagination_previous: \"Previous page\",\n  pagination_next: \"Next page\",\n  // Activity feed\n  activity_title: \"Recent Activity\",\n  activity_empty: \"No activity yet\",\n  activity_empty_description:\n    \"Reach out and share a product or media to start building this contact’s story\",\n  activity_filter_new: \"New\",\n  activity_mark_all_read: \"Mark all read\",\n  activity_no_match: \"No {{filter}} activities\",\n  activity_type_message: \"Message\",\n  activity_type_task: \"Task\",\n  activity_type_alert: \"Alert from Fluid.app\",\n  activity_type_announcement: \"Announcement\",\n  activity_type_event: \"Event\",\n  activity_type_review: \"Review\",\n  activity_type_points: \"Points\",\n  activity_type_notification: \"Notification\",\n  activity_date_today: \"Today\",\n  activity_date_yesterday: \"Yesterday\",\n  activity_due: \"Due\",\n  activity_tbd: \"TBD\",\n  notes_more: \"more\",\n  // Subscriptions\n  subscriptions_title: \"Subscriptions\",\n  subscriptions_empty: \"No subscriptions yet\",\n  subscriptions_empty_description:\n    \"Subscriptions for this contact will appear here\",\n  subscriptions_failed: \"Failed to load subscriptions\",\n  subscriptions_no_match: \"No subscriptions match this filter\",\n  subscriptions_next_bill: \"Next bill:\",\n  subscriptions_created: \"Created {{date}}\",\n  subscriptions_every_days: \"Every {{count}} days\",\n  // Status filters (shared by orders & subscriptions)\n  status_filter_awaiting_payment: \"Awaiting Payment\",\n  status_filter_awaiting_shipment: \"Awaiting Shipment\",\n  status_filter_shipped: \"Shipped\",\n  status_filter_delivered: \"Delivered\",\n  status_filter_cancelled: \"Cancelled\",\n  // Editor / due date\n  editor_add_due_date: \"Add due date\",\n  editor_due_date: \"Due date\",\n  editor_remove_due_date: \"Remove due date\",\n  editor_start_writing: \"Start writing...\",\n  // Note/task modal\n  modal_note_label: \"Note\",\n  modal_task_label: \"Task\",\n  modal_edit_type: \"Edit {{type}}\",\n  modal_new_type: \"New {{type}}\",\n  modal_type_title_placeholder: \"{{type}} title\",\n  modal_mark_incomplete: \"Mark Incomplete\",\n  modal_mark_complete: \"Mark Complete\",\n  // Toolbar\n  toolbar_bold: \"Bold\",\n  toolbar_italic: \"Italic\",\n  toolbar_underline: \"Underline\",\n  toolbar_align_left: \"Align left\",\n  toolbar_align_center: \"Align center\",\n  toolbar_align_right: \"Align right\",\n  toolbar_justify: \"Justify\",\n  toolbar_bullet_list: \"Bullet list\",\n  toolbar_ordered_list: \"Ordered list\",\n  // Contact info card\n  tooltip_message: \"Message\",\n  tooltip_new_note: \"New Note\",\n  tooltip_events_coming_soon: \"Events (coming soon)\",\n  contact_info_title: \"Contact Information\",\n  contact_info_no_email: \"No email entered\",\n  contact_info_no_phone: \"No phone number entered\",\n  contact_info_no_address: \"No address entered\",\n  contact_info_edit: \"Edit\",\n  contact_unknown_name: \"Unknown\",\n  // Relative time labels\n  relative_today: \"today\",\n  relative_yesterday: \"yesterday\",\n  relative_days_ago: \"{{count}} days ago\",\n  relative_weeks_ago_one: \"1 week ago\",\n  relative_weeks_ago_other: \"{{count}} weeks ago\",\n  relative_months_ago_one: \"1 month ago\",\n  relative_months_ago_other: \"{{count}} months ago\",\n  relative_years_ago_one: \"1 year ago\",\n  relative_years_ago_other: \"{{count}} years ago\",\n  // Action unavailable aria label\n  action_unavailable: \"{{label}} (unavailable)\",\n  // Note/task editor defaults\n  editor_default_title: \"New Note\",\n  editor_default_body_placeholder: \"Start writing...\",\n  // Contacts table\n  table_groups: \"Groups\",\n  table_filter_by_group: \"Filter by group\",\n  table_column_name: \"Name\",\n  table_column_email: \"Email\",\n  table_column_phone: \"Phone\",\n  table_column_id: \"ID\",\n  table_column_status: \"Status\",\n  table_search_placeholder: \"Search contacts...\",\n  table_no_contacts: \"No contacts found\",\n  table_no_contacts_group_filter:\n    \"No contacts found for the selected group filter.\",\n  table_select_all: \"Select all\",\n  table_deselect_all: \"Deselect all\",\n  table_selected_count: \"{{count}} selected\",\n  table_actions: \"Actions\",\n  table_edit: \"Edit\",\n  table_clear_filters: \"Clear filters\",\n  table_contact_actions: \"Contact actions\",\n  table_sort_asc: \"{{name}} (A-Z)\",\n  table_sort_desc: \"{{name}} (Z-A)\",\n  table_delete_rows_one: \"Delete {{count}} row\",\n  table_delete_rows_other: \"Delete {{count}} rows\",\n  table_delete_contacts_one: \"Delete {{count}} contact\",\n  table_delete_contacts_other: \"Delete {{count}} contacts\",\n  table_select_contact: \"Select {{name}}\",\n  contact_optional_label: \"Contact (optional)\",\n  contact_picker_trigger_aria: \"Contact (optional): {{selection}}\",\n  select_contact: \"Select Contact\",\n  no_contact: \"No contact\",\n  clear_contact_aria: \"Clear contact\",\n  todo_empty: \"You've got nothing else To-Do!\",\n  todo_open_tasks_one: \"{{count}} open task\",\n  todo_open_tasks_other: \"{{count}} open tasks\",\n  todo_more_tasks_one: \"{{count}} more task\",\n  todo_more_tasks_other: \"{{count}} more tasks\",\n  edit_todo: \"Edit\",\n  delete_todo: \"Delete\",\n  view_done: \"View done ({{count}})\",\n  hide_done: \"Hide done\",\n  // Sponsor card\n  sponsor_title: \"Sponsor\",\n  label_name: \"Name\",\n  // Affiliate / rep assignment\n  assign_rep_title: \"Assign Rep\",\n  assign_rep_tooltip: \"The rep affiliated with this contact\",\n  assign_rep_clear: \"Clear\",\n  assign_rep_edit: \"Edit\",\n  assign_rep_back: \"Back\",\n  assign_rep_search_placeholder: \"Search by name or email...\",\n  assign_rep_loading: \"Loading…\",\n  assign_rep_no_results: 'No reps found matching \"{{term}}\"',\n} as const satisfies Record<string, string>;\n\nexport type ContactsDict = typeof contactsEn;\n","import {\n  createDomainTranslations,\n  type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport { contactsEn, type ContactsDict } from \"./translation-dictionary\";\n\nexport const contactsDomain: DomainTranslations<ContactsDict> =\n  createDomainTranslations<ContactsDict>({\n    fallback: contactsEn,\n    loaders: {\n      ar: () =>\n        import(\"./locale/ar.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      bg: () =>\n        import(\"./locale/bg.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      bn: () =>\n        import(\"./locale/bn.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      cs: () =>\n        import(\"./locale/cs.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      da: () =>\n        import(\"./locale/da.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      de: () =>\n        import(\"./locale/de.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      el: () =>\n        import(\"./locale/el.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      es: () =>\n        import(\"./locale/es.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      fi: () =>\n        import(\"./locale/fi.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      fr: () =>\n        import(\"./locale/fr.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      he: () =>\n        import(\"./locale/he.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      hi: () =>\n        import(\"./locale/hi.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      hr: () =>\n        import(\"./locale/hr.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      hu: () =>\n        import(\"./locale/hu.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      id: () =>\n        import(\"./locale/id.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      it: () =>\n        import(\"./locale/it.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      ja: () =>\n        import(\"./locale/ja.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      ko: () =>\n        import(\"./locale/ko.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      ms: () =>\n        import(\"./locale/ms.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      nl: () =>\n        import(\"./locale/nl.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      no: () =>\n        import(\"./locale/no.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      pl: () =>\n        import(\"./locale/pl.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      pt: () =>\n        import(\"./locale/pt.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      ro: () =>\n        import(\"./locale/ro.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      ru: () =>\n        import(\"./locale/ru.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      sk: () =>\n        import(\"./locale/sk.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      sv: () =>\n        import(\"./locale/sv.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      th: () =>\n        import(\"./locale/th.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      tl: () =>\n        import(\"./locale/tl.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      tr: () =>\n        import(\"./locale/tr.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      uk: () =>\n        import(\"./locale/uk.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      vi: () =>\n        import(\"./locale/vi.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      zh_CN: () =>\n        import(\"./locale/zh_CN.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n      zh_TW: () =>\n        import(\"./locale/zh_TW.json\").then(\n          (m): ContactsDict => m.default as ContactsDict,\n        ),\n    },\n  });\n\nexport function createContactsTranslationAdapter(\n  locale: string,\n  dict: ContactsDict,\n): TranslationApi<ContactsDict> {\n  return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n  contactsDomain,\n  createContactsTranslationAdapter,\n} from \"@fluid-app/contacts-core/translation-adapter\";\nimport { ContactsTranslationProvider } from \"@fluid-app/contacts-core/translation-api-context\";\n\nexport function ContactsTranslationBridge({\n  children,\n}: {\n  children: ReactNode;\n}): React.JSX.Element {\n  const { locale } = useActiveLocale();\n  const dict = useDomainDict(contactsDomain, locale);\n  const api = useMemo(\n    () => createContactsTranslationAdapter(locale, dict),\n    [locale, dict],\n  );\n  return (\n    <ContactsTranslationProvider value={api}>\n      {children}\n    </ContactsTranslationProvider>\n  );\n}\n"],"mappings":"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"}