@mitumba/sdk 1.32.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +104 -32
- package/dist/index.d.ts +104 -32
- package/dist/index.js +61 -53
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +61 -53
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/messages-v2.ts","../src/token-store.ts","../src/client.ts","../src/modules/auth.ts","../src/modules/listings.ts","../src/modules/search.ts","../src/modules/orders.ts","../src/modules/pay.ts","../src/modules/vazi.ts","../src/realtime/messages-realtime.ts","../src/modules/messages.ts","../src/modules/notifications.ts","../src/modules/stores.ts","../src/modules/reviews.ts","../src/modules/wishlists.ts","../src/modules/cart.ts","../src/modules/settings.ts","../src/modules/mailer.ts","../src/modules/businesses.ts","../src/modules/admin.ts","../src/modules/disputes.ts","../src/modules/uploads.ts","../src/modules/reports.ts","../src/modules/wholesale.ts","../src/types/auth.ts","../src/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/disputes.ts","../src/types/wholesale.ts","../src/share.ts","../src/index.ts"],"names":["decoded","isRecord"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { APIError } from '../client'\n\n/** Stable opaque identifier for one buyer/store conversation. */\nexport type ConversationId = string\n\n/** Stable opaque identifier for one General, Listing, or Order thread. */\nexport type ThreadId = string\n\n/** Stable opaque identifier for one human-authored message. */\nexport type MessageId = string\n\n/** Stable opaque identifier for a message or system event in a thread timeline. */\nexport type ThreadTimelineItemId = string\n\n/** Opaque server-issued cursor whose contents clients must not interpret. */\nexport type MessagingCursor = string\n\n/** Explicit identity under which an authenticated human accesses messaging resources. */\nexport type MessagingPerspective =\n | {\n /** Act as the authenticated buyer. */\n kind: 'buyer'\n }\n | {\n /** Act as an authorized representative of one store. */\n kind: 'store'\n /** Store represented by this request. */\n store_id: string\n }\n\n/** Versioned success envelope returned by every Messaging v2 resource operation. */\nexport interface ApiResponse<T> {\n /** Public messaging API version. */\n api_version: 2\n /** Typed operation result. */\n data: T\n}\n\n/** Cursor-paged resource collection. */\nexport interface CursorPage<T> {\n /** Resources in server-defined deterministic order. */\n items: T[]\n /** Cursor for the next page, or null when no next page exists. */\n next_cursor: MessagingCursor | null\n /** Whether another page exists after this page. */\n has_more: boolean\n}\n\n/** Recipient-safe buyer identity snapshot. */\nexport interface BuyerSummary {\n /** Stable buyer account identifier. */\n id: string\n /** Current buyer display name, when configured. */\n display_name: string | null\n /** Current buyer avatar URL, when configured. */\n avatar_url: string | null\n}\n\n/** Recipient-safe store identity snapshot. */\nexport interface StoreSummary {\n /** Stable store identifier. */\n id: string\n /** Current store display name. */\n name: string\n /** Current canonical store slug. */\n slug: string\n /** Current store logo URL, when configured. */\n logo_url: string | null\n}\n\n/** Immutable thread subject snapshot for General, Listing, or Order context. */\nexport type ThreadSubject =\n | {\n /** General buyer/store conversation subject. */\n kind: 'general'\n }\n | {\n /** Listing inquiry subject. */\n kind: 'listing'\n /** Listing represented by this thread. */\n listing_id: string\n /** Snapshotted listing title. */\n title: string\n /** Snapshotted listing image URL, when available. */\n image_url: string | null\n /** Current coarse listing availability. */\n availability: 'active' | 'sold' | 'inactive' | 'unknown'\n }\n | {\n /** Order support subject. */\n kind: 'order'\n /** Order represented by this thread. */\n order_id: string\n /** Human-readable short order identifier. */\n short_id: string\n /** Snapshotted listing title associated with the order. */\n listing_title: string\n /** Snapshotted listing image URL, when available. */\n image_url: string | null\n /** Current canonical order status. */\n order_status: string\n }\n\n/** Public message author identity without private store-operator identity. */\nexport type MessageAuthor =\n | {\n /** Message was authored from the buyer perspective. */\n side: 'buyer'\n /** Recipient-safe buyer identity. */\n buyer: BuyerSummary\n }\n | {\n /** Message was authored from the store perspective. */\n side: 'store'\n /** Recipient-safe store identity; human operator identity is intentionally omitted. */\n store: StoreSummary\n }\n\n/** Safe attachment metadata associated with a committed message. */\nexport interface MessageAttachment {\n /** Stable attachment identifier. */\n id: string\n /** Attachment presentation category. */\n kind: 'image' | 'file'\n /** Sanitized original file name. */\n file_name: string\n /** Validated media type. */\n content_type: string\n /** Validated byte size. */\n size_bytes: number\n}\n\n/** Canonical immutable human-authored message. */\nexport interface ThreadMessage {\n /** Stable message identifier. */\n id: MessageId\n /** Thread containing this message. */\n thread_id: ThreadId\n /** Monotonic order within the thread timeline. */\n sequence: number\n /** Explicit public author side and identity. */\n author: MessageAuthor\n /** Canonical message body after server policy processing. */\n body: string\n /** Same-thread quote snapshot, or null when the message is not a reply. */\n reply_to: {\n /** Quoted message identifier. */\n message_id: MessageId\n /** Recipient-safe author label captured for the quote. */\n author_name: string\n /** Immutable safe excerpt captured for the quote. */\n excerpt: string\n } | null\n /** Safe committed attachments; empty for text-only messages. */\n attachments: MessageAttachment[]\n /** Caller-owned idempotency identifier echoed for reconciliation, when supplied. */\n client_message_id: string | null\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n}\n\n/** Server-authored event linking a Listing thread and its related Order thread. */\nexport interface ThreadSystemEvent {\n /** Stable timeline-item identifier. */\n id: ThreadTimelineItemId\n /** Thread containing this system event. */\n thread_id: ThreadId\n /** Monotonic order within the thread timeline. */\n sequence: number\n /** System-event discriminator. */\n kind: 'thread.linked'\n /** Stable identifier shared by the paired link events. */\n relation_id: string\n /** Direction and correctly correlated related thread snapshot. */\n link:\n | {\n /** This Listing thread links forward to an Order thread. */\n direction: 'listing_to_order'\n /** Related Order thread. */\n related_thread: {\n /** Stable related thread identifier. */\n id: ThreadId\n /** Related thread kind. */\n kind: 'order'\n /** Correlated Order subject snapshot. */\n subject: Extract<ThreadSubject, { kind: 'order' }>\n }\n }\n | {\n /** This Order thread links back to a Listing thread. */\n direction: 'order_to_listing'\n /** Related Listing thread. */\n related_thread: {\n /** Stable related thread identifier. */\n id: ThreadId\n /** Related thread kind. */\n kind: 'listing'\n /** Correlated Listing subject snapshot. */\n subject: Extract<ThreadSubject, { kind: 'listing' }>\n }\n }\n /** Recipient-facing event label. */\n label: string\n /** Perspectives for which this event contributes to unread state. */\n notify_sides: Array<'buyer' | 'store'>\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n}\n\n/** Ordered item in a thread timeline. */\nexport type ThreadTimelineItem =\n | {\n /** Human-message timeline item. */\n kind: 'message'\n /** Canonical message. */\n message: ThreadMessage\n }\n | {\n /** Server system-event timeline item. */\n kind: 'system'\n /** Canonical system event. */\n event: ThreadSystemEvent\n }\n\n/** Shared support lifecycle for Listing and Order threads. */\ntype ThreadStatus = 'open' | 'resolved'\n\n/** Perspective-private presentation preferences for one thread. */\ninterface ThreadPreferences {\n /** Whether the current perspective archived this thread. */\n archived: boolean\n /** Whether the current perspective pinned this thread. */\n pinned: boolean\n /** Whether the current perspective muted this thread. */\n muted: boolean\n}\n\n/** Perspective-private presentation preferences for one conversation. */\ninterface ConversationPreferences {\n /** Whether the current perspective archived this conversation. */\n archived: boolean\n /** Whether the current perspective muted this conversation. */\n muted: boolean\n}\n\ntype ThreadCardBase = {\n /** Stable thread identifier. */\n id: ThreadId\n /** Stable parent conversation identifier. */\n conversation_id: ConversationId\n /** Shared support status, independent of commerce status. */\n status: ThreadStatus\n /** Private preferences for the selected perspective. */\n preferences: ThreadPreferences\n /** Latest human-authored message, or null before the first message. */\n last_message: ThreadMessage | null\n /** Exact unread timeline-item count for the selected perspective. */\n unread_count: number\n /** UTC ISO 8601 timestamp of latest thread activity. */\n last_activity_at: string\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n /** UTC ISO 8601 last-update timestamp. */\n updated_at: string\n}\n\n/** Thread-card summary with kind and subject correlated at compile time. */\nexport type ThreadCard =\n | (ThreadCardBase & {\n /** General thread card. */\n kind: 'general'\n /** Correlated General subject. */\n subject: Extract<ThreadSubject, { kind: 'general' }>\n })\n | (ThreadCardBase & {\n /** Listing inquiry thread card. */\n kind: 'listing'\n /** Correlated Listing subject. */\n subject: Extract<ThreadSubject, { kind: 'listing' }>\n })\n | (ThreadCardBase & {\n /** Order support thread card. */\n kind: 'order'\n /** Correlated Order subject. */\n subject: Extract<ThreadSubject, { kind: 'order' }>\n })\n\n/** Buyer/store conversation summary containing no loose messages. */\nexport interface ConversationSummary {\n /** Stable all-time buyer/store conversation identifier. */\n id: ConversationId\n /** Buyer in this relationship. */\n buyer: BuyerSummary\n /** Store in this relationship. */\n store: StoreSummary\n /** Most recently active thread, or null when no thread has activity. */\n last_thread: ThreadCard | null\n /** Exact aggregate unread count for the selected perspective. */\n unread_count: number\n /** UTC ISO 8601 timestamp of latest child-thread activity. */\n last_activity_at: string\n /** Private preferences for the selected perspective. */\n preferences: ConversationPreferences\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n /** UTC ISO 8601 last-update timestamp. */\n updated_at: string\n}\n\n/** Idempotent conversation/thread resolution result. */\nexport interface ResolveThreadResult {\n /** Resolved all-time buyer/store conversation. */\n conversation: ConversationSummary\n /** Resolved singleton context thread. */\n thread: ThreadCard\n /** Whether either resource was created by this resolution. */\n created: {\n /** Whether the conversation was created. */\n conversation: boolean\n /** Whether the thread was created. */\n thread: boolean\n }\n}\n\n/** Newest, older, or catch-up window of ascending thread timeline items. */\nexport interface MessagePage {\n /** Timeline items ordered by ascending sequence. */\n items: ThreadTimelineItem[]\n /** Cursor for older history, or null at the beginning. */\n older_cursor: MessagingCursor | null\n /** Cursor for newer catch-up, or null at the live edge. */\n newer_cursor: MessagingCursor | null\n /** Whether older history exists. */\n has_older: boolean\n /** Whether newer history exists. */\n has_newer: boolean\n}\n\n/** Authoritative monotonic read-cursor result. */\nexport interface ReadCursorResult {\n /** Thread whose cursor was evaluated. */\n thread_id: ThreadId\n /** Last committed visible message or system-event identifier. */\n last_read_item_id: ThreadTimelineItemId\n /** Monotonic sequence of the last read item. */\n last_read_sequence: number\n /** Whether this request advanced the cursor. */\n changed: boolean\n /** UTC ISO 8601 cursor-update timestamp. */\n updated_at: string\n}\n\n/** Buyer-authorized input for idempotent thread resolution. */\nexport type BuyerResolveThreadInput =\n | {\n /** Resolve the General thread for a store. */\n kind: 'general'\n /** Store to contact. */\n store_id: string\n }\n | {\n /** Resolve a Listing inquiry thread. */\n kind: 'listing'\n /** Store owning the listing. */\n store_id: string\n /** Listing to ask about. */\n listing_id: string\n }\n | {\n /** Resolve an Order support thread. */\n kind: 'order'\n /** Authorized buyer order. */\n order_id: string\n }\n\n/** Store-authorized input for idempotent thread resolution. */\nexport type StoreResolveThreadInput =\n | {\n /** Resolve an entitled existing General relationship. */\n kind: 'general'\n /** Buyer in the entitled relationship. */\n buyer_id: string\n }\n | {\n /** Resolve an Order support thread. */\n kind: 'order'\n /** Authorized store order. */\n order_id: string\n }\n\n/** Cursor inputs for newest, older, or catch-up message windows. */\nexport type ListThreadMessagesParams =\n | {\n /** Older-history cursor. */\n before?: MessagingCursor\n /** Catch-up cursor is mutually exclusive with before. */\n after?: never\n /** Requested page size. */\n limit?: number\n }\n | {\n /** Catch-up cursor. */\n after?: MessagingCursor\n /** Older-history cursor is mutually exclusive with after. */\n before?: never\n /** Requested page size. */\n limit?: number\n }\n\n/** Caller-owned, idempotent input for one human-authored message. */\nexport interface SendThreadMessageInput {\n /**\n * Stable caller-generated identifier reused for every retry.\n *\n * The runtime method maps this value to the `Idempotency-Key` header, omits it from the JSON\n * body, and never generates a replacement key during retry.\n */\n client_message_id: string\n /** Required trimmed body of 1–2,000 characters. */\n body: string\n /** Same-thread quoted message; omit rather than send null when absent. */\n reply_to_message_id?: MessageId\n /** Safe staged attachment identifiers; empty or omitted for text-only sends. */\n attachment_ids?: string[]\n}\n\n/** Canonical result of an accepted or deduplicated send. */\nexport interface SendThreadMessageResult {\n /** Canonical committed message. */\n message: ThreadMessage\n /** Whether this response replayed an earlier accepted request. */\n deduplicated: boolean\n /** Server policy processing applied to the submitted body. */\n policy: {\n /** Whether policy processing changed the body. */\n body_modified: boolean\n /** Recipient-safe policy notices. */\n notices: string[]\n }\n}\n\n/** Lifecycle state of one staged attachment upload. */\nexport type AttachmentUploadState =\n | 'authorized'\n | 'uploaded'\n | 'pending_scan'\n | 'safe'\n | 'rejected'\n | 'expired'\n | 'claimed'\n\n/** Server capability declaration for the staged Messaging v2 rollout. */\nexport interface MessagingCapabilities {\n /** Public resource schema version. */\n api_version: 2\n /** Realtime protocol versions understood by this deployment. */\n protocol_versions: number[]\n /** Whether the Messaging v2 HTTP resource surface is enabled. */\n http: { enabled: boolean }\n /** Whether legacy writes are mirrored into Messaging v2. */\n dual_write: { enabled: boolean }\n /** Whether migration shadow reads are enabled. */\n shadow_read: { enabled: boolean }\n /** Whether clients must address a stable Messaging v2 thread. */\n require_thread: { enabled: boolean }\n /** Managed realtime capability and supported wire versions. */\n realtime: {\n /** Whether clients may establish managed realtime connections. */\n enabled: boolean\n /** Realtime protocol versions currently available. */\n protocol_versions: number[]\n }\n /** Optional attachment capability. */\n attachments: {\n /** Whether clients may expose attachment controls. */\n enabled: boolean\n /** Maximum accepted upload size. */\n max_size_bytes: number\n /** Allowed upload media types. */\n allowed_content_types: string[]\n }\n}\n\n/** Short-lived authorization for one private staged attachment upload. */\nexport interface AttachmentUploadAuthorization {\n /** Stable upload identifier. */\n id: string\n /** Thread for which the upload was authorized. */\n thread_id: ThreadId\n /** Initial upload state. */\n state: 'authorized'\n /** Absolute short-lived upload URL. */\n upload_url: string\n /** One-use upload ticket that is not an access token. */\n upload_ticket: string\n /** UTC ISO 8601 authorization expiry. */\n expires_at: string\n /** Server-accepted upload constraints. */\n accepted: {\n /** Accepted media type. */\n content_type: string\n /** Accepted byte size. */\n size_bytes: number\n /** Accepted SHA-256 digest. */\n sha256: string\n }\n}\n\n/** Current status of one private staged attachment upload. */\nexport interface AttachmentUploadStatus {\n /** Stable upload identifier. */\n id: string\n /** Thread for which the upload was authorized. */\n thread_id: ThreadId\n /** Current upload lifecycle state. */\n state: AttachmentUploadState\n /** UTC ISO 8601 upload expiry. */\n expires_at: string\n /** Safe rejection code, or null when not rejected. */\n rejection_code: string | null\n /** Committed safe attachment, or null until available. */\n attachment: MessageAttachment | null\n}\n\n/** Read-only summary of exact-participant history that cannot be assigned to a store. */\nexport interface LegacyMessageArchiveSummary {\n /** Stable legacy archive identifier. */\n id: string\n /** Other original participant. */\n other_user: BuyerSummary\n /** Latest historic message body. */\n last_message_body: string\n /** UTC ISO 8601 timestamp of the latest historic message. */\n last_message_at: string\n}\n\n/** Read-only historic message that cannot be assigned to a store conversation. */\nexport interface LegacyMessageRecord {\n /** Stable legacy message identifier. */\n id: string\n /** Original sender. */\n sender: BuyerSummary\n /** Historic message body. */\n body: string\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n}\n\n/** Safe result of resolving a temporary Buyer legacy navigation link. */\nexport type LegacyLinkResolution =\n | {\n /** Legacy link resolved to canonical v2 resources. */\n result: 'resolved'\n /** Canonical conversation identifier. */\n conversation_id: ConversationId\n /** Canonical thread identifier. */\n thread_id: ThreadId\n }\n | {\n /** Several stores match and the buyer must choose explicitly. */\n result: 'choose_store'\n /** Safe candidate stores. */\n stores: StoreSummary[]\n }\n | {\n /** Link targets exact-participant read-only legacy history. */\n result: 'legacy_archive'\n /** Canonical legacy archive identifier. */\n legacy_thread_id: string\n }\n | {\n /** Link is invalid, forbidden, or cannot be resolved safely. */\n result: 'unavailable'\n }\n\nconst MESSAGING_ERROR_CODES = [\n 'invalid_input',\n 'unauthorized',\n 'session_expired',\n 'forbidden',\n 'conversation_not_found',\n 'thread_not_found',\n 'message_not_found',\n 'timeline_item_not_found',\n 'context_mismatch',\n 'idempotency_conflict',\n 'cursor_invalid',\n 'cursor_expired',\n 'attachment_not_ready',\n 'blocked',\n 'legacy_context_required',\n 'client_upgrade_required',\n 'rate_limited',\n 'temporarily_unavailable',\n 'internal_error',\n 'invalid_response',\n 'network_error',\n] as const\n\n/** Closed messaging-specific API error code vocabulary. */\nexport type MessagingErrorCode = typeof MESSAGING_ERROR_CODES[number]\n\nconst MESSAGING_ERROR_CODE_SET: ReadonlySet<string> = new Set(MESSAGING_ERROR_CODES)\n\ntype MessagingAPIError = APIError & { code: MessagingErrorCode }\n\n/**\n * Narrow an unknown value to an API error carrying a recognized messaging code.\n *\n * @param value - Unknown caught value\n * @returns Whether the value is a messaging API error\n */\nexport function isMessagingAPIError(value: unknown): value is MessagingAPIError\n\n/**\n * Narrow an unknown value to an API error carrying one expected messaging code.\n *\n * @param value - Unknown caught value\n * @param code - Expected messaging error code\n * @returns Whether the value carries the expected code\n */\nexport function isMessagingAPIError<Code extends MessagingErrorCode>(\n value: unknown,\n code: Code,\n): value is APIError & { code: Code }\n\nexport function isMessagingAPIError(\n value: unknown,\n code?: MessagingErrorCode,\n): value is MessagingAPIError {\n if (!(value instanceof Error) || value.name !== 'APIError') {\n return false\n }\n\n const candidate = value as Error & {\n code?: unknown\n status?: unknown\n }\n if (\n typeof candidate.code !== 'string' ||\n typeof candidate.status !== 'number' ||\n !MESSAGING_ERROR_CODE_SET.has(candidate.code)\n ) {\n return false\n }\n\n return code === undefined || candidate.code === code\n}\n\n/** Error raised when a Messaging realtime frame or protocol contract is invalid. */\nexport class RealtimeProtocolError extends Error {\n /** Construct a stable protocol failure without echoing an untrusted frame. */\n constructor() {\n super('Messaging realtime protocol is invalid.')\n this.name = 'RealtimeProtocolError'\n }\n}\n\n/** Error raised when the current runtime has no supported WebSocket implementation. */\nexport class RealtimeUnavailableError extends Error {\n /** Construct a stable runtime-unavailable failure. */\n constructor() {\n super('Messaging realtime is unavailable in this runtime.')\n this.name = 'RealtimeUnavailableError'\n }\n}\n\n\n/** Cursor parameters for conversation collections. */\nexport interface ListConversationsParams {\n /** Opaque next-page cursor. */\n cursor?: MessagingCursor\n /** Page size from 1 through 100. */\n limit?: number\n}\n\n/** Cursor and filter parameters for thread-card collections. */\nexport interface ListThreadsParams extends ListConversationsParams {\n /** Include threads archived by the selected perspective. */\n include_archived?: boolean\n /** Optional shared support-status filter. */\n status?: 'open' | 'resolved'\n}\n\n/** Thread preference patch for one perspective. */\nexport interface UpdateThreadPreferencesInput {\n /** Archive or restore the thread for this perspective. */\n archived?: boolean\n /** Pin or unpin the thread for this perspective. */\n pinned?: boolean\n /** Mute or unmute the thread for this perspective. */\n muted?: boolean\n}\n\n/** Conversation preference patch for one perspective. */\nexport interface UpdateConversationPreferencesInput {\n /** Archive or restore the conversation for this perspective. */\n archived?: boolean\n /** Mute or unmute the conversation for this perspective. */\n muted?: boolean\n}\n\n/** Request options for an idempotent operation. */\nexport interface MessagingIdempotentRequestOptions {\n /** Stable key reused for an exact retry. */\n idempotencyKey: string\n /** Optional cancellation signal. */\n signal?: AbortSignal\n /** Additional non-authorization headers. */\n headers?: Record<string, string>\n}\n\n/** Metadata used to authorize one private attachment upload. */\nexport interface CreateAttachmentUploadInput {\n /** Sanitized display file name. */\n file_name: string\n /** Lowercase allowlisted media type. */\n content_type: string\n /** Exact byte length. */\n size_bytes: number\n /** Lowercase hexadecimal SHA-256 digest. */\n sha256: string\n}\n\n/** Portable in-memory body accepted by attachment upload. */\nexport type AttachmentUploadBody = Blob | ArrayBuffer | ArrayBufferView\n\n/** Short-lived mediated attachment download. */\nexport interface AttachmentDownloadAuthorization {\n /** Absolute application download URL containing a short-lived ticket. */\n url: string\n /** UTC ISO 8601 ticket expiry. */\n expires_at: string\n}\n\n/** Buyer and currently represented store inboxes. */\nexport interface MessagingInboxes {\n /** Personal buyer perspective. */\n buyer: { kind: 'buyer'; buyer: BuyerSummary }\n /** Authorized store perspectives. */\n stores: Array<{ kind: 'store'; store: StoreSummary }>\n}\n\n/** One-use realtime bootstrap ticket. */\nexport interface MessagesRealtimeTicket {\n /** Opaque ticket; never persist or log it. */\n ticket: string\n /** UTC ISO 8601 ticket expiry. */\n expires_at: string\n /** Absolute ticket-only WebSocket URL. */\n websocket_url: string\n /** Required negotiated subprotocol. */\n websocket_protocol: 'mitumba-messaging-v1'\n /** Realtime protocol version. */\n protocol_version: 1\n /** Requested resume cursor, or null for a fresh connection. */\n resume_cursor: MessagingCursor | null\n}\n\n/** Minimal event delivered by an isomorphic WebSocket transport. */\nexport interface WebSocketMessageEventLike {\n /** Untrusted frame data parsed by the SDK before exposure. */\n data: unknown\n}\n\n/** Minimal close event delivered by an isomorphic WebSocket transport. */\nexport interface WebSocketCloseEventLike {\n /** WebSocket close code. */\n code: number\n /** Safe close reason. */\n reason?: string\n /** Whether the transport observed a clean close. */\n wasClean?: boolean\n}\n\n/** Minimal WebSocket contract supported in Browser, Node, Edge, and Worker runtimes. */\nexport interface WebSocketLike {\n /** Connecting ready state. */\n readonly CONNECTING?: number\n /** Open ready state. */\n readonly OPEN?: number\n /** Current ready state. */\n readonly readyState: number\n /** Send one client frame. */\n send(data: string): void\n /** Close this transport. */\n close(code?: number, reason?: string): void\n /** Register a transport listener. */\n addEventListener(type: 'open', listener: () => void): void\n addEventListener(type: 'message', listener: (event: WebSocketMessageEventLike) => void): void\n addEventListener(type: 'close', listener: (event: WebSocketCloseEventLike) => void): void\n addEventListener(type: 'error', listener: (event: unknown) => void): void\n /** Remove a transport listener. */\n removeEventListener(type: 'open', listener: () => void): void\n removeEventListener(type: 'message', listener: (event: WebSocketMessageEventLike) => void): void\n removeEventListener(type: 'close', listener: (event: WebSocketCloseEventLike) => void): void\n removeEventListener(type: 'error', listener: (event: unknown) => void): void\n}\n\n/** Injectable WebSocket constructor for isomorphic runtimes. */\nexport type WebSocketFactory = (url: string, protocols: string | string[]) => WebSocketLike\n\n/** Managed realtime lifecycle state. */\nexport type MessagesRealtimeState = 'connecting' | 'open' | 'reconnecting' | 'closed' | 'failed'\n\n/** Durable realtime envelope shared by all resumable events. */\nexport interface MessagesRealtimeEnvelope<Type extends string, Payload> {\n /** Public resource schema version. */\n api_version: 2\n /** Wire protocol version. */\n protocol_version: 1\n /** Stable event identifier used for deduplication. */\n event_id: string\n /** Opaque audience resume cursor. */\n resume_cursor: MessagingCursor\n /** Event discriminator. */\n type: Type\n /** UTC ISO 8601 occurrence timestamp. */\n occurred_at: string\n /** Related conversation when applicable. */\n conversation_id?: ConversationId\n /** Related thread when applicable. */\n thread_id?: ThreadId\n /** Event payload validated before exposure. */\n payload: Payload\n}\n\n/** Validated managed Messaging realtime event. */\nexport type MessagesRealtimeEvent =\n | MessagesRealtimeEnvelope<'message.created', { message: ThreadMessage }>\n | MessagesRealtimeEnvelope<'system_event.created', { event: ThreadSystemEvent }>\n | MessagesRealtimeEnvelope<'conversation.updated', { conversation: ConversationSummary }>\n | MessagesRealtimeEnvelope<'thread.created', { thread: ThreadCard }>\n | MessagesRealtimeEnvelope<'thread.updated', { thread: ThreadCard }>\n | MessagesRealtimeEnvelope<'read_cursor.updated', { cursor: ReadCursorResult }>\n | MessagesRealtimeEnvelope<'attachment.updated', { upload: AttachmentUploadStatus }>\n | MessagesRealtimeEnvelope<'message.policy_applied', { message_id: MessageId; notices: string[] }>\n | {\n /** Resource schema version. */\n api_version: 2\n /** Wire protocol version. */\n protocol_version: 1\n /** Ephemeral event discriminator. */\n type: 'typing.updated'\n /** Thread scoped by this typing state. */\n thread_id: ThreadId\n /** Validated public author. */\n author: MessageAuthor\n /** Current typing state. */\n is_typing: boolean\n /** UTC ISO 8601 occurrence timestamp. */\n occurred_at: string\n }\n | {\n /** Resource schema version. */\n api_version: 2\n /** Wire protocol version. */\n protocol_version: 1\n /** Authoritative rebuild signal. */\n type: 'resync.required'\n /** Safe reason for rebuilding HTTP state. */\n reason: 'cursor_expired' | 'gap_detected' | 'authorization_changed'\n /** Resume cursor after the authoritative rebuild. */\n resume_cursor: MessagingCursor\n }\n\n/** Options for an inert or immediately started managed realtime connection. */\nexport interface MessagesRealtimeOptions {\n /** Buyer or authorized-store audience. */\n perspective: MessagingPerspective\n /** Last acknowledged cursor, or null for a fresh connection. */\n resumeCursor?: MessagingCursor | null\n /** Optional cancellation signal for ticket requests. */\n signal?: AbortSignal\n /** Initial reconnect delay in milliseconds. */\n reconnectBaseDelayMs?: number\n /** Maximum reconnect delay in milliseconds. */\n reconnectMaxDelayMs?: number\n /** Injected randomness for deterministic tests. */\n random?: () => number\n}\n\n/** Managed, resumable messaging connection. */\nexport interface MessagesRealtimeConnection {\n /** Current connection lifecycle state. */\n readonly state: MessagesRealtimeState\n /** Last acknowledged durable cursor. */\n readonly resumeCursor: MessagingCursor | null\n /** Start the inert connection. Repeated calls are safe. */\n start(): Promise<void>\n /** Permanently close and release sockets, timers, and listeners. */\n close(): void\n /** Subscribe to validated messaging events. */\n onEvent(listener: (event: MessagesRealtimeEvent) => void | Promise<void>): () => void\n /** Subscribe to lifecycle changes. */\n onStateChange(listener: (state: MessagesRealtimeState) => void): () => void\n /** Select a thread for message and typing delivery. */\n subscribeThread(threadId: ThreadId): void\n /** Stop local delivery for one selected thread. */\n unsubscribeThread(threadId: ThreadId): void\n /** Publish thread-scoped ephemeral typing state. */\n setTyping(threadId: ThreadId, isTyping: boolean): void\n}\n\n\n/** Older-history page for one read-only legacy archive. */\nexport interface LegacyMessagePage {\n /** Historic messages in ascending display order. */\n items: LegacyMessageRecord[]\n /** Cursor for older history, or null at the beginning. */\n older_cursor: MessagingCursor | null\n /** Whether older history remains. */\n has_older: boolean\n}\n","export interface TokenStore {\n getAccessToken(): Promise<string | null>\n getRefreshToken(): Promise<string | null>\n setTokens(access: string, refresh: string): Promise<void>\n clear(): Promise<void>\n}\n\nexport class MemoryTokenStore implements TokenStore {\n private accessToken: string | null = null\n private refreshToken: string | null = null\n\n async getAccessToken(): Promise<string | null> { return this.accessToken }\n async getRefreshToken(): Promise<string | null> { return this.refreshToken }\n async setTokens(access: string, refresh: string): Promise<void> {\n this.accessToken = access\n this.refreshToken = refresh\n }\n async clear(): Promise<void> {\n this.accessToken = null\n this.refreshToken = null\n }\n}\n\nconst DB_NAME = 'mitumba_sdk'\nconst STORE_NAME = 'tokens'\nconst KEY = 'auth'\n\nexport class IDBTokenStore implements TokenStore {\n private dbPromise: Promise<IDBDatabase> | null = null\n\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, 1)\n request.onupgradeneeded = () => {\n request.result.createObjectStore(STORE_NAME)\n }\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n return this.dbPromise\n }\n\n private async get(): Promise<{ access: string; refresh: string } | null> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const req = tx.objectStore(STORE_NAME).get(KEY)\n req.onsuccess = () => resolve(req.result || null)\n req.onerror = () => reject(req.error)\n })\n }\n\n async getAccessToken(): Promise<string | null> {\n const data = await this.get()\n return data?.access ?? null\n }\n\n async getRefreshToken(): Promise<string | null> {\n const data = await this.get()\n return data?.refresh ?? null\n }\n\n async setTokens(access: string, refresh: string): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).put({ access, refresh }, KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n\n async clear(): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).delete(KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n}\n\n/** Creates IDBTokenStore if indexedDB is available, otherwise MemoryTokenStore. */\nexport function createTokenStore(): TokenStore {\n if (typeof indexedDB !== 'undefined') {\n return new IDBTokenStore()\n }\n return new MemoryTokenStore()\n}\n","import { MitumbaClientConfig, APIErrorResponse, RequestOptions, WebSocketLike } from './types'\nimport { RealtimeUnavailableError } from './types/messages-v2'\nimport { TokenStore, createTokenStore } from './token-store'\n\nexport class APIError extends Error {\n public readonly code: string\n public readonly status: number\n public readonly details?: unknown\n\n constructor(status: number, data: APIErrorResponse) {\n super(data.message || data.error)\n this.name = 'APIError'\n this.code = data.error\n this.status = status\n this.details = data.details\n }\n}\n\nfunction isExpiringSoon(token: string, thresholdSeconds: number): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]))\n const exp = payload.exp as number\n return exp - (Date.now() / 1000) < thresholdSeconds\n } catch {\n return false\n }\n}\n\nfunction isErrorRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction normalizeAPIErrorResponse(value: unknown, fallbackMessage?: string): APIErrorResponse {\n if (isErrorRecord(value) && typeof value.error === 'string') {\n return {\n error: value.error,\n message: typeof value.message === 'string' ? value.message : fallbackMessage,\n details: value.details,\n }\n }\n if (isErrorRecord(value) && isErrorRecord(value.error) && typeof value.error.code === 'string') {\n return {\n error: value.error.code,\n message: typeof value.error.message === 'string' ? value.error.message : fallbackMessage,\n details: value.error.details,\n }\n }\n return { error: 'unknown_error', message: fallbackMessage }\n}\n\nclass InvalidRefreshCredentialsError extends Error {\n constructor() {\n super('Refresh credentials are invalid.')\n this.name = 'InvalidRefreshCredentialsError'\n }\n}\n\nfunction isTokenResponse(value: unknown): value is { access_token: string; refresh_token: string } {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Record<string, unknown>\n return typeof candidate.access_token === 'string'\n && candidate.access_token.length > 0\n && typeof candidate.refresh_token === 'string'\n && candidate.refresh_token.length > 0\n}\n\nexport class APIClient {\n private config: MitumbaClientConfig\n private tokenStore: TokenStore\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n this.tokenStore = config.tokenStore ?? createTokenStore()\n\n // Seed store from config if tokens provided\n if (config.token) {\n this.tokenStore.setTokens(config.token, config.refreshToken || '')\n }\n }\n\n public async setToken(token: string, refreshToken?: string): Promise<void> {\n this.config.token = token\n if (refreshToken && refreshToken.length > 0) {\n this.config.refreshToken = refreshToken\n }\n const effectiveRefresh = refreshToken && refreshToken.length > 0\n ? refreshToken\n : this.config.refreshToken && this.config.refreshToken.length > 0\n ? this.config.refreshToken\n : ''\n await this.tokenStore.setTokens(token, effectiveRefresh)\n }\n\n /**\n * Set both tokens explicitly. Requires a valid refresh token.\n * Preferred over setToken() to avoid dropping the refresh token.\n */\n public async setSession(tokens: { access_token: string; refresh_token: string }): Promise<void> {\n this.config.token = tokens.access_token\n this.config.refreshToken = tokens.refresh_token\n await this.tokenStore.setTokens(tokens.access_token, tokens.refresh_token)\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public getBaseUrl(): string {\n return this.config.baseUrl\n }\n\n /** Create an isomorphic WebSocket using the configured or global transport. */\n public createWebSocket(url: string, protocols: string | string[]): WebSocketLike {\n if (this.config.webSocketFactory) return this.config.webSocketFactory(url, protocols)\n const Constructor = globalThis.WebSocket\n if (typeof Constructor !== 'function') throw new RealtimeUnavailableError()\n return new Constructor(url, protocols) as unknown as WebSocketLike\n }\n\n public async clearToken(): Promise<void> {\n this.config.token = undefined\n this.config.refreshToken = undefined\n await this.tokenStore.clear()\n }\n\n /**\n * Check if user has a stored session (access or refresh token available).\n */\n public async isAuthenticated(): Promise<boolean> {\n const access = this.config.token ?? await this.tokenStore.getAccessToken()\n if (access) return true\n const refresh = await this.tokenStore.getRefreshToken()\n return !!refresh\n }\n\n /**\n * Hydrate tokens from the store into memory (call on app boot).\n */\n public async hydrate(): Promise<void> {\n const access = await this.tokenStore.getAccessToken()\n const refresh = await this.tokenStore.getRefreshToken()\n if (access) this.config.token = access\n if (refresh) this.config.refreshToken = refresh\n }\n\n public async ensureFreshToken(options?: RequestOptions): Promise<void> {\n // Try hydrating from store if no in-memory token\n if (!this.config.token) {\n const stored = await this.tokenStore.getAccessToken()\n if (stored) this.config.token = stored\n const refresh = await this.tokenStore.getRefreshToken()\n if (refresh) this.config.refreshToken = refresh\n }\n\n // Proactive refresh if token expires within 60 seconds\n if (this.config.token && isExpiringSoon(this.config.token, 60) && this.config.refreshToken && this.config.refreshToken.length > 0) {\n await this.handleTokenRefresh(options?.signal)\n }\n }\n\n private async request<T>(\n method: string, \n path: string, \n body?: unknown, \n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n // Proactive refresh before request (skip for auth endpoints)\n if (!path.includes('/auth/refresh') && !path.includes('/auth/login') && !path.includes('/auth/register')) {\n await this.ensureFreshToken(options)\n }\n\n const url = new URL(path, this.config.baseUrl)\n \n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n\n const headers = new Headers(options?.headers)\n if (body && !(body instanceof FormData)) {\n headers.set('Content-Type', 'application/json')\n }\n\n if (this.config.token) {\n // Always wins over a custom header: callers cannot bypass token refresh or impersonate a\n // different session through RequestOptions.\n headers.set('Authorization', `Bearer ${this.config.token}`)\n }\n\n const init: RequestInit = {\n method,\n headers,\n body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined,\n signal: options?.signal\n }\n\n const maxRetries = this.config.maxRetries ?? 3\n let attempt = 0\n let response: Response\n\n while (true) {\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()}`)\n }\n \n const startTime = Date.now()\n try {\n response = await fetch(url.toString(), init)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw err\n }\n if (attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] Network error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n throw new APIError(0, { error: 'network_error', message: err instanceof Error ? err.message : 'Network request failed' })\n }\n\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()} - ${response.status} (${Date.now() - startTime}ms)`)\n }\n\n if (response.status >= 500 && attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${response.status} error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n\n break\n }\n\n // Handle 401 — attempt refresh and retry\n if (response.status === 401 && !path.includes('/auth/refresh') && !path.includes('/auth/login') && !path.includes('/auth/register')) {\n const hasRefreshToken = this.config.refreshToken && this.config.refreshToken.length > 0\n\n if (hasRefreshToken) {\n try {\n await this.handleTokenRefresh(options?.signal)\n } catch (error) {\n if (!(error instanceof InvalidRefreshCredentialsError)) throw error\n this.config.onAuthExpired?.()\n throw new APIError(401, { error: 'session_expired', message: 'Session expired. Please log in again.' })\n }\n headers.set('Authorization', `Bearer ${this.config.token}`)\n // Replay failures deliberately propagate unchanged. A successful refresh is not an\n // expired session merely because the network drops or the caller aborts the replay.\n response = await fetch(url.toString(), { ...init, headers })\n } else {\n // No refresh token — session is dead, fire callback immediately\n if (this.config.onAuthExpired) {\n this.config.onAuthExpired()\n }\n throw new APIError(401, { error: 'session_expired', message: 'Session expired. Please log in again.' })\n }\n }\n\n if (!response.ok) {\n let decoded: unknown\n try {\n decoded = await response.json()\n } catch {\n decoded = null\n }\n throw new APIError(response.status, normalizeAPIErrorResponse(decoded, response.statusText))\n }\n\n if (response.status === 204) {\n return undefined as unknown as T\n }\n\n return response.json() as Promise<T>\n }\n\n private async handleTokenRefresh(signal?: AbortSignal): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.isRefreshing = true\n this.refreshPromise = (async () => {\n try {\n const url = new URL('/auth/refresh', this.config.baseUrl)\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refresh_token: this.config.refreshToken }),\n signal,\n })\n\n if (response.status === 400 || response.status === 401) {\n await this.clearToken()\n throw new InvalidRefreshCredentialsError()\n }\n if (!response.ok) {\n let decoded: unknown\n try {\n decoded = await response.json()\n } catch {\n decoded = null\n }\n throw new APIError(response.status, normalizeAPIErrorResponse(decoded, response.statusText || 'Token refresh failed.'))\n }\n\n let decoded: unknown\n try {\n decoded = await response.json()\n } catch {\n throw new APIError(response.status, { error: 'refresh_response_invalid', message: 'Token refresh returned an invalid response.' })\n }\n if (!isTokenResponse(decoded)) {\n throw new APIError(response.status, { error: 'refresh_response_invalid', message: 'Token refresh returned an invalid response.' })\n }\n\n this.config.token = decoded.access_token\n this.config.refreshToken = decoded.refresh_token\n await this.tokenStore.setTokens(decoded.access_token, decoded.refresh_token)\n this.config.onTokenRefresh?.({ token: decoded.access_token, refreshToken: decoded.refresh_token })\n } finally {\n this.isRefreshing = false\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n public get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, params, options)\n }\n\n public post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, undefined, options)\n }\n\n public put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, undefined, options)\n }\n\n public patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, body, undefined, options)\n }\n\n public delete<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, body, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n RegisterInput,\n LoginInput,\n SendOtpInput,\n VerifyOtpInput,\n ForgotPasswordInput,\n ResetPasswordInput,\n CompleteOnboardingInput,\n Verify2FAInput,\n TwoFactorRequired,\n BecomeSellerInput,\n BecomeBaleSellerInput,\n PublicKeyCredentialRequestOptionsJSON,\n AuthenticationResponseJSON,\n UserProfile,\n AuthTokens,\n MessageResponse,\n RequestOptions,\n AuthCapabilities,\n RegenerateBackupCodesResult,\n RequestRecoveryInput,\n RequestRecoveryResult,\n RecoveryStatusResult,\n CompleteRecoveryResult,\n AdminRecoveryRequest,\n AdminRecoveryEvent,\n RootSetupInput,\n RootSetupResult,\n} from '../types'\n\nfunction isAuthTokens(result: unknown): result is AuthTokens {\n return typeof result === 'object' && result !== null && 'access_token' in result && 'refresh_token' in result\n}\n\nexport class AuthModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Register a new account.\n * If using EmailRegisterInput, returns AuthTokens (auto-persisted).\n * If using PhoneRegisterInput, returns MessageResponse (OTP sent).\n */\n async register(input: RegisterInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n const result = await this.client.post<AuthTokens | MessageResponse>('/auth/register', input, options)\n if (isAuthTokens(result)) {\n await this.client.setSession(result)\n }\n return result\n }\n\n /**\n * Log in to an existing account.\n * If using EmailLoginInput, returns AuthTokens (auto-persisted) or TwoFactorRequired.\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse | TwoFactorRequired> {\n const result = await this.client.post<AuthTokens | MessageResponse | TwoFactorRequired>('/auth/login', input, options)\n if (isAuthTokens(result)) {\n await this.client.setSession(result)\n }\n return result\n }\n\n /**\n * Send an OTP code to a phone number.\n */\n async sendOtp(input: SendOtpInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/otp/send', input, options)\n }\n\n /**\n * Verify an OTP code. Tokens are auto-persisted.\n */\n async verifyOtp(input: VerifyOtpInput, options?: RequestOptions): Promise<AuthTokens> {\n const result = await this.client.post<AuthTokens>('/auth/otp/verify', input, options)\n await this.client.setSession(result)\n return result\n }\n\n /**\n * Refresh the access token using a refresh token.\n */\n async refresh(input: { refresh_token: string }, options?: RequestOptions): Promise<AuthTokens> {\n const result = await this.client.post<AuthTokens>('/auth/refresh', input, options)\n await this.client.setSession(result)\n return result\n }\n\n /**\n * Revoke the refresh token and log out. Clears stored session.\n */\n async logout(input: { refresh_token: string }, options?: RequestOptions): Promise<{ ok: boolean }> {\n const result = await this.client.post<{ ok: boolean }>('/auth/logout', input, options)\n await this.client.clearToken()\n return result\n }\n\n /**\n * Request a password reset email.\n */\n async forgotPassword(input: ForgotPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/forgot-password', input, options)\n }\n\n /**\n * Reset the password using a token from the reset email.\n */\n async resetPassword(input: ResetPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/reset-password', input, options)\n }\n\n /**\n * Get the current authenticated user's profile.\n */\n async me(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n /**\n * Complete the onboarding flow.\n */\n async completeOnboarding(input: CompleteOnboardingInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/onboarding/complete', input, options)\n }\n\n /**\n * Verify 2FA code during login. Tokens are auto-persisted.\n */\n async verify2FA(input: Verify2FAInput, options?: RequestOptions): Promise<AuthTokens> {\n const result = await this.client.post<AuthTokens>('/auth/2fa/login', input, options)\n await this.client.setSession(result)\n return result\n }\n\n /**\n * Send a 2FA challenge during login (for SMS/email methods).\n * Call before verify2FA when the user picks a non-TOTP method.\n */\n async sendLogin2FAChallenge(input: { temp_token: string; method_id: string }, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/login/challenge', input, options)\n }\n\n /**\n * Send a verification code to the user's email.\n */\n async sendVerificationCode(email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/send', email ? { email } : undefined, options)\n }\n\n /**\n * Verify the email with the 6-digit code.\n */\n async verifyEmail(code: string, email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/confirm', email ? { code, email } : { code }, options)\n }\n\n /**\n * Upgrade the current user to a seller role.\n */\n async becomeSeller(input: BecomeSellerInput, options?: RequestOptions): Promise<{ ok: true; roles: string[]; sti_score: number }> {\n return this.client.post<{ ok: true; roles: string[]; sti_score: number }>('/auth/become-seller', input, options)\n }\n\n /**\n * Upgrade the current user to a bale (wholesale) seller role.\n * Mutually exclusive with retail seller — 409 if already a retail seller.\n */\n async becomeBaleSeller(input: BecomeBaleSellerInput, options?: RequestOptions): Promise<{ ok: true; roles: string[] }> {\n return this.client.post<{ ok: true; roles: string[] }>('/auth/become-bale-seller', input, options)\n }\n\n /**\n * Check if the account is eligible for deletion and what blockers exist.\n */\n async getDeletionEligibility(options?: RequestOptions): Promise<{ eligible: boolean; reasons: string[]; totp_enabled: boolean }> {\n return this.client.get<{ eligible: boolean; reasons: string[]; totp_enabled: boolean }>('/auth/account/deletion-eligibility', undefined, options)\n }\n\n /**\n * Request account deletion. Sends a confirmation email if eligible.\n */\n async requestAccountDeletion(options?: RequestOptions): Promise<{ ok: true } | { blocked: true; reasons: string[] }> {\n return this.client.post<{ ok: true } | { blocked: true; reasons: string[] }>('/auth/account/deletion-request', undefined, options)\n }\n\n /**\n * Confirm account deletion (from emailed link). Clears local session on success.\n */\n async confirmAccountDeletion(input: { token: string; code?: string }, options?: RequestOptions): Promise<{ ok: true }> {\n const result = await this.client.delete<{ ok: true }>('/auth/account', input, options)\n await this.client.clearToken()\n return result\n }\n\n // ── Passkey Login ──\n\n /**\n * Start passkey login — get assertion options for navigator.credentials.get().\n */\n async startPasskeyLogin(input: { temp_token: string; method_id?: string }, options?: RequestOptions): Promise<{ options: PublicKeyCredentialRequestOptionsJSON }> {\n return this.client.post<{ options: PublicKeyCredentialRequestOptionsJSON }>('/auth/2fa/login/passkey/start', input, options)\n }\n\n /**\n * Finish passkey login — submit the browser's assertion response. Tokens are auto-persisted.\n */\n async finishPasskeyLogin(input: { temp_token: string; credential: AuthenticationResponseJSON }, options?: RequestOptions): Promise<AuthTokens> {\n const result = await this.client.post<AuthTokens>('/auth/2fa/login/passkey/finish', input, options)\n await this.client.setSession(result)\n return result\n }\n\n /**\n * One-time root bootstrap. The setup secret travels in a header and is never part of the JSON\n * body, where an error logger or request capture is more likely to record it.\n */\n async setupRoot(input: RootSetupInput, options?: RequestOptions): Promise<RootSetupResult> {\n const { setup_secret, ...body } = input\n return this.client.post<RootSetupResult>(\n '/auth/root/setup',\n body,\n { ...options, headers: { ...options?.headers, 'X-Root-Setup-Secret': setup_secret } },\n )\n }\n\n // ── Capabilities and backup-code lifecycle ──\n\n /** Public auth-mode document. Never requires or changes the session. */\n async capabilities(options?: RequestOptions): Promise<AuthCapabilities> {\n return this.client.get<AuthCapabilities>('/auth/capabilities', undefined, options)\n }\n\n /**\n * Replace every backup code after re-proving the current password.\n *\n * The result is intentionally not persisted by the SDK: codes are shown once, and storing them in\n * a browser turns a recovery credential into something a stolen session can read.\n */\n async regenerateBackupCodes(\n currentPassword: string,\n options?: RequestOptions,\n ): Promise<RegenerateBackupCodesResult> {\n return this.client.post<RegenerateBackupCodesResult>(\n '/auth/2fa/backup-codes/regenerate',\n { current_password: currentPassword },\n options,\n )\n }\n\n // ── Assisted account recovery ──\n\n async requestRecovery(\n input: RequestRecoveryInput,\n options?: RequestOptions,\n ): Promise<RequestRecoveryResult> {\n return this.client.post<RequestRecoveryResult>('/auth/recovery/request', input, options)\n }\n\n /**\n * Cancel with the token from the email. Always returns ok, whether it was valid or already used,\n * so this cannot be used to probe for live recoveries.\n */\n async cancelRecovery(token: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/recovery/cancel', { token }, options)\n }\n\n async recoveryStatus(tempToken: string, options?: RequestOptions): Promise<RecoveryStatusResult> {\n return this.client.get<RecoveryStatusResult>('/auth/recovery/status', { temp_token: tempToken }, options)\n }\n\n /**\n * Complete with a fresh temp token once cooling-off ends. Tokens are persisted; backup codes are\n * returned to the caller only and never stored.\n */\n async completeRecovery(tempToken: string, options?: RequestOptions): Promise<CompleteRecoveryResult> {\n const result = await this.client.post<CompleteRecoveryResult>('/auth/recovery/complete', { temp_token: tempToken }, options)\n await this.client.setSession(result)\n return result\n }\n\n // ── Account recovery review (requires recovery:review) ──\n\n async listRecoveryRequests(\n status: AdminRecoveryRequest['status'] = 'pending',\n options?: RequestOptions,\n ): Promise<{ requests: AdminRecoveryRequest[] }> {\n return this.client.get<{ requests: AdminRecoveryRequest[] }>('/auth/recovery/queue', { status }, options)\n }\n\n async approveRecovery(\n id: string,\n reviewNote: string,\n options?: RequestOptions,\n ): Promise<{ id: string; status: 'approved'; effective_at: string }> {\n return this.client.post<{ id: string; status: 'approved'; effective_at: string }>(\n `/auth/recovery/${id}/approve`,\n { review_note: reviewNote },\n options,\n )\n }\n\n async rejectRecovery(\n id: string,\n reviewNote: string,\n options?: RequestOptions,\n ): Promise<{ id: string; status: 'rejected' }> {\n return this.client.post<{ id: string; status: 'rejected' }>(\n `/auth/recovery/${id}/reject`,\n { review_note: reviewNote },\n options,\n )\n }\n\n async recoveryEvents(id: string, options?: RequestOptions): Promise<{ events: AdminRecoveryEvent[] }> {\n return this.client.get<{ events: AdminRecoveryEvent[] }>(`/auth/recovery/${id}/events`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n Condition,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\n SimilarListing,\n Store,\n UpdateListingInput,\n RequestOptions,\n} from '../types'\n\nexport class ListingsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the marketplace feed with optional filters.\n */\n async getFeed(params?: ListingsFeedParams, options?: RequestOptions): Promise<PaginatedResponse<Listing>> {\n // APIClient handles converting params to string|number|boolean properly\n return this.client.get<PaginatedResponse<Listing>>(\n '/listings/feed', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get full details of a single listing, including its images.\n */\n async getById(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.client.get<Listing & { images: ListingImage[] }>(`/listings/${id}`, undefined, options)\n }\n\n /**\n * Create a new listing (requires seller role).\n */\n async create(input: CreateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.post<Listing>('/listings', input, options)\n }\n\n /**\n * Update an existing listing.\n */\n async update(id: string, input: UpdateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.put<Listing>(`/listings/${id}`, input, options)\n }\n\n /**\n * Change the status of a listing.\n */\n async updateStatus(id: string, status: ListingStatus, options?: RequestOptions): Promise<{ ok: boolean; status: ListingStatus }> {\n return this.client.patch<{ ok: boolean; status: ListingStatus }>(`/listings/${id}/status`, { status }, options)\n }\n\n /**\n * Soft delete a listing (sets status to 'removed').\n */\n async delete(id: string, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.delete<{ ok: boolean }>(`/listings/${id}`, undefined, options)\n }\n\n /**\n * Get a seller's public storefront.\n */\n async getSellerStorefront(\n sellerId: string,\n params?: { page?: number; page_size?: number },\n options?: RequestOptions\n ): Promise<SellerStorefront> {\n return this.client.get<SellerStorefront>(\n `/listings/seller/${sellerId}`, \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * List all supported categories.\n */\n async getCategories(options?: RequestOptions): Promise<Category[]> {\n return this.client.get<Category[]>('/listings/categories', undefined, options)\n }\n\n /**\n * List all supported cities.\n */\n async getCities(options?: RequestOptions): Promise<City[]> {\n return this.client.get<City[]>('/listings/cities', undefined, options)\n }\n\n /**\n * Get trending listings, optionally filtered by category.\n */\n async getTrending(categoryId?: string, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n '/listings/trending',\n categoryId ? { category_id: categoryId } : undefined,\n options\n )\n }\n\n /**\n * Get top-performing stores for the home feed.\n */\n async getTopStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/top-stores', undefined, options)\n }\n\n /**\n * Get personalized \"for you\" listings (returns recent for anonymous users).\n */\n async getForYou(options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>('/listings/for-you', undefined, options)\n }\n\n /**\n * Get a presigned upload URL for a listing image.\n * Index should be between 0 and 9.\n */\n async presignImage(listingId: string, index: number, options?: RequestOptions): Promise<PresignImageResponse> {\n return this.client.post<PresignImageResponse>(`/listings/${listingId}/images/presign`, { index }, options)\n }\n\n /**\n * Upload an image file directly for a listing.\n * Uses multipart/form-data.\n */\n async uploadImage(listingId: string, file: Blob, index: number, options?: RequestOptions): Promise<{ r2_key: string; image_id: string; url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('index', String(index))\n return this.client.post<{ r2_key: string; image_id: string; url: string }>(`/listings/${listingId}/images/upload`, formData, options)\n }\n\n /**\n * Browse the listing feed (alias for getFeed with simplified params).\n */\n async feed(params?: { page?: number; city?: string; category?: string; sort?: string }, options?: RequestOptions): Promise<{ data: Listing[]; page: number }> {\n return this.client.get<{ data: Listing[]; page: number }>(\n '/listings',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a single listing by ID (alias for getById).\n */\n async get(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.getById(id, options)\n }\n\n /**\n * Full-text search with filters.\n */\n async search(params: { q: string; category?: string; condition?: Condition; min_price?: number; max_price?: number; sort?: string; page?: number }, options?: RequestOptions): Promise<{ data: Listing[]; total: number }> {\n return this.client.get<{ data: Listing[]; total: number }>(\n '/search',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get similar listings for a given listing.\n */\n async getSimilar(listingId: string, mode?: 'global' | 'store', options?: RequestOptions): Promise<{ data: SimilarListing[] }> {\n return this.client.get<{ data: SimilarListing[] }>(\n `/listings/${listingId}/similar`,\n mode ? { mode } : undefined,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, SearchHistoryItem, SaveSearchInput, TrendingTerm, RequestOptions } from '../types'\n\nexport class SearchModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Perform a full-text search with optional filters.\n */\n async query(params: SearchParams, options?: RequestOptions): Promise<PaginatedResponse<SearchResult>> {\n return this.client.get<PaginatedResponse<SearchResult>>(\n '/search', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get trending search terms.\n */\n async trending(params?: { city_id?: string }, options?: RequestOptions): Promise<{ terms: TrendingTerm[] }> {\n return this.client.get<{ terms: TrendingTerm[] }>(\n '/search/trending',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get the user's search history.\n */\n async getHistory(options?: RequestOptions): Promise<{ data: SearchHistoryItem[] }> {\n return this.client.get<{ data: SearchHistoryItem[] }>('/search/history', undefined, options)\n }\n\n /**\n * Save a search query to history.\n */\n async saveHistory(input: SaveSearchInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/search/history', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateOrderInput, Order, OrderEvent, OrderHistoryParams, OrderStatus, TransitionOrderInput, RequestOptions } from '../types'\n\nexport class OrdersModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Create a new order from a listing.\n */\n async create(input: CreateOrderInput, options?: RequestOptions): Promise<{ order_id: string; total: number; delivery_fee: number }> {\n return this.client.post<{ order_id: string; total: number; delivery_fee: number }>('/orders', input, options)\n }\n\n /**\n * Get full details of an order, including its event timeline.\n */\n async getById(id: string, options?: RequestOptions): Promise<Order & { events: OrderEvent[] }> {\n return this.client.get<Order & { events: OrderEvent[] }>(`/orders/${id}`, undefined, options)\n }\n\n /**\n * Transition the status of an order.\n */\n async transition(id: string, input: TransitionOrderInput, options?: RequestOptions): Promise<{ ok: boolean; status: OrderStatus }> {\n return this.client.post<{ ok: boolean; status: OrderStatus }>(`/orders/${id}/transition`, input, options)\n }\n\n /**\n * Get the order history for the current authenticated user.\n */\n async getHistory(params?: OrderHistoryParams, options?: RequestOptions): Promise<{ data: Order[]; page: number; page_size: number }> {\n return this.client.get<{ data: Order[]; page: number; page_size: number }>(\n '/orders/history',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type {\n CheckoutStatusResponse,\n InitiateCheckoutInput,\n InitiateCheckoutResponse,\n MpesaInput,\n PaystackInput,\n PaystackInitResponse,\n PaymentStatusResponse,\n StkPushInput,\n StkPushResponse,\n RequestOptions,\n} from '../types'\n\nexport class PayModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Initiate an M-Pesa STK Push payment for an order.\n */\n async initiateStk(input: StkPushInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate M-Pesa STK Push (alias for initiateStk).\n */\n async initMpesa(input: MpesaInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate a Paystack payment — returns access_code for inline popup.\n */\n async initPaystack(input: PaystackInput, options?: RequestOptions): Promise<PaystackInitResponse> {\n return this.client.post<PaystackInitResponse>('/pay/paystack/init', input, options)\n }\n\n /**\n * Initiate a provider-neutral checkout for an order.\n *\n * The payment provider is selected by the API. Continue checkout using the\n * returned next action, then poll {@link getCheckoutStatus} for payment state.\n * Retrying after cancellation requires the same input and idempotency key.\n *\n * @param input - Order, idempotency key, and buyer-selected payment method.\n * @param options - Request options, including an optional abort signal.\n * @returns The initiated attempt and its required continuation action.\n * @throws {APIError} When the API rejects or cannot initiate the checkout.\n */\n async initiateCheckout(\n input: InitiateCheckoutInput,\n options?: RequestOptions,\n ): Promise<InitiateCheckoutResponse> {\n return this.client.post<InitiateCheckoutResponse>('/pay/checkout/initiate', input, options)\n }\n\n /**\n * Poll for the current status of a payment by its order ID.\n *\n * @deprecated Use {@link getCheckoutStatus} for the typed checkout lifecycle.\n * This method retains its legacy route and response for compatibility.\n */\n async getStatus(orderId: string, options?: RequestOptions): Promise<PaymentStatusResponse> {\n return this.client.get<PaymentStatusResponse>(`/pay/status/${orderId}`, undefined, options)\n }\n\n /**\n * Get the buyer-visible checkout lifecycle for a retail or bale order.\n */\n async getCheckoutStatus(orderId: string, options?: RequestOptions): Promise<CheckoutStatusResponse> {\n return this.client.get<CheckoutStatusResponse>(`/pay/checkout-status/${orderId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { VAZIOutfit, VAZIOutfitDetail, VaziFeedParams, VaziFeedResponse, RequestOptions } from '../types'\n\nexport class VaziModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the AI-curated outfit feed.\n */\n async getFeed(params?: VaziFeedParams, options?: RequestOptions): Promise<VaziFeedResponse> {\n return this.client.get<VaziFeedResponse>(\n '/vazi/feed',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a complete outfit built around a specific seed listing.\n */\n async getCompleteLook(listingId: string, options?: RequestOptions): Promise<{ outfits: VAZIOutfit[] }> {\n return this.client.get<{ outfits: VAZIOutfit[] }>(`/vazi/complete/${listingId}`, undefined, options)\n }\n\n /**\n * Get a single outfit by ID with full item details.\n */\n async getOutfit(outfitId: string, options?: RequestOptions): Promise<VAZIOutfitDetail> {\n return this.client.get<VAZIOutfitDetail>(`/vazi/outfits/${outfitId}`, undefined, options)\n }\n}\n","import { APIClient, APIError } from '../client'\nimport { RealtimeProtocolError, RealtimeUnavailableError } from '../types/messages-v2'\nimport type {\n AttachmentUploadStatus,\n ConversationSummary,\n MessageAuthor,\n MessagesRealtimeConnection,\n MessagesRealtimeEvent,\n MessagesRealtimeOptions,\n MessagesRealtimeState,\n MessagesRealtimeTicket,\n ReadCursorResult,\n ThreadCard,\n ThreadMessage,\n ThreadSystemEvent,\n WebSocketCloseEventLike,\n WebSocketLike,\n WebSocketMessageEventLike,\n} from '../types'\n\nconst PROTOCOL = 'mitumba-messaging-v1'\nconst TYPING_THROTTLE_MS = 750\nconst TYPING_CLEAR_MS = 3_000\nconst MAX_DEDUPLICATION_IDS = 2_000\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isAuthor(value: unknown): value is MessageAuthor {\n if (!isRecord(value)) return false\n if (value.side === 'buyer') return isRecord(value.buyer) && typeof value.buyer.id === 'string'\n return value.side === 'store' && isRecord(value.store) && typeof value.store.id === 'string'\n}\n\nfunction isThreadMessage(value: unknown): value is ThreadMessage {\n return isRecord(value)\n && typeof value.id === 'string'\n && typeof value.thread_id === 'string'\n && Number.isSafeInteger(value.sequence)\n && typeof value.body === 'string'\n && isAuthor(value.author)\n && Array.isArray(value.attachments)\n && typeof value.created_at === 'string'\n}\n\nfunction isThreadCard(value: unknown): value is ThreadCard {\n return isRecord(value)\n && typeof value.id === 'string'\n && typeof value.conversation_id === 'string'\n && ['general', 'listing', 'order'].includes(String(value.kind))\n && typeof value.unread_count === 'number'\n}\n\nfunction isConversation(value: unknown): value is ConversationSummary {\n return isRecord(value)\n && typeof value.id === 'string'\n && isRecord(value.buyer)\n && isRecord(value.store)\n && typeof value.unread_count === 'number'\n}\n\nfunction isSystemEvent(value: unknown): value is ThreadSystemEvent {\n return isRecord(value)\n && typeof value.id === 'string'\n && typeof value.thread_id === 'string'\n && Number.isSafeInteger(value.sequence)\n && value.kind === 'thread.linked'\n}\n\nfunction isReadCursor(value: unknown): value is ReadCursorResult {\n return isRecord(value)\n && typeof value.thread_id === 'string'\n && typeof value.last_read_item_id === 'string'\n && Number.isSafeInteger(value.last_read_sequence)\n}\n\nfunction isUpload(value: unknown): value is AttachmentUploadStatus {\n return isRecord(value)\n && typeof value.id === 'string'\n && typeof value.thread_id === 'string'\n && ['authorized', 'uploaded', 'pending_scan', 'safe', 'rejected', 'expired', 'claimed'].includes(String(value.state))\n}\n\nfunction validDurablePayload(type: string, payload: unknown): boolean {\n if (!isRecord(payload)) return false\n if (type === 'message.created') return isThreadMessage(payload.message)\n if (type === 'system_event.created') return isSystemEvent(payload.event)\n if (type === 'conversation.updated') return isConversation(payload.conversation)\n if (type === 'thread.created' || type === 'thread.updated') return isThreadCard(payload.thread)\n if (type === 'read_cursor.updated') return isReadCursor(payload.cursor)\n if (type === 'attachment.updated') return isUpload(payload.upload)\n return type === 'message.policy_applied'\n && typeof payload.message_id === 'string'\n && Array.isArray(payload.notices)\n && payload.notices.every((notice) => typeof notice === 'string')\n}\n\nfunction parseEvent(value: unknown): MessagesRealtimeEvent | { type: 'ready'; resume_cursor: string | null } {\n if (!isRecord(value) || value.api_version !== 2 || value.protocol_version !== 1 || typeof value.type !== 'string') {\n throw new RealtimeProtocolError()\n }\n if (value.type === 'ready') {\n if (typeof value.connection_id !== 'string' || (value.resume_cursor !== null && typeof value.resume_cursor !== 'string')) {\n throw new RealtimeProtocolError()\n }\n return { type: 'ready', resume_cursor: value.resume_cursor as string | null }\n }\n if (value.type === 'typing.updated') {\n if (typeof value.thread_id !== 'string' || !isAuthor(value.author) || typeof value.is_typing !== 'boolean' || typeof value.occurred_at !== 'string') {\n throw new RealtimeProtocolError()\n }\n return value as unknown as MessagesRealtimeEvent\n }\n if (value.type === 'resync.required') {\n if (!['cursor_expired', 'gap_detected', 'authorization_changed'].includes(String(value.reason)) || typeof value.resume_cursor !== 'string') {\n throw new RealtimeProtocolError()\n }\n return value as unknown as MessagesRealtimeEvent\n }\n const durableTypes = [\n 'message.created', 'system_event.created', 'conversation.updated', 'thread.created',\n 'thread.updated', 'read_cursor.updated', 'attachment.updated', 'message.policy_applied',\n ]\n if (!durableTypes.includes(value.type)\n || typeof value.event_id !== 'string'\n || typeof value.resume_cursor !== 'string'\n || typeof value.occurred_at !== 'string'\n || !validDurablePayload(value.type, value.payload)) {\n throw new RealtimeProtocolError()\n }\n return value as unknown as MessagesRealtimeEvent\n}\n\nfunction ticketPath(options: MessagesRealtimeOptions): string {\n return options.perspective.kind === 'buyer'\n ? '/notify/v2/inboxes/buyer/realtime/tickets'\n : `/notify/v2/inboxes/stores/${encodeURIComponent(options.perspective.store_id)}/realtime/tickets`\n}\n\nfunction parseTicket(value: unknown): MessagesRealtimeTicket {\n if (!isRecord(value) || value.api_version !== 2 || !isRecord(value.data)) throw new RealtimeProtocolError()\n const ticket = value.data\n if (typeof ticket.ticket !== 'string'\n || typeof ticket.expires_at !== 'string'\n || typeof ticket.websocket_url !== 'string'\n || ticket.websocket_protocol !== PROTOCOL\n || ticket.protocol_version !== 1\n || (ticket.resume_cursor !== null && typeof ticket.resume_cursor !== 'string')) {\n throw new RealtimeProtocolError()\n }\n let url: URL\n try {\n url = new URL(ticket.websocket_url)\n } catch {\n throw new RealtimeProtocolError()\n }\n if (!['ws:', 'wss:'].includes(url.protocol) || url.searchParams.has('token') || !url.searchParams.has('ticket')) {\n throw new RealtimeProtocolError()\n }\n return ticket as unknown as MessagesRealtimeTicket\n}\n\nexport class ManagedMessagesRealtimeConnection implements MessagesRealtimeConnection {\n private currentState: MessagesRealtimeState = 'closed'\n private currentCursor: string | null\n private socket: WebSocketLike | null = null\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private typingTimers = new Map<string, ReturnType<typeof setTimeout>>()\n private typingSentAt = new Map<string, number>()\n private eventListeners = new Set<(event: MessagesRealtimeEvent) => void | Promise<void>>()\n private stateListeners = new Set<(state: MessagesRealtimeState) => void>()\n private subscribedThreads = new Set<string>()\n private seenEventIds = new Set<string>()\n private lastMessageSequence = new Map<string, number>()\n private explicitClose = false\n private reconnectAttempt = 0\n private startPromise: Promise<void> | null = null\n private resolveStart: (() => void) | null = null\n private rejectStart: ((error: unknown) => void) | null = null\n private readonly onOpen = (): void => undefined\n private readonly onMessage = (event: WebSocketMessageEventLike): void => { void this.handleMessage(event) }\n private readonly onClose = (event: WebSocketCloseEventLike): void => { this.handleClose(event) }\n private readonly onError = (): void => undefined\n\n constructor(\n private readonly client: APIClient,\n private readonly options: MessagesRealtimeOptions,\n ) {\n this.currentCursor = options.resumeCursor ?? null\n }\n\n get state(): MessagesRealtimeState { return this.currentState }\n get resumeCursor(): string | null { return this.currentCursor }\n\n onEvent(listener: (event: MessagesRealtimeEvent) => void | Promise<void>): () => void {\n this.eventListeners.add(listener)\n return () => { this.eventListeners.delete(listener) }\n }\n\n onStateChange(listener: (state: MessagesRealtimeState) => void): () => void {\n this.stateListeners.add(listener)\n return () => { this.stateListeners.delete(listener) }\n }\n\n subscribeThread(threadId: string): void { this.subscribedThreads.add(threadId) }\n\n unsubscribeThread(threadId: string): void {\n this.clearTyping(threadId, true)\n this.subscribedThreads.delete(threadId)\n }\n\n setTyping(threadId: string, isTyping: boolean): void {\n if (!this.subscribedThreads.has(threadId) || this.currentState !== 'open' || !this.socket) return\n const now = Date.now()\n const last = this.typingSentAt.get(threadId) ?? 0\n if (now - last < TYPING_THROTTLE_MS) return\n this.send({ protocol_version: 1, type: 'typing.set', thread_id: threadId, is_typing: isTyping })\n this.typingSentAt.set(threadId, now)\n const existing = this.typingTimers.get(threadId)\n if (existing) clearTimeout(existing)\n if (isTyping) {\n this.typingTimers.set(threadId, setTimeout(() => {\n this.typingSentAt.delete(threadId)\n this.setTyping(threadId, false)\n this.typingTimers.delete(threadId)\n }, TYPING_CLEAR_MS))\n } else {\n this.typingTimers.delete(threadId)\n }\n }\n\n async start(): Promise<void> {\n if (this.explicitClose) throw new RealtimeUnavailableError()\n if (this.currentState === 'open') return\n if (this.startPromise) return this.startPromise\n const pending = new Promise<void>((resolve, reject) => {\n this.resolveStart = resolve\n this.rejectStart = reject\n })\n this.startPromise = pending\n await this.open(false).catch((error: unknown) => {\n if (error instanceof RealtimeProtocolError\n || error instanceof RealtimeUnavailableError\n || (error instanceof APIError && [401, 403, 409].includes(error.status))) {\n this.fail(error)\n } else {\n this.scheduleReconnect()\n }\n })\n return pending\n }\n\n close(): void {\n this.explicitClose = true\n this.clearReconnect()\n this.clearAllTyping()\n this.detachSocket(true)\n this.transition('closed')\n this.resolveStart?.()\n this.finishStart()\n this.eventListeners.clear()\n this.stateListeners.clear()\n }\n\n private async open(reconnecting: boolean): Promise<void> {\n this.transition(reconnecting ? 'reconnecting' : 'connecting')\n const raw = await this.client.post<unknown>(ticketPath(this.options), {\n resume_cursor: this.currentCursor,\n supported_protocol_versions: [1],\n }, { signal: this.options.signal })\n if (this.explicitClose) return\n const ticket = parseTicket(raw)\n const socket = this.client.createWebSocket(ticket.websocket_url, ticket.websocket_protocol)\n this.socket = socket\n socket.addEventListener('open', this.onOpen)\n socket.addEventListener('message', this.onMessage)\n socket.addEventListener('close', this.onClose)\n socket.addEventListener('error', this.onError)\n }\n\n private async handleMessage(event: WebSocketMessageEventLike): Promise<void> {\n try {\n if (typeof event.data !== 'string') throw new RealtimeProtocolError()\n let decoded: unknown\n try { decoded = JSON.parse(event.data) } catch { throw new RealtimeProtocolError() }\n const parsed = parseEvent(decoded)\n if (parsed.type === 'ready') {\n this.currentCursor = parsed.resume_cursor ?? this.currentCursor\n this.reconnectAttempt = 0\n this.transition('open')\n this.resolveStart?.()\n this.finishStart()\n return\n }\n if ('event_id' in parsed) {\n if (this.seenEventIds.has(parsed.event_id)) {\n this.ack(parsed.event_id, parsed.resume_cursor)\n return\n }\n if (parsed.type === 'message.created') {\n const message = parsed.payload.message\n const previous = this.lastMessageSequence.get(message.thread_id) ?? 0\n if (message.sequence <= previous) {\n this.remember(parsed.event_id)\n this.ack(parsed.event_id, parsed.resume_cursor)\n return\n }\n this.lastMessageSequence.set(message.thread_id, message.sequence)\n }\n if (parsed.thread_id && this.subscribedThreads.size > 0 && !this.subscribedThreads.has(parsed.thread_id)) {\n this.remember(parsed.event_id)\n this.ack(parsed.event_id, parsed.resume_cursor)\n return\n }\n } else if (parsed.type === 'typing.updated' && !this.subscribedThreads.has(parsed.thread_id)) {\n return\n }\n\n for (const listener of [...this.eventListeners]) await listener(parsed)\n if ('event_id' in parsed) {\n this.remember(parsed.event_id)\n this.currentCursor = parsed.resume_cursor\n this.ack(parsed.event_id, parsed.resume_cursor)\n } else if (parsed.type === 'resync.required') {\n this.currentCursor = parsed.resume_cursor\n }\n } catch (error) {\n this.fail(error instanceof RealtimeProtocolError ? error : new RealtimeProtocolError())\n this.socket?.close(4004, 'protocol_error')\n }\n }\n\n private handleClose(event: WebSocketCloseEventLike): void {\n this.detachSocket(false)\n this.clearAllTyping()\n if (this.explicitClose) return\n if ([4002, 4003, 4004].includes(event.code)) {\n this.fail(new RealtimeProtocolError())\n return\n }\n this.scheduleReconnect()\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer || this.explicitClose) return\n this.transition('reconnecting')\n const base = Math.max(10, this.options.reconnectBaseDelayMs ?? 500)\n const maximum = Math.max(base, this.options.reconnectMaxDelayMs ?? 30_000)\n const cap = Math.min(maximum, base * (2 ** this.reconnectAttempt))\n const random = this.options.random ?? Math.random\n const delay = Math.floor(random() * cap)\n this.reconnectAttempt += 1\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n void this.open(true).catch((error: unknown) => {\n if (error instanceof APIError && [401, 403].includes(error.status)) this.fail(error)\n else this.scheduleReconnect()\n })\n }, delay)\n }\n\n private ack(eventId: string, cursor: string): void {\n this.send({ protocol_version: 1, type: 'ack', event_id: eventId, resume_cursor: cursor })\n }\n\n private send(frame: unknown): void {\n if (!this.socket || this.currentState !== 'open') return\n try { this.socket.send(JSON.stringify(frame)) } catch { /* close/reconnect owns recovery */ }\n }\n\n private remember(eventId: string): void {\n this.seenEventIds.add(eventId)\n if (this.seenEventIds.size <= MAX_DEDUPLICATION_IDS) return\n const oldest = this.seenEventIds.values().next().value\n if (typeof oldest === 'string') this.seenEventIds.delete(oldest)\n }\n\n private clearTyping(threadId: string, sendFalse: boolean): void {\n const timer = this.typingTimers.get(threadId)\n if (timer) clearTimeout(timer)\n this.typingTimers.delete(threadId)\n this.typingSentAt.delete(threadId)\n if (sendFalse && this.subscribedThreads.has(threadId)) {\n this.send({ protocol_version: 1, type: 'typing.set', thread_id: threadId, is_typing: false })\n }\n }\n\n private clearAllTyping(): void {\n for (const timer of this.typingTimers.values()) clearTimeout(timer)\n this.typingTimers.clear()\n this.typingSentAt.clear()\n }\n\n private clearReconnect(): void {\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n\n private detachSocket(close: boolean): void {\n const socket = this.socket\n if (!socket) return\n socket.removeEventListener('open', this.onOpen)\n socket.removeEventListener('message', this.onMessage)\n socket.removeEventListener('close', this.onClose)\n socket.removeEventListener('error', this.onError)\n if (close) {\n try { socket.close(1000, 'client_close') } catch { /* already closed */ }\n }\n this.socket = null\n }\n\n private transition(state: MessagesRealtimeState): void {\n if (this.currentState === state) return\n this.currentState = state\n for (const listener of [...this.stateListeners]) listener(state)\n }\n\n private fail(error: unknown): void {\n this.clearReconnect()\n this.transition('failed')\n this.rejectStart?.(error)\n this.finishStart()\n }\n\n private finishStart(): void {\n this.resolveStart = null\n this.rejectStart = null\n this.startPromise = null\n }\n}\n","import { APIClient, APIError } from '../client'\nimport type {\n AttachmentDownloadAuthorization,\n AttachmentUploadAuthorization,\n AttachmentUploadBody,\n AttachmentUploadStatus,\n BuyerResolveThreadInput,\n Conversation,\n ConversationSummary,\n CreateAttachmentUploadInput,\n CreateMessageBlockInput,\n CreateMessageBlockResult,\n CreateMessageReportInput,\n CreateMessageReportResult,\n CursorPage,\n LegacyLinkResolution,\n LegacyMessageArchiveSummary,\n LegacyMessagePage,\n ListConversationsParams,\n ListThreadMessagesParams,\n ListThreadsParams,\n Message,\n MessagePage,\n MessagingCapabilities,\n MessagingIdempotentRequestOptions,\n MessagingInboxes,\n MessagingPerspective,\n MessagesRealtimeConnection,\n MessagesRealtimeOptions,\n ReadCursorResult,\n RequestOptions,\n ResolveThreadResult,\n SendMessageInput,\n SendThreadMessageInput,\n SendThreadMessageResult,\n StoreResolveThreadInput,\n ThreadCard,\n ThreadId,\n UpdateConversationPreferencesInput,\n UpdateThreadPreferencesInput,\n WebSocketLike,\n} from '../types'\nimport { ManagedMessagesRealtimeConnection } from '../realtime/messages-realtime'\n\nfunction encode(value: string): string {\n return encodeURIComponent(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction unwrap<T>(value: unknown, valid: (data: unknown) => boolean = () => true): T {\n if (!isRecord(value) || value.api_version !== 2 || !('data' in value) || !valid(value.data)) {\n throw new APIError(502, { error: 'invalid_response', message: 'Messaging returned an invalid response.' })\n }\n return value.data as T\n}\n\nfunction isPage(value: unknown): boolean {\n return isRecord(value) && Array.isArray(value.items)\n}\n\nfunction isIdentified(value: unknown): boolean {\n return isRecord(value) && typeof value.id === 'string'\n}\n\nfunction perspectiveBase(perspective: MessagingPerspective): string {\n return perspective.kind === 'buyer'\n ? '/notify/v2/inboxes/buyer'\n : `/notify/v2/inboxes/stores/${encode(perspective.store_id)}`\n}\n\nfunction query(params: object): Record<string, string | number | boolean | undefined> | undefined {\n const entries = Object.entries(params) as Array<[string, string | number | boolean | undefined]>\n return entries.some(([, value]) => value !== undefined) ? Object.fromEntries(entries) : undefined\n}\n\nfunction idempotentOptions(options: MessagingIdempotentRequestOptions): RequestOptions {\n if (!options.idempotencyKey.trim()) throw new TypeError('idempotencyKey is required.')\n return {\n signal: options.signal,\n headers: { ...options.headers, 'Idempotency-Key': options.idempotencyKey },\n }\n}\n\nfunction validateLimit(params: { limit?: number }): void {\n if (params.limit !== undefined && (!Number.isInteger(params.limit) || params.limit < 1 || params.limit > 100)) {\n throw new RangeError('Messaging limit must be an integer from 1 through 100.')\n }\n}\n\nfunction validateSendInput(input: SendThreadMessageInput): void {\n if (!input.client_message_id.trim()) throw new TypeError('client_message_id is required.')\n const length = input.body.trim().length\n if (length < 1 || length > 2_000) throw new RangeError('Message body must contain 1 to 2,000 characters after trimming.')\n}\n\nfunction validateAttachmentInput(input: CreateAttachmentUploadInput): void {\n if (!input.file_name.trim() || !input.content_type.trim()) throw new TypeError('Attachment file name and content type are required.')\n if (!Number.isSafeInteger(input.size_bytes) || input.size_bytes < 1) throw new RangeError('Attachment size must be a positive integer.')\n if (!/^[a-f0-9]{64}$/u.test(input.sha256)) throw new TypeError('Attachment SHA-256 must be lowercase hexadecimal.')\n}\n\nfunction uploadBodySize(body: AttachmentUploadBody): number {\n if ('size' in body) return body.size\n return body.byteLength\n}\n\nasync function parseDirectResponse<T>(response: Response): Promise<T> {\n let decoded: unknown\n try {\n decoded = await response.json()\n } catch {\n throw new APIError(response.status || 502, { error: 'invalid_response', message: 'Messaging returned an invalid response.' })\n }\n if (!response.ok) {\n const error = isRecord(decoded) && isRecord(decoded.error)\n ? decoded.error\n : decoded\n throw new APIError(response.status, {\n error: isRecord(error) && typeof error.code === 'string'\n ? error.code\n : isRecord(error) && typeof error.error === 'string'\n ? error.error\n : 'unknown_error',\n message: isRecord(error) && typeof error.message === 'string' ? error.message : response.statusText,\n details: isRecord(error) ? error.details : undefined,\n })\n }\n return unwrap<T>(decoded)\n}\n\nexport class MessagesModule {\n constructor(private readonly client: APIClient) {}\n\n /** @deprecated Use listConversations or listStoreConversations. Context fields are non-authoritative server-validated hints. */\n async list(storeId?: string, options?: RequestOptions): Promise<{ data: Conversation[] }> {\n return this.client.get<{ data: Conversation[] }>(\n '/notify/messages',\n storeId ? { store_id: storeId } : undefined,\n options,\n )\n }\n\n /** @deprecated Resolve a v2 thread and call listThreadMessages. */\n async getThread(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ data: Message[] }> {\n return this.client.get<{ data: Message[] }>(\n `/notify/messages/${partnerId}`,\n storeId ? { store_id: storeId } : undefined,\n options,\n )\n }\n\n /** @deprecated Use sendThreadMessage. Receiver and context fields are hints validated by the server. */\n async send(input: SendMessageInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/notify/messages', input, options)\n }\n\n /** @deprecated Use advanceThreadReadCursor for precise monotonic state. */\n async markRead(partnerId: string, storeId?: string, options?: RequestOptions): Promise<{ ok: true }> {\n const path = storeId\n ? `/notify/messages/${partnerId}/read?store_id=${storeId}`\n : `/notify/messages/${partnerId}/read`\n return this.client.post<{ ok: true }>(path, undefined, options)\n }\n\n /** @deprecated Use managed messaging realtime. */\n connectTyping(partnerId: string): WebSocket {\n const token = this.client.getToken()\n const wsUrl = this.client.getBaseUrl().replace(/^http/, 'ws') + `/notify/messages/${partnerId}/ws?token=${token}`\n return new WebSocket(wsUrl)\n }\n\n /** @deprecated Use managed messaging realtime. */\n connectInbox(): WebSocket {\n const token = this.client.getToken()\n const wsUrl = this.client.getBaseUrl().replace(/^http/, 'ws') + `/notify/messages/inbox?token=${token}`\n return new WebSocket(wsUrl)\n }\n\n /** Create a legacy inbox socket only after hydrating/refreshing the access token. */\n async connectInboxFresh(options?: RequestOptions): Promise<WebSocketLike> {\n await this.client.ensureFreshToken(options)\n const token = this.client.getToken() ?? ''\n const wsUrl = this.client.getBaseUrl().replace(/^http/, 'ws') + `/notify/messages/inbox?token=${encode(token)}`\n return this.client.createWebSocket(wsUrl, [])\n }\n\n /** Create a report for a message or conversation. */\n async createReport(input: CreateMessageReportInput, options?: RequestOptions): Promise<CreateMessageReportResult> {\n return this.client.post<CreateMessageReportResult>('/notify/messages/reports', input, options)\n }\n\n /** Create an idempotent bilateral buyer/store relationship block. */\n async createBlock(input: CreateMessageBlockInput, options?: RequestOptions): Promise<CreateMessageBlockResult> {\n return this.client.post<CreateMessageBlockResult>('/notify/messages/blocks', input, options)\n }\n\n /** Remove a block created by the current perspective. */\n async removeBlock(blockId: string, options?: RequestOptions): Promise<{ ok: true; active: false }> {\n return this.client.delete<{ ok: true; active: false }>(`/notify/messages/blocks/${encode(blockId)}`, undefined, options)\n }\n\n /** Discover server messaging capabilities. */\n async getMessagingCapabilities(options?: RequestOptions): Promise<MessagingCapabilities> {\n const value = await this.client.get<unknown>('/notify/v2/capabilities', undefined, options)\n return unwrap<MessagingCapabilities>(value, isRecord)\n }\n\n /** List buyer and represented-store inbox perspectives. */\n async listMessagingInboxes(options?: RequestOptions): Promise<MessagingInboxes> {\n const value = await this.client.get<unknown>('/notify/v2/inboxes', undefined, options)\n return unwrap<MessagingInboxes>(value, isRecord)\n }\n\n /** List personal buyer conversations. */\n async listConversations(params: ListConversationsParams = {}, options?: RequestOptions): Promise<CursorPage<ConversationSummary>> {\n validateLimit(params)\n const value = await this.client.get<unknown>('/notify/v2/inboxes/buyer/conversations', query(params), options)\n return unwrap<CursorPage<ConversationSummary>>(value, isPage)\n }\n\n /** List conversations for one represented store. */\n async listStoreConversations(storeId: string, params: ListConversationsParams = {}, options?: RequestOptions): Promise<CursorPage<ConversationSummary>> {\n validateLimit(params)\n const value = await this.client.get<unknown>(`/notify/v2/inboxes/stores/${encode(storeId)}/conversations`, query(params), options)\n return unwrap<CursorPage<ConversationSummary>>(value, isPage)\n }\n\n /** Get one authorized buyer/store conversation. */\n async getConversation(perspective: MessagingPerspective, conversationId: string, options?: RequestOptions): Promise<ConversationSummary> {\n const value = await this.client.get<unknown>(`${perspectiveBase(perspective)}/conversations/${encode(conversationId)}`, undefined, options)\n const data = unwrap<{ conversation: ConversationSummary }>(value, isRecord)\n if (!isIdentified(data.conversation)) throw new APIError(502, { error: 'invalid_response' })\n return data.conversation\n }\n\n /** Resolve a General, Listing, or Order thread idempotently. */\n async resolveThread(\n perspective: MessagingPerspective,\n input: BuyerResolveThreadInput | StoreResolveThreadInput,\n options: MessagingIdempotentRequestOptions,\n ): Promise<ResolveThreadResult> {\n const value = await this.client.post<unknown>(`${perspectiveBase(perspective)}/threads/resolve`, input, idempotentOptions(options))\n return unwrap<ResolveThreadResult>(value, (data) => isRecord(data) && isIdentified(data.thread) && isIdentified(data.conversation))\n }\n\n /** List contextual thread cards for one conversation. */\n async listThreads(\n perspective: MessagingPerspective,\n conversationId: string,\n params: ListThreadsParams = {},\n options?: RequestOptions,\n ): Promise<CursorPage<ThreadCard>> {\n validateLimit(params)\n const value = await this.client.get<unknown>(\n `${perspectiveBase(perspective)}/conversations/${encode(conversationId)}/threads`,\n query(params),\n options,\n )\n return unwrap<CursorPage<ThreadCard>>(value, isPage)\n }\n\n /** Get one contextual thread card and its conversation. */\n async getConversationThread(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n options?: RequestOptions,\n ): Promise<{ conversation: ConversationSummary; thread: ThreadCard }> {\n const value = await this.client.get<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}`, undefined, options)\n return unwrap(value, (data) => isRecord(data) && isIdentified(data.thread) && isIdentified(data.conversation))\n }\n\n /** Update shared support status for a Listing or Order thread. */\n async updateThreadStatus(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n status: 'open' | 'resolved',\n options?: RequestOptions,\n ): Promise<ThreadCard> {\n const value = await this.client.patch<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}/status`, { status }, options)\n const data = unwrap<{ thread: ThreadCard }>(value, isRecord)\n if (!isIdentified(data.thread)) throw new APIError(502, { error: 'invalid_response' })\n return data.thread\n }\n\n /** Update perspective-private thread preferences. */\n async updateThreadPreferences(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n preferences: UpdateThreadPreferencesInput,\n options?: RequestOptions,\n ): Promise<ThreadCard> {\n const value = await this.client.patch<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}/preferences`, preferences, options)\n const data = unwrap<{ thread: ThreadCard }>(value, isRecord)\n if (!isIdentified(data.thread)) throw new APIError(502, { error: 'invalid_response' })\n return data.thread\n }\n\n /** Update perspective-private conversation preferences. */\n async updateConversationPreferences(\n perspective: MessagingPerspective,\n conversationId: string,\n preferences: UpdateConversationPreferencesInput,\n options?: RequestOptions,\n ): Promise<ConversationSummary> {\n const value = await this.client.patch<unknown>(`${perspectiveBase(perspective)}/conversations/${encode(conversationId)}/preferences`, preferences, options)\n const data = unwrap<{ conversation: ConversationSummary }>(value, isRecord)\n if (!isIdentified(data.conversation)) throw new APIError(502, { error: 'invalid_response' })\n return data.conversation\n }\n\n /** List the newest, older, or catch-up timeline window for one thread. */\n async listThreadMessages(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n params: ListThreadMessagesParams = {},\n options?: RequestOptions,\n ): Promise<MessagePage> {\n validateLimit(params)\n const value = await this.client.get<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}/messages`, query(params), options)\n return unwrap<MessagePage>(value, isPage)\n }\n\n /** Send one idempotent message without ever replacing the caller-owned ID. */\n async sendThreadMessage(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n input: SendThreadMessageInput,\n options?: RequestOptions,\n ): Promise<SendThreadMessageResult> {\n validateSendInput(input)\n const { client_message_id, ...body } = input\n const value = await this.client.post<unknown>(\n `${perspectiveBase(perspective)}/threads/${encode(threadId)}/messages`,\n body,\n { ...options, headers: { ...options?.headers, 'Idempotency-Key': client_message_id } },\n )\n return unwrap<SendThreadMessageResult>(value, (data) => isRecord(data) && isIdentified(data.message))\n }\n\n /** Advance the selected perspective read cursor to one visible timeline item. */\n async advanceThreadReadCursor(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n timelineItemId: string,\n options?: RequestOptions,\n ): Promise<ReadCursorResult> {\n const value = await this.client.put<unknown>(\n `${perspectiveBase(perspective)}/threads/${encode(threadId)}/read-cursor`,\n { timeline_item_id: timelineItemId },\n options,\n )\n return unwrap<ReadCursorResult>(value, (data) => isRecord(data) && typeof data.last_read_sequence === 'number')\n }\n\n /** List read-only exact-participant legacy archives. */\n async listLegacyMessageArchives(params: ListConversationsParams = {}, options?: RequestOptions): Promise<CursorPage<LegacyMessageArchiveSummary>> {\n validateLimit(params)\n const value = await this.client.get<unknown>('/notify/v2/legacy-messages', query(params), options)\n return unwrap<CursorPage<LegacyMessageArchiveSummary>>(value, isPage)\n }\n\n /** List messages in one read-only legacy archive. */\n async listLegacyMessages(legacyThreadId: string, params: ListThreadMessagesParams = {}, options?: RequestOptions): Promise<LegacyMessagePage> {\n validateLimit(params)\n const value = await this.client.get<unknown>(`/notify/v2/legacy-messages/${encode(legacyThreadId)}`, query(params), options)\n return unwrap<LegacyMessagePage>(value, isPage)\n }\n\n /** Resolve a temporary partner/order link without guessing between stores. */\n async resolveLegacyLink(\n input: { partner_id: string; store_id: string | null; order_id: string | null },\n options?: RequestOptions,\n ): Promise<LegacyLinkResolution> {\n const value = await this.client.post<unknown>('/notify/v2/inboxes/buyer/legacy-links/resolve', input, options)\n return unwrap<LegacyLinkResolution>(value, (data) => isRecord(data) && typeof data.result === 'string')\n }\n\n /** Authorize a private attachment upload for one thread. */\n async createThreadAttachmentUpload(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n input: CreateAttachmentUploadInput,\n options?: RequestOptions,\n ): Promise<AttachmentUploadAuthorization> {\n validateAttachmentInput(input)\n const value = await this.client.post<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}/attachment-uploads`, input, options)\n return unwrap<AttachmentUploadAuthorization>(value, (data) => isRecord(data) && data.state === 'authorized' && typeof data.upload_url === 'string')\n }\n\n /** Upload exact bytes through a one-use application ticket. */\n async uploadThreadAttachment(\n authorization: AttachmentUploadAuthorization,\n body: AttachmentUploadBody,\n options?: RequestOptions,\n ): Promise<AttachmentUploadStatus> {\n if (uploadBodySize(body) !== authorization.accepted.size_bytes) {\n throw new RangeError('Attachment body size does not match its authorization.')\n }\n const response = await fetch(authorization.upload_url, {\n method: 'PUT',\n headers: { ...options?.headers, 'Content-Type': authorization.accepted.content_type },\n body: body as BodyInit,\n signal: options?.signal,\n })\n return parseDirectResponse<AttachmentUploadStatus>(response)\n }\n\n /** Get current status for an upload created by the same perspective. */\n async getThreadAttachmentUpload(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n uploadId: string,\n options?: RequestOptions,\n ): Promise<AttachmentUploadStatus> {\n const value = await this.client.get<unknown>(\n `${perspectiveBase(perspective)}/threads/${encode(threadId)}/attachment-uploads/${encode(uploadId)}`,\n undefined,\n options,\n )\n return unwrap<AttachmentUploadStatus>(value, (data) => isRecord(data) && typeof data.state === 'string')\n }\n\n /** Create a short-lived mediated download for one committed attachment. */\n async createThreadAttachmentDownload(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n attachmentId: string,\n options?: RequestOptions,\n ): Promise<AttachmentDownloadAuthorization> {\n const value = await this.client.post<unknown>(\n `${perspectiveBase(perspective)}/threads/${encode(threadId)}/attachments/${encode(attachmentId)}/download`,\n undefined,\n options,\n )\n return unwrap<AttachmentDownloadAuthorization>(value, (data) => isRecord(data) && typeof data.url === 'string')\n }\n\n /** Create an inert managed realtime connection. Register listeners before start(). */\n createMessagesRealtimeConnection(options: MessagesRealtimeOptions): MessagesRealtimeConnection {\n return new ManagedMessagesRealtimeConnection(this.client, options)\n }\n\n /** Create and start a managed realtime connection. */\n async connectMessagesRealtime(options: MessagesRealtimeOptions): Promise<MessagesRealtimeConnection> {\n const connection = this.createMessagesRealtimeConnection(options)\n await connection.start()\n return connection\n }\n}\n","import { APIClient } from '../client'\nimport type { Notification, RequestOptions } from '../types'\n\nexport class NotificationsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List paginated notifications with unread count.\n */\n async list(page?: number, options?: RequestOptions): Promise<{ data: Notification[]; unread_count: number; page: number }> {\n return this.client.get<{ data: Notification[]; unread_count: number; page: number }>(\n '/notify/notifications',\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Mark notifications as read. If ids omitted, marks all as read.\n */\n async markRead(ids?: string[], options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/notifications/read', ids ? { ids } : {}, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateStoreInput, UpdateStoreInput, StoreStats, StoreSettings, StoreAnalytics, Listing, Store, FollowedStore, RequestOptions } from '../types'\n\nexport class StoresModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Get a store by its URL slug.\n */\n async getBySlug(slug: string, options?: RequestOptions): Promise<Store> {\n return this.client.get<Store>(`/listings/stores/${slug}`, undefined, options)\n }\n\n /**\n * Follow a store.\n */\n async follow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/stores/${storeId}/follow`, undefined, options)\n }\n\n /**\n * Unfollow a store.\n */\n async unfollow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/stores/${storeId}/follow`, undefined, options)\n }\n\n /**\n * Get paginated listings for a specific store.\n */\n async getListings(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n `/listings/stores/${storeId}/listings`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Get all stores owned by the authenticated user.\n */\n async getMyStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/stores/mine', undefined, options)\n }\n\n /**\n * Get stores the authenticated user follows.\n */\n async getFollowing(params?: { page?: number }, options?: RequestOptions): Promise<{ data: FollowedStore[]; page: number; page_size: number }> {\n return this.client.get<{ data: FollowedStore[]; page: number; page_size: number }>(\n '/listings/stores/following',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Create a new store.\n */\n async create(input: CreateStoreInput, options?: RequestOptions): Promise<{ id: string; slug: string }> {\n return this.client.post<{ id: string; slug: string }>('/listings/stores', input, options)\n }\n\n /**\n * Update a store's details.\n */\n async update(storeId: string, input: UpdateStoreInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}`, input, options)\n }\n\n /**\n * Get store statistics.\n */\n async getStats(storeId: string, options?: RequestOptions): Promise<StoreStats> {\n return this.client.get<StoreStats>(`/listings/stores/${storeId}/stats`, undefined, options)\n }\n\n /**\n * Get store settings.\n */\n async getSettings(storeId: string, options?: RequestOptions): Promise<StoreSettings> {\n return this.client.get<StoreSettings>(`/listings/stores/${storeId}/settings`, undefined, options)\n }\n\n /**\n * Update store settings (partial).\n */\n async updateSettings(storeId: string, input: Partial<StoreSettings>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}/settings`, input, options)\n }\n\n /**\n * Get store analytics.\n */\n async getAnalytics(storeId: string, period?: 'daily' | 'weekly' | 'monthly', options?: RequestOptions): Promise<StoreAnalytics> {\n return this.client.get<StoreAnalytics>(\n `/listings/stores/${storeId}/analytics`,\n period ? { period } : undefined,\n options\n )\n }\n\n /**\n * Upload a store logo image.\n */\n async uploadLogo(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/logo`, formData, options)\n }\n\n /**\n * Upload a store banner image.\n */\n async uploadBanner(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/banner`, formData, options)\n }\n\n /**\n * Delete a store. Blocked if active orders, pending payouts, or open disputes exist.\n */\n async delete(storeId: string, options?: RequestOptions): Promise<{ ok: true } | { blocked: true; reasons: string[] }> {\n return this.client.delete<{ ok: true } | { blocked: true; reasons: string[] }>(`/listings/stores/${storeId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateReviewInput, Review, ReviewableOrder, RequestOptions } from '../types'\n\nexport class ReviewsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List reviews for a store (public).\n */\n async list(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Review[]; total: number; avg_rating: number; page: number }> {\n return this.client.get<{ data: Review[]; total: number; avg_rating: number; page: number }>(\n `/listings/stores/${storeId}/reviews`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Create a review for a store (authenticated).\n */\n async create(storeId: string, input: CreateReviewInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>(`/listings/stores/${storeId}/reviews`, input, options)\n }\n\n /**\n * Get orders eligible for review (delivered/completed, not yet reviewed).\n */\n async getReviewableOrders(storeId: string, options?: RequestOptions): Promise<{ data: ReviewableOrder[] }> {\n return this.client.get<{ data: ReviewableOrder[] }>(`/listings/stores/${storeId}/reviews/eligible`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { WishlistListing, RequestOptions } from '../types'\n\nexport class WishlistsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List saved listings.\n */\n async list(options?: RequestOptions): Promise<{ data: WishlistListing[] }> {\n return this.client.get<{ data: WishlistListing[] }>('/listings/wishlists', undefined, options)\n }\n\n /**\n * Add a listing to the wishlist.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/wishlists/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the wishlist.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/wishlists/${listingId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CartItem, RequestOptions } from '../types'\n\nexport class CartModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List items in the cart.\n */\n async list(options?: RequestOptions): Promise<{ data: CartItem[] }> {\n return this.client.get<{ data: CartItem[] }>('/listings/cart', undefined, options)\n }\n\n /**\n * Add a listing to the cart.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/cart/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the cart.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/cart/${listingId}`, undefined, options)\n }\n\n /**\n * Update the quantity of a cart item.\n */\n async updateQuantity(listingId: string, quantity: number, options?: RequestOptions): Promise<{ ok: true; quantity: number }> {\n return this.client.patch<{ ok: true; quantity: number }>(`/listings/cart/${listingId}`, { quantity }, options)\n }\n\n /**\n * Checkout the cart — creates orders grouped by store and clears the cart.\n */\n async checkout(options?: RequestOptions): Promise<{ order_ids: string[]; count: number }> {\n return this.client.post<{ order_ids: string[]; count: number }>('/orders/checkout', undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n UpdateProfileInput,\n ChangePasswordInput,\n Session,\n NotificationPref,\n Address,\n AddAddressInput,\n PaymentMethod,\n AddPaymentMethodInput,\n LinkedAccount,\n LinkedAccountProvider,\n TwoFactorMethod,\n Add2FAMethodInput,\n Add2FAMethodResult,\n PublicKeyCredentialCreationOptionsJSON,\n RegistrationResponseJSON,\n UserProfile,\n RequestOptions,\n} from '../types'\n\nexport class SettingsModule {\n constructor(private readonly client: APIClient) {}\n\n // ── Profile ──\n\n async getProfile(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n async updateProfile(input: UpdateProfileInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/me', input, options)\n }\n\n // ── Security ──\n\n async changePassword(input: ChangePasswordInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/change-password', input, options)\n }\n\n async getSessions(options?: RequestOptions): Promise<{ data: Session[] }> {\n return this.client.get<{ data: Session[] }>('/auth/sessions', undefined, options)\n }\n\n async revokeSession(sessionId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/sessions/${sessionId}`, undefined, options)\n }\n\n // ── Notification Preferences ──\n\n async getNotificationPrefs(options?: RequestOptions): Promise<{ data: NotificationPref[] }> {\n return this.client.get<{ data: NotificationPref[] }>('/auth/notification-prefs', undefined, options)\n }\n\n async updateNotificationPref(channel: string, enabled: boolean, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/notification-prefs/${channel}`, { enabled }, options)\n }\n\n // ── Preferences ──\n\n async getPreferences(options?: RequestOptions): Promise<{ data: Record<string, string> }> {\n return this.client.get<{ data: Record<string, string> }>('/auth/preferences', undefined, options)\n }\n\n async updatePreferences(prefs: Record<string, string>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/preferences', { prefs }, options)\n }\n\n // ── Addresses ──\n\n async getAddresses(options?: RequestOptions): Promise<{ data: Address[] }> {\n return this.client.get<{ data: Address[] }>('/auth/addresses', undefined, options)\n }\n\n async addAddress(input: AddAddressInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/addresses', input, options)\n }\n\n async updateAddress(id: string, input: Partial<AddAddressInput>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/addresses/${id}`, input, options)\n }\n\n async deleteAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/addresses/${id}`, undefined, options)\n }\n\n async setDefaultAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/addresses/${id}/default`, undefined, options)\n }\n\n // ── Payment Methods ──\n\n async getPaymentMethods(options?: RequestOptions): Promise<{ data: PaymentMethod[] }> {\n return this.client.get<{ data: PaymentMethod[] }>('/auth/payment-methods', undefined, options)\n }\n\n async addPaymentMethod(input: AddPaymentMethodInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/payment-methods', input, options)\n }\n\n async deletePaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/payment-methods/${id}`, undefined, options)\n }\n\n async setDefaultPaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/payment-methods/${id}/default`, undefined, options)\n }\n\n // ── Linked Accounts ──\n\n async getLinkedAccounts(options?: RequestOptions): Promise<{ data: LinkedAccount[] }> {\n return this.client.get<{ data: LinkedAccount[] }>('/auth/linked-accounts', undefined, options)\n }\n\n async linkAccount(provider: LinkedAccountProvider, token: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/linked-accounts', { provider, token }, options)\n }\n\n async unlinkAccount(provider: LinkedAccountProvider, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/linked-accounts/${provider}`, undefined, options)\n }\n\n // ── 2FA ──\n\n async setup2FA(options?: RequestOptions): Promise<{ secret: string; otpauth_uri: string }> {\n return this.client.post<{ secret: string; otpauth_uri: string }>('/auth/2fa/setup', undefined, options)\n }\n\n async verify2FA(code: string, options?: RequestOptions): Promise<{ ok: true; backup_codes: string[] }> {\n return this.client.post<{ ok: true; backup_codes: string[] }>('/auth/2fa/verify', { code }, options)\n }\n\n async disable2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/disable', { code }, options)\n }\n\n async enable2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/enable', { code }, options)\n }\n\n async delete2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>('/auth/2fa', { code }, options)\n }\n\n // ── Multi-Method 2FA ──\n\n async list2FAMethods(options?: RequestOptions): Promise<{ methods: TwoFactorMethod[] }> {\n return this.client.get<{ methods: TwoFactorMethod[] }>('/auth/2fa/methods', undefined, options)\n }\n\n async add2FAMethod(input: Add2FAMethodInput, options?: RequestOptions): Promise<Add2FAMethodResult> {\n return this.client.post<Add2FAMethodResult>('/auth/2fa/methods', input, options)\n }\n\n async verify2FAMethod(id: string, code: string, options?: RequestOptions): Promise<{ ok: true; backup_codes?: string[] }> {\n return this.client.post<{ ok: true; backup_codes?: string[] }>(`/auth/2fa/methods/${id}/verify`, { code }, options)\n }\n\n async enable2FAMethod(id: string, code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/2fa/methods/${id}/enable`, { code }, options)\n }\n\n async disable2FAMethod(id: string, code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/2fa/methods/${id}/disable`, { code }, options)\n }\n\n async delete2FAMethod(id: string, code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/2fa/methods/${id}`, { code }, options)\n }\n\n async setPrimary2FAMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/2fa/methods/${id}/primary`, undefined, options)\n }\n\n async challenge2FAMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/2fa/methods/${id}/challenge`, undefined, options)\n }\n\n // ── Passkey Registration ──\n\n async startPasskeyRegistration(input?: { label?: string }, options?: RequestOptions): Promise<{ method_id: string; options: PublicKeyCredentialCreationOptionsJSON }> {\n return this.client.post<{ method_id: string; options: PublicKeyCredentialCreationOptionsJSON }>('/auth/2fa/methods', { type: 'passkey', ...input }, options)\n }\n\n async finishPasskeyRegistration(methodId: string, credential: RegistrationResponseJSON, options?: RequestOptions): Promise<{ ok: true; backup_codes?: string[] }> {\n return this.client.post<{ ok: true; backup_codes?: string[] }>(`/auth/2fa/methods/${methodId}/passkey/finish`, credential, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { MailerTemplate, SendEmailInput, RequestOptions } from '../types'\n\nexport class MailerModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Send a transactional email via the notifications worker.\n */\n async send(template: MailerTemplate, input: SendEmailInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/email', { template, ...input }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Business, UpdateBusinessInput, RequestOptions } from '../types'\n\nexport class BusinessesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Get all businesses owned by the current user. */\n async getMine(options?: RequestOptions): Promise<{ data: Business[] }> {\n return this.client.get<{ data: Business[] }>('/listings/businesses/mine', undefined, options)\n }\n\n /** Get a business by ID. */\n async getById(id: string, options?: RequestOptions): Promise<Business> {\n return this.client.get<Business>(`/listings/businesses/${id}`, undefined, options)\n }\n\n /** Update a business. */\n async update(id: string, input: UpdateBusinessInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/businesses/${id}`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n BlockedIp, SystemStats, AdminUserListItem, AdminUserDetail, AdminStoreListItem,\n AdminStoreDetail, AdminVerificationItem, StiEvent, AdminListingItem,\n AdminOrderListItem, AdminOrderDetail, AdminPayoutItem, AdminReport,\n AdminVaziOutfit, RequestOptions, AdminPermission, AdminRolePreset,\n AdminPermissionDescription, AdminOperator, AdminAuditEntry, PendingPayoutApproval,\n AdminWholesalePendingStore,\n} from '../types'\n\nexport class AdminModule {\n constructor(private readonly client: APIClient) {}\n\n // ── IP Blocking ──\n\n /**\n * @deprecated Pass a reason as the second argument. Kept source-compatible because the method was\n * already published, even though the endpoint did not exist at the time.\n */\n async blockIp(ip: string, durationHours?: number, options?: RequestOptions): Promise<{ ok: true; blocked: string; hours: number; expires_at: string; note: string }>\n async blockIp(ip: string, reason: string, durationHours?: number, options?: RequestOptions): Promise<{ ok: true; blocked: string; hours: number; expires_at: string; note: string }>\n async blockIp(\n ip: string,\n reasonOrDuration: string | number = 24,\n durationOrOptions?: number | RequestOptions,\n maybeOptions?: RequestOptions,\n ): Promise<{ ok: true; blocked: string; hours: number; expires_at: string; note: string }> {\n const modern = typeof reasonOrDuration === 'string'\n const reason = modern ? reasonOrDuration : 'No reason supplied by legacy SDK caller'\n const durationHours = modern\n ? (typeof durationOrOptions === 'number' ? durationOrOptions : 24)\n : reasonOrDuration\n const options = modern\n ? (typeof durationOrOptions === 'object' ? durationOrOptions : maybeOptions)\n : (typeof durationOrOptions === 'object' ? durationOrOptions : undefined)\n\n return this.client.post<{ ok: true; blocked: string; hours: number; expires_at: string; note: string }>(\n '/admin/block-ip',\n { ip, reason, duration_hours: durationHours },\n options,\n )\n }\n\n async unblockIp(ip: string, options?: RequestOptions): Promise<{ ok: true; unblocked: string }> {\n return this.client.post<{ ok: true; unblocked: string }>('/admin/unblock-ip', { ip }, options)\n }\n\n async getBlockedIps(options?: RequestOptions): Promise<{ data: BlockedIp[] }> {\n return this.client.get<{ data: BlockedIp[] }>('/admin/blocked-ips', undefined, options)\n }\n\n // ── Stats ──\n\n async getSystemStats(options?: RequestOptions): Promise<SystemStats> {\n return this.client.get<SystemStats>('/admin/stats', undefined, options)\n }\n\n async getStatsTimeseries(params?: { metric?: 'orders' | 'gmv' | 'users'; days?: number }, options?: RequestOptions): Promise<{ metric: string; days: number; data: { day: string; value: number }[] }> {\n return this.client.get<{ metric: string; days: number; data: { day: string; value: number }[] }>('/admin/stats/timeseries', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async getStatsByCity(options?: RequestOptions): Promise<{ data: { city: string; orders: number; gmv: number }[] }> {\n return this.client.get<{ data: { city: string; orders: number; gmv: number }[] }>('/admin/stats/by-city', undefined, options)\n }\n\n // ── Users ──\n\n async listUsers(params?: { q?: string; page?: number }, options?: RequestOptions): Promise<{ data: AdminUserListItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminUserListItem[]; page: number; page_size: number }>('/admin/users', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async getUser(userId: string, options?: RequestOptions): Promise<AdminUserDetail> {\n return this.client.get<AdminUserDetail>(`/admin/users/${userId}`, undefined, options)\n }\n\n async suspendUser(userId: string, reason: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/suspend`, { reason }, options)\n }\n\n async unsuspendUser(userId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/unsuspend`, undefined, options)\n }\n\n async setUserRole(userId: string, role: string, action: 'grant' | 'revoke', options?: RequestOptions): Promise<{ ok: true; roles: string[] }> {\n return this.client.post<{ ok: true; roles: string[] }>(`/admin/users/${userId}/roles`, { role, action }, options)\n }\n\n async revokeUserSessions(userId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/revoke-sessions`, undefined, options)\n }\n\n // ── Stores ──\n\n async listStores(params?: { q?: string; verified?: 0 | 1; tier?: 'free' | 'pro'; page?: number }, options?: RequestOptions): Promise<{ data: AdminStoreListItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminStoreListItem[]; page: number; page_size: number }>('/admin/stores', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async getStore(storeId: string, options?: RequestOptions): Promise<AdminStoreDetail> {\n return this.client.get<AdminStoreDetail>(`/admin/stores/${storeId}`, undefined, options)\n }\n\n async verifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/verify`, undefined, options)\n }\n\n async unverifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/unverify`, undefined, options)\n }\n\n // ── Verification Queue ──\n\n async listVerifications(params?: { status?: 'pending' | 'verified' | 'rejected' | 'unverified'; page?: number }, options?: RequestOptions): Promise<{ data: AdminVerificationItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminVerificationItem[]; page: number; page_size: number }>('/admin/verifications', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async approveVerification(userId: string, options?: RequestOptions): Promise<{ ok: true; verification_status: 'verified' }> {\n return this.client.post<{ ok: true; verification_status: 'verified' }>(`/admin/verifications/${userId}/approve`, undefined, options)\n }\n\n async rejectVerification(userId: string, reason?: string, options?: RequestOptions): Promise<{ ok: true; verification_status: 'rejected' }> {\n return this.client.post<{ ok: true; verification_status: 'rejected' }>(`/admin/verifications/${userId}/reject`, reason ? { reason } : undefined, options)\n }\n\n // ── STI ──\n\n async adjustSti(userId: string, input: { score?: number; delta?: number; reason: string }, options?: RequestOptions): Promise<{ ok: true; score_before: number; score_after: number }> {\n return this.client.post<{ ok: true; score_before: number; score_after: number }>(`/admin/sellers/${userId}/sti`, input, options)\n }\n\n async getStiEvents(userId: string, params?: { page?: number }, options?: RequestOptions): Promise<{ data: StiEvent[]; page: number; page_size: number }> {\n return this.client.get<{ data: StiEvent[]; page: number; page_size: number }>(`/admin/sellers/${userId}/sti-events`, params as Record<string, string | number | boolean | undefined>, options)\n }\n\n // ── Listings Moderation ──\n\n async listListings(params?: { status?: string; photo_verified?: 0 | 1; page?: number }, options?: RequestOptions): Promise<{ data: AdminListingItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminListingItem[]; page: number; page_size: number }>('/admin/listings', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async removeListing(listingId: string, reason?: string, options?: RequestOptions): Promise<{ ok: true; status: 'removed' }> {\n return this.client.post<{ ok: true; status: 'removed' }>(`/admin/listings/${listingId}/remove`, reason ? { reason } : undefined, options)\n }\n\n async reinstateListing(listingId: string, options?: RequestOptions): Promise<{ ok: true; status: 'active' }> {\n return this.client.post<{ ok: true; status: 'active' }>(`/admin/listings/${listingId}/reinstate`, undefined, options)\n }\n\n // ── Orders ──\n\n async listOrders(params?: { status?: string; q?: string; page?: number }, options?: RequestOptions): Promise<{ data: AdminOrderListItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminOrderListItem[]; page: number; page_size: number }>('/admin/orders', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async getOrder(orderId: string, options?: RequestOptions): Promise<AdminOrderDetail> {\n return this.client.get<AdminOrderDetail>(`/admin/orders/${orderId}`, undefined, options)\n }\n\n async forceTransitionOrder(orderId: string, status: string, note?: string, options?: RequestOptions): Promise<{ ok: true; status: string }> {\n return this.client.post<{ ok: true; status: string }>(`/admin/orders/${orderId}/transition`, { status, note }, options)\n }\n\n // ── Payouts ──\n\n async getPayoutSummary(options?: RequestOptions): Promise<{ owed: number; held: number; sent_today: number }> {\n return this.client.get<{ owed: number; held: number; sent_today: number }>('/admin/payouts/summary', undefined, options)\n }\n\n async listPayouts(params?: { status?: 'pending' | 'sent' | 'failed'; on_hold?: 0 | 1; page?: number }, options?: RequestOptions): Promise<{ data: AdminPayoutItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminPayoutItem[]; page: number; page_size: number }>('/admin/payouts', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async disbursePayout(payoutId: string, options?: RequestOptions): Promise<{ ok: true; result: unknown }> {\n return this.client.post<{ ok: true; result: unknown }>(`/admin/payouts/${payoutId}/disburse`, undefined, options)\n }\n\n // ── Reports Moderation ──\n\n async listReports(params?: { status?: 'open' | 'reviewed' | 'dismissed' | 'actioned'; type?: 'listing' | 'review' | 'store' | 'user'; page?: number }, options?: RequestOptions): Promise<{ data: AdminReport[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminReport[]; page: number; page_size: number }>('/admin/reports', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async resolveReport(reportId: string, status: 'reviewed' | 'dismissed' | 'actioned', note?: string, options?: RequestOptions): Promise<{ ok: true; status: string }> {\n return this.client.post<{ ok: true; status: string }>(`/admin/reports/${reportId}/resolve`, { status, note }, options)\n }\n\n // ── Review Moderation ──\n\n async removeReview(reviewId: string, reason?: string, options?: RequestOptions): Promise<{ ok: true; hidden: true }> {\n return this.client.post<{ ok: true; hidden: true }>(`/admin/reviews/${reviewId}/remove`, reason ? { reason } : undefined, options)\n }\n\n async reinstateReview(reviewId: string, options?: RequestOptions): Promise<{ ok: true; hidden: false }> {\n return this.client.post<{ ok: true; hidden: false }>(`/admin/reviews/${reviewId}/reinstate`, undefined, options)\n }\n\n // ── VAZI Moderation ──\n\n async listVaziOutfits(params?: { page?: number }, options?: RequestOptions): Promise<{ data: AdminVaziOutfit[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminVaziOutfit[]; page: number; page_size: number }>('/admin/vazi/outfits', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async removeVaziOutfit(outfitId: string, reason?: string, options?: RequestOptions): Promise<{ ok: true; removed: true }> {\n return this.client.post<{ ok: true; removed: true }>(`/admin/vazi/outfits/${outfitId}/remove`, reason ? { reason } : undefined, options)\n }\n\n async reinstateVaziOutfit(outfitId: string, options?: RequestOptions): Promise<{ ok: true; removed: false }> {\n return this.client.post<{ ok: true; removed: false }>(`/admin/vazi/outfits/${outfitId}/reinstate`, undefined, options)\n }\n\n // ── Operators, roles, and audit ──\n\n async listOperators(options?: RequestOptions): Promise<{ operators: AdminOperator[] }> {\n return this.client.get<{ operators: AdminOperator[] }>('/admin/operators', undefined, options)\n }\n\n async listAdminRoles(options?: RequestOptions): Promise<{ roles: AdminRolePreset[]; permissions: AdminPermissionDescription[] }> {\n return this.client.get<{ roles: AdminRolePreset[]; permissions: AdminPermissionDescription[] }>('/admin/roles', undefined, options)\n }\n\n async grantOperatorPermission(userId: string, permission: AdminPermission, options?: RequestOptions): Promise<{ ok: true; already_held: boolean }> {\n return this.client.post<{ ok: true; already_held: boolean }>(`/admin/operators/${userId}/permissions`, { permission }, options)\n }\n\n async revokeOperatorPermission(userId: string, permission: AdminPermission, options?: RequestOptions): Promise<{ ok: true; note: string }> {\n return this.client.delete<{ ok: true; note: string }>(`/admin/operators/${userId}/permissions/${encodeURIComponent(permission)}`, undefined, options)\n }\n\n async grantOperatorRole(userId: string, role: string, options?: RequestOptions): Promise<{ ok: true; role: string; granted: AdminPermission[]; already_held: AdminPermission[] }> {\n return this.client.post<{ ok: true; role: string; granted: AdminPermission[]; already_held: AdminPermission[] }>(`/admin/operators/${userId}/roles`, { role }, options)\n }\n\n async getAuditLog(limit = 100, options?: RequestOptions): Promise<{ entries: AdminAuditEntry[] }> {\n return this.client.get<{ entries: AdminAuditEntry[] }>('/admin/audit', { limit }, options)\n }\n\n // ── Payout approval ──\n\n async listPayoutsAwaitingApproval(options?: RequestOptions): Promise<{ payouts: PendingPayoutApproval[] }> {\n return this.client.get<{ payouts: PendingPayoutApproval[] }>('/admin/payouts/pending-approval', undefined, options)\n }\n\n async approvePayout(payoutId: string, options?: RequestOptions): Promise<{ ok: true; already_approved: boolean }> {\n return this.client.post<{ ok: true; already_approved: boolean }>(`/admin/payouts/${payoutId}/approve`, undefined, options)\n }\n\n async holdPayout(payoutId: string, reason: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/payouts/${payoutId}/hold`, { reason }, options)\n }\n\n /** Repair a Daraja payout whose provider reference failed to persist. */\n async repairPayoutCorrelation(payoutId: string, providerRef: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/payouts/${payoutId}/correlation`, { provider_ref: providerRef }, options)\n }\n\n // ── Wholesale moderation ──\n\n async listPendingWholesaleStores(options?: RequestOptions): Promise<{ data: AdminWholesalePendingStore[] }> {\n return this.client.get<{ data: AdminWholesalePendingStore[] }>('/admin/wholesale/pending', undefined, options)\n }\n\n async verifyWholesaleStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/wholesale/stores/${storeId}/verify`, undefined, options)\n }\n\n async unverifyWholesaleStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/wholesale/stores/${storeId}/unverify`, undefined, options)\n }\n\n // ── Broadcast ──\n\n async broadcast(input: { title: string; body: string; segment?: 'all' | 'sellers' | 'buyers' }, options?: RequestOptions): Promise<{ ok: true; segment: string; recipients: number }> {\n return this.client.post<{ ok: true; segment: string; recipients: number }>('/admin/broadcast', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Dispute, RaiseDisputeInput, RespondDisputeInput, ResolveDisputeInput, DisputeListParams, RequestOptions } from '../types'\n\nexport class DisputesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Raise a dispute on an order (buyer). */\n async raise(orderId: string, input: RaiseDisputeInput, options?: RequestOptions): Promise<{ dispute_id: string; status: 'open' }> {\n return this.client.post<{ dispute_id: string; status: 'open' }>(`/orders/${orderId}/dispute`, input, options)\n }\n\n /** Get the dispute for a specific order. */\n async getForOrder(orderId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/${orderId}/dispute`, undefined, options)\n }\n\n /** Get a dispute by ID. */\n async get(disputeId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/disputes/${disputeId}`, undefined, options)\n }\n\n /** Add evidence to a dispute. */\n async addEvidence(disputeId: string, input: { type: 'image' | 'text'; content: string }, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/orders/disputes/${disputeId}/evidence`, input, options)\n }\n\n /** Escalate a dispute to admin review (buyer). */\n async escalate(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'under_review' }> {\n return this.client.post<{ ok: true; status: 'under_review' }>(`/orders/disputes/${disputeId}/escalate`, undefined, options)\n }\n\n /** Withdraw a dispute (buyer). */\n async withdraw(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'withdrawn' }> {\n return this.client.post<{ ok: true; status: 'withdrawn' }>(`/orders/disputes/${disputeId}/withdraw`, undefined, options)\n }\n\n /** Respond to a dispute (seller). */\n async respond(disputeId: string, input: RespondDisputeInput, options?: RequestOptions): Promise<{ ok: true; status?: string; voluntary?: boolean }> {\n return this.client.post<{ ok: true; status?: string; voluntary?: boolean }>(`/orders/disputes/${disputeId}/respond`, input, options)\n }\n\n /** List all disputes (admin). */\n async list(params?: DisputeListParams, options?: RequestOptions): Promise<{ data: Dispute[]; page: number; page_size: number }> {\n return this.client.get<{ data: Dispute[]; page: number; page_size: number }>(\n '/orders/disputes',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /** Resolve a dispute (admin). */\n async resolve(disputeId: string, input: ResolveDisputeInput, options?: RequestOptions): Promise<{ ok: true; status: string; sti_impact: number }> {\n return this.client.post<{ ok: true; status: string; sti_impact: number }>(`/orders/disputes/${disputeId}/resolve`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { RequestOptions } from '../types'\n\nexport class UploadsModule {\n constructor(private readonly client: APIClient) {}\n\n /** Upload a file (avatar, evidence, etc). Returns the public CDN URL. */\n async upload(file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>('/listings/uploads', formData, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateReportInput, RequestOptions } from '../types'\n\nexport class ReportsModule {\n constructor(private readonly client: APIClient) {}\n\n /** Report a listing, review, store, or user for admin review. */\n async create(input: CreateReportInput, options?: RequestOptions): Promise<{ ok: true; already_reported?: boolean }> {\n return this.client.post<{ ok: true; already_reported?: boolean }>('/listings/reports', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n WholesaleStore, WholesaleDepot, Bale, BaleDetail, BaleFeedItem,\n CreateBaleInput, SaveWholesaleStoreInput, AddDepotInput, WholesaleFeedParams,\n BaleOrder, BaleOrderEvent, BaleOrderStatus, CreateBaleOrderInput,\n RequestOptions,\n} from '../types'\n\nexport class WholesaleModule {\n constructor(private readonly client: APIClient) {}\n\n // ── Wholesale Store ──\n\n /** Get the current user's wholesale store and depots. */\n async getWholesaleStore(options?: RequestOptions): Promise<{ store: WholesaleStore | null; depots?: WholesaleDepot[] }> {\n return this.client.get<{ store: WholesaleStore | null; depots?: WholesaleDepot[] }>('/listings/wholesale/store', undefined, options)\n }\n\n /** Create or update the wholesale store (bale_seller only). */\n async saveWholesaleStore(input: SaveWholesaleStoreInput, options?: RequestOptions): Promise<{ id: string; verified?: boolean }> {\n return this.client.post<{ id: string; verified?: boolean }>('/listings/wholesale/store', input, options)\n }\n\n /** Add a depot to the wholesale store. */\n async addDepot(input: AddDepotInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/listings/wholesale/store/depots', input, options)\n }\n\n /** Remove a depot. */\n async removeDepot(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/wholesale/store/depots/${id}`, undefined, options)\n }\n\n // ── Bales ──\n\n /** Create a bale listing (requires verified wholesale store). */\n async createBale(input: CreateBaleInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/listings/bales', input, options)\n }\n\n /** Get a bale by ID (public). */\n async getBale(id: string, options?: RequestOptions): Promise<BaleDetail> {\n return this.client.get<BaleDetail>(`/listings/bales/${id}`, undefined, options)\n }\n\n /** Update a bale. */\n async updateBale(id: string, input: Partial<CreateBaleInput>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.patch<{ ok: true }>(`/listings/bales/${id}`, input, options)\n }\n\n /** Soft-delete a bale. */\n async removeBale(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/bales/${id}`, undefined, options)\n }\n\n /** Get all bales for the current user's wholesale store. */\n async myBales(options?: RequestOptions): Promise<{ data: Bale[] }> {\n return this.client.get<{ data: Bale[] }>('/listings/wholesale/mine/bales', undefined, options)\n }\n\n // ── Feed ──\n\n /** Browse the wholesale bale feed (public). */\n async wholesaleFeed(params?: WholesaleFeedParams, options?: RequestOptions): Promise<{ data: BaleFeedItem[]; limit: number; offset: number }> {\n return this.client.get<{ data: BaleFeedItem[]; limit: number; offset: number }>(\n '/listings/wholesale/feed',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n // ── Bale Orders ──\n\n /** Create a bale order (buyer). */\n async createBaleOrder(input: CreateBaleOrderInput, options?: RequestOptions): Promise<{ id: string; total_kes: number }> {\n return this.client.post<{ id: string; total_kes: number }>('/listings/bale-orders', input, options)\n }\n\n /** Get the buyer's bale orders. */\n async myBaleOrders(options?: RequestOptions): Promise<{ data: BaleOrder[] }> {\n return this.client.get<{ data: BaleOrder[] }>('/listings/bale-orders/mine', undefined, options)\n }\n\n /** Get incoming bale orders (seller). */\n async incomingBaleOrders(options?: RequestOptions): Promise<{ data: BaleOrder[] }> {\n return this.client.get<{ data: BaleOrder[] }>('/listings/wholesale/orders', undefined, options)\n }\n\n /** Get a bale order by ID with event timeline. */\n async getBaleOrder(id: string, options?: RequestOptions): Promise<BaleOrder & { events: BaleOrderEvent[] }> {\n return this.client.get<BaleOrder & { events: BaleOrderEvent[] }>(`/listings/bale-orders/${id}`, undefined, options)\n }\n\n /** Transition a bale order status. */\n async transitionBaleOrder(id: string, action: 'confirm' | 'dispatch' | 'deliver' | 'receive', options?: RequestOptions): Promise<{ ok: true; status: BaleOrderStatus }> {\n return this.client.post<{ ok: true; status: BaleOrderStatus }>(`/listings/bale-orders/${id}/transition`, { action }, options)\n }\n}\n","export interface AuthTokens {\r\n access_token: string\r\n refresh_token: string\r\n expires_in: number\r\n}\r\n\r\nexport interface MessageResponse {\r\n message: string\r\n}\r\n\r\nexport interface EmailRegisterInput {\r\n email: string\r\n password: string // min 8 chars\r\n display_name?: string\r\n device?: string\r\n}\r\n\r\nexport interface PhoneRegisterInput {\r\n phone: string // format: +254XXXXXXXXX\r\n}\r\n\r\nexport type RegisterInput = EmailRegisterInput | PhoneRegisterInput\r\n\r\nexport interface EmailLoginInput {\r\n email: string\r\n password: string\r\n device?: string\r\n remember?: boolean\r\n}\r\n\r\nexport interface PhoneLoginInput {\r\n phone: string\r\n}\r\n\r\nexport type LoginInput = EmailLoginInput | PhoneLoginInput\r\n\r\nexport interface SendOtpInput {\r\n phone: string\r\n}\r\n\r\nexport interface VerifyOtpInput {\r\n phone: string\r\n code: string // 6 digits\r\n}\r\n\r\nexport interface ForgotPasswordInput {\r\n email: string\r\n}\r\n\r\nexport interface ResetPasswordInput {\r\n token: string\r\n password: string\r\n}\r\n\r\nexport interface CompleteOnboardingInput {\r\n display_name: string\r\n county: string\r\n phone: string\r\n}\r\n\r\nexport interface TwoFactorRequired {\r\n requires_2fa: true\r\n temp_token: string\r\n methods?: { id: string; type: TwoFactorMethodType; label: string | null }[]\r\n}\r\n\r\nexport interface Verify2FAInput {\r\n temp_token: string\r\n code: string\r\n method_id?: string\r\n}\r\n\r\nexport const TWO_FACTOR_METHOD_TYPES = ['totp', 'sms', 'email', 'passkey'] as const\r\nexport type TwoFactorMethodType = typeof TWO_FACTOR_METHOD_TYPES[number]\r\n\r\nexport interface TwoFactorMethod {\r\n id: string\r\n type: TwoFactorMethodType\r\n label: string | null\r\n enabled: boolean\r\n is_primary: boolean\r\n verified_at: string | null\r\n created_at: string\r\n last_used_at: string | null\r\n}\r\n\r\nexport interface Add2FAMethodInput {\r\n type: TwoFactorMethodType\r\n label?: string\r\n target?: string\r\n}\r\n\r\nexport interface Add2FAMethodResult {\r\n id: string\r\n otpauth_uri?: string\r\n secret?: string\r\n}\r\n\r\n/** WebAuthn L2 JSON — options returned by the server for navigator.credentials.create() */\r\nexport interface PublicKeyCredentialCreationOptionsJSON {\r\n rp: { name: string; id?: string }\r\n user: { id: string; name: string; displayName: string }\r\n challenge: string\r\n pubKeyCredParams: { type: string; alg: number }[]\r\n timeout?: number\r\n excludeCredentials?: { id: string; type: string; transports?: string[] }[]\r\n authenticatorSelection?: { authenticatorAttachment?: string; residentKey?: string; requireResidentKey?: boolean; userVerification?: string }\r\n attestation?: string\r\n extensions?: Record<string, unknown>\r\n}\r\n\r\n/** WebAuthn L2 JSON — the browser's response from navigator.credentials.create() */\r\nexport interface RegistrationResponseJSON {\r\n id: string\r\n rawId: string\r\n response: { clientDataJSON: string; attestationObject: string; transports?: string[] }\r\n type: string\r\n clientExtensionResults?: Record<string, unknown>\r\n authenticatorAttachment?: string\r\n}\r\n\r\n/** WebAuthn L2 JSON — options returned by the server for navigator.credentials.get() */\r\nexport interface PublicKeyCredentialRequestOptionsJSON {\r\n challenge: string\r\n timeout?: number\r\n rpId?: string\r\n allowCredentials?: { id: string; type: string; transports?: string[] }[]\r\n userVerification?: string\r\n extensions?: Record<string, unknown>\r\n}\r\n\r\n/** WebAuthn L2 JSON — the browser's response from navigator.credentials.get() */\r\nexport interface AuthenticationResponseJSON {\r\n id: string\r\n rawId: string\r\n response: { clientDataJSON: string; authenticatorData: string; signature: string; userHandle?: string }\r\n type: string\r\n clientExtensionResults?: Record<string, unknown>\r\n authenticatorAttachment?: string\r\n}\r\n\r\nexport type BusinessType = 'individual' | 'business'\r\nexport type SellerType = 'retail' | 'bale'\r\n\r\nexport interface BecomeSellerInput {\r\n business_type?: BusinessType\r\n /** @deprecated Use business_type instead */\r\n seller_type?: 'individual' | 'business'\r\n sti_score?: number\r\n business_name?: string\r\n id_number?: string\r\n kra_pin?: string\r\n phone?: string\r\n county?: string\r\n town?: string\r\n categories?: string[]\r\n condition_grades?: string[]\r\n delivery_method?: 'self' | 'mitumba-logistics'\r\n price_range_min?: number\r\n price_range_max?: number\r\n}\r\n\r\nexport interface BecomeBaleSellerInput {\r\n business_type?: BusinessType\r\n business_name?: string\r\n kra_pin?: string\r\n id_number?: string\r\n phone?: string\r\n county?: string\r\n}\r\n\r\nexport interface UserProfile {\r\n id: string\r\n email: string | null\r\n phone: string | null\r\n display_name: string | null\r\n city_id: string | null\r\n county: string | null\r\n bio: string | null\r\n avatar_url: string | null\r\n onboarding_completed: boolean\r\n email_verified: boolean\r\n totp_enabled: boolean\r\n totp_configured: boolean\r\n two_factor_methods_count?: number\r\n sms_2fa_available?: boolean\r\n email_2fa_available?: boolean\r\n /** Unused backup codes left. */\r\n backup_codes_remaining?: number\r\n /** True at two or fewer, while a verified second factor exists. */\r\n backup_codes_low?: boolean\r\n /** Explicit admin grants, whether or not they currently reach the token. */\r\n admin_permissions?: import('./admin').AdminPermission[]\r\n /** Grants exist but are withheld until a second factor is verified. */\r\n admin_enrolment_required?: boolean\r\n is_active: boolean\r\n created_at: string\r\n roles: string[]\r\n}\r\n\r\n\r\n// ── Public capabilities, backup-code lifecycle, and assisted recovery ─────────\r\n\r\nexport interface AuthCapabilities {\r\n sms_otp_enabled: boolean\r\n email_2fa_enabled: boolean\r\n password_min_length: number\r\n}\r\n\r\nexport interface RegenerateBackupCodesResult {\r\n /** Shown once. Never persisted by the SDK. */\r\n backup_codes: string[]\r\n remaining: number\r\n}\r\n\r\nexport type RecoveryStatus = 'none' | 'pending' | 'approved'\r\n\r\nexport interface RequestRecoveryInput {\r\n temp_token: string\r\n reason?: string\r\n}\r\n\r\nexport interface RequestRecoveryResult {\r\n id: string\r\n status: 'pending' | 'approved'\r\n cooling_off_hours: number\r\n payout_freeze_days?: number\r\n hours_remaining?: number | null\r\n already_open: boolean\r\n}\r\n\r\nexport interface RecoveryStatusResult {\r\n status: RecoveryStatus\r\n id?: string\r\n cooling_off_hours: number\r\n payout_freeze_days?: number\r\n hours_remaining?: number | null\r\n can_complete?: boolean\r\n}\r\n\r\nexport interface CompleteRecoveryResult extends AuthTokens {\r\n /** Shown once. Never persisted by the SDK. */\r\n backup_codes: string[]\r\n payout_frozen_until: string\r\n payout_freeze_days: number\r\n}\r\n\r\nexport interface AdminRecoveryRequest {\r\n id: string\r\n user_id: string\r\n email: string\r\n status: 'pending' | 'approved' | 'rejected' | 'cancelled' | 'completed'\r\n reason: string | null\r\n requested_ip: string | null\r\n reviewed_by: string | null\r\n reviewed_at: string | null\r\n review_note: string | null\r\n effective_at: string | null\r\n completed_at: string | null\r\n created_at: string\r\n}\r\n\r\nexport interface AdminRecoveryEvent {\r\n id: string\r\n event: string\r\n actor_id: string | null\r\n detail: string | null\r\n created_at: string\r\n}\r\n\nexport interface RootSetupInput {\n email: string\n password: string\n /** One-time bootstrap secret, removed from the Worker immediately after setup. */\n setup_secret: string\n}\n\nexport interface RootSetupResult {\n ok: true\n permissions: import('./admin').AdminPermission[]\n next_step: string\n}\n","export const CONDITIONS = ['new', 'like_new', 'good', 'fair'] as const\nexport type Condition = typeof CONDITIONS[number]\n\nexport const LISTING_STATUSES = ['draft', 'active', 'sold', 'removed'] as const\nexport type ListingStatus = typeof LISTING_STATUSES[number]\n\nexport interface ListingImage {\n id: string\n listing_id: string\n url: string\n position: number\n created_at: string\n}\n\nexport interface SellerProfile {\n id: string\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n}\n\nexport interface Listing {\n id: string\n seller_id: string\n title: string\n description: string | null\n category_id: string\n city_id: string\n price: number // KES integer\n condition: Condition\n status: ListingStatus\n photo_verified: boolean\n vazi_eligible: boolean\n size: string | null\n created_at: string\n updated_at: string\n // Seller profile (joined)\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n // Images (only present on GET /listings/:id, not in feed)\n images?: ListingImage[]\n // First image as full CDN URL (present in feeds/store listings)\n image_url?: string | null\n // All image CDN URLs ordered by position (present in feeds)\n media?: string[]\n}\n\nexport interface ListingsFeedParams {\n city_id?: string\n category_id?: string\n min_price?: number\n max_price?: number\n condition?: Condition\n sort?: 'recency' | 'price_asc' | 'price_desc'\n page?: number\n page_size?: number\n}\n\nexport interface CreateListingInput {\n store_id: string\n title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\n size?: string\n vazi_eligible?: boolean\n}\n\nexport type UpdateListingInput = Partial<CreateListingInput>\n\nexport interface Category {\n id: string\n name: string\n slug: string\n}\n\nexport interface City {\n id: string\n name: string\n delivery_fee: number\n}\n\nexport interface SellerStorefront {\n seller: SellerProfile\n listings: Listing[]\n total: number\n page: number\n page_size: number\n has_more: boolean\n}\n\nexport interface PresignImageResponse {\n r2_key: string\n image_id: string\n}\n\nexport interface SimilarListing {\n id: string\n title: string\n price: number\n condition: string\n category_id: string\n store_id: string | null\n image_keys: string | null\n created_at: string\n}\n","export const ORDER_STATUSES = [\n 'created',\n 'payment_pending',\n 'paid',\n 'seller_confirmed',\n 'shipped',\n 'delivered',\n 'completed',\n 'cancelled',\n 'disputed',\n] as const\n\nexport type OrderStatus = typeof ORDER_STATUSES[number]\n\nexport interface OrderEvent {\n id: string\n order_id: string\n actor: string // user ID or 'system'\n old_status: string\n new_status: string\n note: string | null\n created_at: string\n}\n\nexport interface DeliveryAddress {\n label: string\n line1: string\n city: string\n county: string\n phone: string\n}\n\nexport interface Order {\n id: string\n buyer_id: string\n seller_id: string\n listing_id: string\n amount: number\n delivery_fee: number\n total: number\n status: OrderStatus\n city_id: string\n created_at: string\n updated_at: string\n // Joined listing details\n listing_title: string | null\n listing_image_url: string | null\n listing_condition: string | null\n listing_size: string | null\n // Joined buyer details\n buyer_name: string | null\n buyer_phone: string | null\n // Buyer's default delivery address\n delivery_address: DeliveryAddress | null\n events?: OrderEvent[]\n}\n\nexport interface CreateOrderInput {\n listing_id: string\n}\n\nexport interface TransitionOrderInput {\n status: OrderStatus\n note?: string\n}\n\nexport interface OrderHistoryParams {\n role?: 'buyer' | 'seller'\n store_id?: string\n page?: number\n}\n","import type { OrderStatus } from './orders'\nimport type { BaleOrderStatus } from './wholesale'\n\nexport interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport type MpesaInput = StkPushInput\n\nexport interface StkPushResponse {\n payment_id: string\n provider: string\n}\n\nexport interface PaystackInput {\n order_id: string\n email: string\n}\n\nexport interface PaystackInitResponse {\n access_code: string\n authorization_url: string\n reference: string\n}\n\nexport const PAYMENT_STATUSES = ['initiated', 'funded', 'failed', 'refunded', 'cancelled'] as const\nexport type PaymentStatus = typeof PAYMENT_STATUSES[number]\n\nexport interface PaymentStatusResponse {\n id: string\n status: PaymentStatus\n total: number\n}\n\nexport type KnownPaymentProvider =\n | 'daraja'\n | 'intasend'\n | 'paystack'\n | 'airtel'\n\nexport type ProviderId = KnownPaymentProvider | (string & {})\n\nexport type PaymentProvider = ProviderId\n\nexport type CheckoutPaymentMethod =\n | { type: 'mobile_money'; phone: string }\n | { type: 'card' }\n\nexport interface InitiateCheckoutInput {\n order_id: string\n idempotency_key: string\n method: CheckoutPaymentMethod\n}\n\nexport type CheckoutNextAction =\n | { type: 'await_confirmation' }\n | { type: 'redirect'; url: string; expires_at: string | null }\n\nexport interface InitiateCheckoutResponse {\n version: 1\n order_id: string\n attempt: {\n id: string\n sequence: number\n provider: ProviderId\n status: 'initiated'\n }\n next_action: CheckoutNextAction\n}\n\nexport type PaymentAttemptStatus = 'initiated' | 'funded' | 'failed' | 'refunded' | 'cancelled'\n\nexport type CheckoutStatus = 'pending' | 'paid' | 'failed' | 'cancelled' | 'refunded'\n\nexport type CheckoutOrder =\n | { type: 'retail'; status: OrderStatus }\n | { type: 'bale'; status: BaleOrderStatus }\n\nexport interface CheckoutStatusResponse {\n version: 1\n order_id: string\n order: CheckoutOrder\n checkout_status: CheckoutStatus\n terminal: boolean\n retryable: boolean\n amount: {\n currency: 'KES'\n minor_units: number\n }\n latest_attempt: {\n id: string\n sequence: number\n provider: PaymentProvider\n status: PaymentAttemptStatus\n terminal: boolean\n created_at: string\n updated_at: string\n } | null\n attempt_count: number\n order_updated_at: string\n status_updated_at: string\n server_time: string\n poll_after_ms: number\n}\n","export const DISPUTE_REASONS = ['not_received', 'not_as_described', 'damaged', 'counterfeit', 'wrong_item'] as const\nexport type DisputeReason = typeof DISPUTE_REASONS[number]\n\nexport const DESIRED_RESOLUTIONS = ['refund', 'replacement', 'partial_refund'] as const\nexport type DesiredResolution = typeof DESIRED_RESOLUTIONS[number]\n\nexport const DISPUTE_STATUSES = ['open', 'seller_responded', 'under_review', 'resolved_refund', 'resolved_release', 'resolved_partial', 'withdrawn'] as const\nexport type DisputeStatus = typeof DISPUTE_STATUSES[number]\n\nexport interface DisputeEvidence {\n id: string\n uploader_role: 'buyer' | 'seller' | 'admin'\n type: 'image' | 'text'\n content: string\n created_at: string\n}\n\nexport interface DisputeEvent {\n actor_role: 'buyer' | 'seller' | 'admin' | 'system'\n action: string\n old_status: string | null\n new_status: string | null\n note: string | null\n created_at: string\n}\n\nexport interface Dispute {\n id: string\n order_id: string\n buyer_id: string\n seller_id: string\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n status: DisputeStatus\n amount_disputed: number\n resolution: 'refund' | 'release' | 'partial' | null\n resolution_amount: number | null\n resolution_note: string | null\n sti_impact: number | null\n seller_responded_at: string | null\n escalated_at: string | null\n resolved_at: string | null\n created_at: string\n updated_at: string\n evidence?: DisputeEvidence[]\n events?: DisputeEvent[]\n}\n\nexport interface RaiseDisputeInput {\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n evidence_urls?: string[]\n}\n\nexport interface RespondDisputeInput {\n accept: boolean\n message?: string\n evidence_urls?: string[]\n}\n\nexport interface ResolveDisputeInput {\n resolution: 'refund' | 'release' | 'partial'\n amount?: number\n note?: string\n}\n\nexport interface DisputeListParams {\n status?: DisputeStatus\n page?: number\n}\n","export type BaleGrade = 'Cream' | 'A' | 'B' | 'C'\nexport type BaleType = 'original' | 'sorted'\n\nexport interface WholesaleStore {\n id: string\n name: string\n slug: string\n tagline: string | null\n description: string | null\n logo_url: string | null\n origins: string[]\n verified: boolean\n}\n\nexport interface WholesaleDepot {\n id: string\n name: string\n address: string | null\n city_id: string | null\n is_primary: boolean\n}\n\nexport interface Bale {\n id: string\n store_id: string\n seller_id: string\n title: string\n category: string\n grade: BaleGrade\n bale_type: BaleType\n weight_kg: number\n origin: string | null\n est_pieces: number | null\n price_kes: number\n moq: number\n mix: string | null\n description: string | null\n city_id: string | null\n status: 'draft' | 'active' | 'sold_out'\n created_at: string\n}\n\nexport interface BaleDetail extends Bale {\n images: string[]\n store: { name: string; slug: string; verified: boolean; sti: number | null }\n}\n\nexport interface CreateBaleInput {\n title: string\n category: string\n grade: BaleGrade\n bale_type?: BaleType\n weight_kg: number\n origin?: string\n est_pieces?: number\n price_kes: number\n moq?: number\n mix?: string\n description?: string\n city_id?: string\n status?: 'draft' | 'active' | 'sold_out'\n}\n\nexport interface WholesaleFeedParams {\n q?: string\n category?: string\n grade?: BaleGrade\n origin?: string\n city_id?: string\n limit?: number\n offset?: number\n}\n\nexport interface BaleFeedItem extends Bale {\n image_url: string | null\n store: { name: string; slug: string; verified: boolean; sti: number | null }\n}\n\nexport interface SaveWholesaleStoreInput {\n name: string\n tagline?: string\n description?: string\n logo_url?: string\n origins?: string[]\n}\n\nexport interface AddDepotInput {\n name: string\n address?: string\n city_id?: string\n is_primary?: boolean\n}\n\n// ── Bale Orders ──\n\nexport const BALE_ORDER_STATUSES = ['pending_payment', 'paid', 'confirmed', 'in_transit', 'delivered', 'completed', 'cancelled'] as const\nexport type BaleOrderStatus = typeof BALE_ORDER_STATUSES[number]\n\nexport type BaleFulfillment = 'pickup' | 'courier'\n\nexport interface BaleOrder {\n id: string\n bale_id: string\n buyer_id: string\n seller_id: string\n store_id: string\n title: string\n grade: string\n origin: string | null\n image_url: string | null\n qty: number\n unit_kes: number\n total_kes: number\n fulfillment: BaleFulfillment\n freight_kes: number | null\n status: BaleOrderStatus\n city_id: string | null\n buyer_name: string | null\n store_name: string | null\n created_at: string\n}\n\nexport interface BaleOrderEvent {\n actor: string\n old_status: string | null\n new_status: string\n note: string | null\n created_at: string\n}\n\nexport interface CreateBaleOrderInput {\n bale_id: string\n qty?: number\n fulfillment: BaleFulfillment\n}\n","/**\n * Canonical go.mitumba.africa share URLs — the one place clients build listing, store and bale share links.\n *\n * Forms follow Mitumba-Ltd/mitumba-links `docs/product/share-urls.md`: `/l/{listingId}`, `/s/{storeSlug}` and\n * `/b/{baleId}` with no slug, query or fragment. Pure functions: no network access, safe in any runtime.\n */\n\nexport const DEFAULT_SHARE_ORIGIN = 'https://go.mitumba.africa'\n\nexport interface ShareUrlOptions {\n /**\n * Override the share origin, e.g. a staging Worker. Must be an `https://` origin (no path, query or\n * credentials); `http://localhost` / `http://127.0.0.1` are allowed for local development.\n * Defaults to {@link DEFAULT_SHARE_ORIGIN}.\n */\n origin?: string\n}\n\nconst ID_PATTERN = /^[0-9a-f]{32}$/\nconst SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n\nfunction resolveOrigin(origin: string | undefined): string {\n if (origin === undefined) return DEFAULT_SHARE_ORIGIN\n let url: URL\n try {\n url = new URL(origin)\n } catch {\n throw new TypeError(`Invalid share origin: ${origin}`)\n }\n const local = url.protocol === 'http:' && (url.hostname === 'localhost' || url.hostname === '127.0.0.1')\n if ((url.protocol !== 'https:' && !local) || url.username || url.password) {\n throw new TypeError(`Share origin must be https:// (or http://localhost): ${origin}`)\n }\n if ((url.pathname !== '/' && url.pathname !== '') || url.search || url.hash) {\n throw new TypeError(`Share origin must not include a path, query or fragment: ${origin}`)\n }\n return url.origin\n}\n\nfunction identifier(kind: string, value: string): string {\n const normalized = typeof value === 'string' ? value.trim().toLowerCase() : ''\n if (!ID_PATTERN.test(normalized)) throw new TypeError(`Invalid ${kind} ID: ${String(value)}`)\n return normalized\n}\n\n/** `https://go.mitumba.africa/l/{listingId}` */\nexport function listingShareUrl(listingId: string, options: ShareUrlOptions = {}): string {\n return `${resolveOrigin(options.origin)}/l/${encodeURIComponent(identifier('listing', listingId))}`\n}\n\n/** `https://go.mitumba.africa/s/{storeSlug}` */\nexport function storeShareUrl(storeSlug: string, options: ShareUrlOptions = {}): string {\n const slug = typeof storeSlug === 'string' ? storeSlug.trim().toLowerCase() : ''\n if (slug.length > 64 || !SLUG_PATTERN.test(slug)) throw new TypeError(`Invalid store slug: ${String(storeSlug)}`)\n return `${resolveOrigin(options.origin)}/s/${encodeURIComponent(slug)}`\n}\n\n/** `https://go.mitumba.africa/b/{baleId}` */\nexport function baleShareUrl(baleId: string, options: ShareUrlOptions = {}): string {\n return `${resolveOrigin(options.origin)}/b/${encodeURIComponent(identifier('bale', baleId))}`\n}\n","import { APIClient } from './client'\nimport { MitumbaClientConfig } from './types'\nimport { AuthModule } from './modules/auth'\nimport { ListingsModule } from './modules/listings'\nimport { SearchModule } from './modules/search'\nimport { OrdersModule } from './modules/orders'\nimport { PayModule } from './modules/pay'\nimport { VaziModule } from './modules/vazi'\nimport { MessagesModule } from './modules/messages'\nimport { NotificationsModule } from './modules/notifications'\nimport { StoresModule } from './modules/stores'\nimport { ReviewsModule } from './modules/reviews'\nimport { WishlistsModule } from './modules/wishlists'\nimport { CartModule } from './modules/cart'\nimport { SettingsModule } from './modules/settings'\nimport { MailerModule } from './modules/mailer'\nimport { BusinessesModule } from './modules/businesses'\nimport { AdminModule } from './modules/admin'\nimport { DisputesModule } from './modules/disputes'\nimport { UploadsModule } from './modules/uploads'\nimport { ReportsModule } from './modules/reports'\nimport { WholesaleModule } from './modules/wholesale'\n\nexport class MitumbaClient {\n public readonly api: APIClient\n public readonly auth: AuthModule\n public readonly listings: ListingsModule\n public readonly search: SearchModule\n public readonly orders: OrdersModule\n public readonly pay: PayModule\n public readonly vazi: VaziModule\n public readonly messages: MessagesModule\n public readonly notifications: NotificationsModule\n public readonly stores: StoresModule\n public readonly reviews: ReviewsModule\n public readonly wishlists: WishlistsModule\n public readonly cart: CartModule\n public readonly settings: SettingsModule\n public readonly mailer: MailerModule\n public readonly businesses: BusinessesModule\n public readonly admin: AdminModule\n public readonly disputes: DisputesModule\n public readonly uploads: UploadsModule\n public readonly reports: ReportsModule\n public readonly wholesale: WholesaleModule\n\n constructor(config: MitumbaClientConfig) {\n this.api = new APIClient(config)\n this.auth = new AuthModule(this.api)\n this.listings = new ListingsModule(this.api)\n this.search = new SearchModule(this.api)\n this.orders = new OrdersModule(this.api)\n this.pay = new PayModule(this.api)\n this.vazi = new VaziModule(this.api)\n this.messages = new MessagesModule(this.api)\n this.notifications = new NotificationsModule(this.api)\n this.stores = new StoresModule(this.api)\n this.reviews = new ReviewsModule(this.api)\n this.wishlists = new WishlistsModule(this.api)\n this.cart = new CartModule(this.api)\n this.settings = new SettingsModule(this.api)\n this.mailer = new MailerModule(this.api)\n this.businesses = new BusinessesModule(this.api)\n this.admin = new AdminModule(this.api)\n this.disputes = new DisputesModule(this.api)\n this.uploads = new UploadsModule(this.api)\n this.reports = new ReportsModule(this.api)\n this.wholesale = new WholesaleModule(this.api)\n }\n\n /**\n * Set the access token for authenticated requests.\n * Optionally pass a refresh token to enable automatic token rotation.\n */\n public setToken(token: string, refreshToken?: string) {\n this.api.setToken(token, refreshToken)\n }\n\n /**\n * Set both tokens explicitly. Preferred — prevents dropping the refresh token.\n */\n public setSession(tokens: { access_token: string; refresh_token: string }) {\n return this.api.setSession(tokens)\n }\n\n /**\n * Get the current access token.\n */\n public getToken(): string | undefined {\n return this.api.getToken()\n }\n\n /**\n * Clear the current tokens.\n */\n public clearToken() {\n this.api.clearToken()\n }\n\n /**\n * Hydrate tokens from persistent store (call on app boot).\n */\n public hydrate(): Promise<void> {\n return this.api.hydrate()\n }\n\n /**\n * Check if user has a stored session.\n */\n public isAuthenticated(): Promise<boolean> {\n return this.api.isAuthenticated()\n }\n}\n\nexport * from './types'\nexport { APIClient, APIError } from './client'\nexport { MemoryTokenStore, IDBTokenStore, createTokenStore } from './token-store'\nexport type { TokenStore } from './token-store'\nexport { AuthModule } from './modules/auth'\nexport { ListingsModule } from './modules/listings'\nexport { SearchModule } from './modules/search'\nexport { OrdersModule } from './modules/orders'\nexport { PayModule } from './modules/pay'\nexport { VaziModule } from './modules/vazi'\nexport { MessagesModule } from './modules/messages'\nexport { NotificationsModule } from './modules/notifications'\nexport { StoresModule } from './modules/stores'\nexport { ReviewsModule } from './modules/reviews'\nexport { WishlistsModule } from './modules/wishlists'\nexport { CartModule } from './modules/cart'\nexport { SettingsModule } from './modules/settings'\nexport { MailerModule } from './modules/mailer'\nexport { BusinessesModule } from './modules/businesses'\nexport { AdminModule } from './modules/admin'\nexport { DisputesModule } from './modules/disputes'\nexport { UploadsModule } from './modules/uploads'\nexport { ReportsModule } from './modules/reports'\nexport { WholesaleModule } from './modules/wholesale'\n\nexport { DEFAULT_SHARE_ORIGIN, listingShareUrl, storeShareUrl, baleShareUrl } from './share'\nexport type { ShareUrlOptions } from './share'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/messages-v2.ts","../src/token-store.ts","../src/client.ts","../src/modules/auth.ts","../src/modules/listings.ts","../src/modules/search.ts","../src/modules/orders.ts","../src/modules/pay.ts","../src/modules/vazi.ts","../src/realtime/messages-realtime.ts","../src/modules/messages.ts","../src/modules/notifications.ts","../src/modules/stores.ts","../src/modules/reviews.ts","../src/modules/wishlists.ts","../src/modules/cart.ts","../src/modules/settings.ts","../src/modules/mailer.ts","../src/modules/businesses.ts","../src/modules/admin.ts","../src/modules/disputes.ts","../src/modules/uploads.ts","../src/modules/reports.ts","../src/modules/wholesale.ts","../src/types/auth.ts","../src/types/listings.ts","../src/types/orders.ts","../src/types/pay.ts","../src/types/disputes.ts","../src/types/wholesale.ts","../src/share.ts","../src/index.ts"],"names":["decoded","isRecord"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { APIError } from '../client'\n\n/** Stable opaque identifier for one buyer/store conversation. */\nexport type ConversationId = string\n\n/** Stable opaque identifier for one General, Listing, or Order thread. */\nexport type ThreadId = string\n\n/** Stable opaque identifier for one human-authored message. */\nexport type MessageId = string\n\n/** Stable opaque identifier for a message or system event in a thread timeline. */\nexport type ThreadTimelineItemId = string\n\n/** Opaque server-issued cursor whose contents clients must not interpret. */\nexport type MessagingCursor = string\n\n/** Explicit identity under which an authenticated human accesses messaging resources. */\nexport type MessagingPerspective =\n | {\n /** Act as the authenticated buyer. */\n kind: 'buyer'\n }\n | {\n /** Act as an authorized representative of one store. */\n kind: 'store'\n /** Store represented by this request. */\n store_id: string\n }\n\n/** Versioned success envelope returned by every Messaging v2 resource operation. */\nexport interface ApiResponse<T> {\n /** Public messaging API version. */\n api_version: 2\n /** Typed operation result. */\n data: T\n}\n\n/** Cursor-paged resource collection. */\nexport interface CursorPage<T> {\n /** Resources in server-defined deterministic order. */\n items: T[]\n /** Cursor for the next page, or null when no next page exists. */\n next_cursor: MessagingCursor | null\n /** Whether another page exists after this page. */\n has_more: boolean\n}\n\n/** Recipient-safe buyer identity snapshot. */\nexport interface BuyerSummary {\n /** Stable buyer account identifier. */\n id: string\n /** Current buyer display name, when configured. */\n display_name: string | null\n /** Current buyer avatar URL, when configured. */\n avatar_url: string | null\n}\n\n/** Recipient-safe store identity snapshot. */\nexport interface StoreSummary {\n /** Stable store identifier. */\n id: string\n /** Current store display name. */\n name: string\n /** Current canonical store slug. */\n slug: string\n /** Current store logo URL, when configured. */\n logo_url: string | null\n}\n\n/** Immutable thread subject snapshot for General, Listing, or Order context. */\nexport type ThreadSubject =\n | {\n /** General buyer/store conversation subject. */\n kind: 'general'\n }\n | {\n /** Listing inquiry subject. */\n kind: 'listing'\n /** Listing represented by this thread. */\n listing_id: string\n /** Snapshotted listing title. */\n title: string\n /** Snapshotted listing image URL, when available. */\n image_url: string | null\n /** Current coarse listing availability. */\n availability: 'active' | 'sold' | 'inactive' | 'unknown'\n }\n | {\n /** Order support subject. */\n kind: 'order'\n /** Order represented by this thread. */\n order_id: string\n /** Human-readable short order identifier. */\n short_id: string\n /** Snapshotted listing title associated with the order. */\n listing_title: string\n /** Snapshotted listing image URL, when available. */\n image_url: string | null\n /** Current canonical order status. */\n order_status: string\n }\n\n/** Public message author identity without private store-operator identity. */\nexport type MessageAuthor =\n | {\n /** Message was authored from the buyer perspective. */\n side: 'buyer'\n /** Recipient-safe buyer identity. */\n buyer: BuyerSummary\n }\n | {\n /** Message was authored from the store perspective. */\n side: 'store'\n /** Recipient-safe store identity; human operator identity is intentionally omitted. */\n store: StoreSummary\n }\n\n/** Safe attachment metadata associated with a committed message. */\nexport interface MessageAttachment {\n /** Stable attachment identifier. */\n id: string\n /** Attachment presentation category. */\n kind: 'image' | 'file'\n /** Sanitized original file name. */\n file_name: string\n /** Validated media type. */\n content_type: string\n /** Validated byte size. */\n size_bytes: number\n}\n\n/** Canonical immutable human-authored message. */\nexport interface ThreadMessage {\n /** Stable message identifier. */\n id: MessageId\n /** Thread containing this message. */\n thread_id: ThreadId\n /** Monotonic order within the thread timeline. */\n sequence: number\n /** Explicit public author side and identity. */\n author: MessageAuthor\n /** Canonical message body after server policy processing. */\n body: string\n /** Same-thread quote snapshot, or null when the message is not a reply. */\n reply_to: {\n /** Quoted message identifier. */\n message_id: MessageId\n /** Recipient-safe author label captured for the quote. */\n author_name: string\n /** Immutable safe excerpt captured for the quote. */\n excerpt: string\n } | null\n /** Safe committed attachments; empty for text-only messages. */\n attachments: MessageAttachment[]\n /** Caller-owned idempotency identifier echoed for reconciliation, when supplied. */\n client_message_id: string | null\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n}\n\n/** Server-authored event linking a Listing thread and its related Order thread. */\nexport interface ThreadSystemEvent {\n /** Stable timeline-item identifier. */\n id: ThreadTimelineItemId\n /** Thread containing this system event. */\n thread_id: ThreadId\n /** Monotonic order within the thread timeline. */\n sequence: number\n /** System-event discriminator. */\n kind: 'thread.linked'\n /** Stable identifier shared by the paired link events. */\n relation_id: string\n /** Direction and correctly correlated related thread snapshot. */\n link:\n | {\n /** This Listing thread links forward to an Order thread. */\n direction: 'listing_to_order'\n /** Related Order thread. */\n related_thread: {\n /** Stable related thread identifier. */\n id: ThreadId\n /** Related thread kind. */\n kind: 'order'\n /** Correlated Order subject snapshot. */\n subject: Extract<ThreadSubject, { kind: 'order' }>\n }\n }\n | {\n /** This Order thread links back to a Listing thread. */\n direction: 'order_to_listing'\n /** Related Listing thread. */\n related_thread: {\n /** Stable related thread identifier. */\n id: ThreadId\n /** Related thread kind. */\n kind: 'listing'\n /** Correlated Listing subject snapshot. */\n subject: Extract<ThreadSubject, { kind: 'listing' }>\n }\n }\n /** Recipient-facing event label. */\n label: string\n /** Perspectives for which this event contributes to unread state. */\n notify_sides: Array<'buyer' | 'store'>\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n}\n\n/** Ordered item in a thread timeline. */\nexport type ThreadTimelineItem =\n | {\n /** Human-message timeline item. */\n kind: 'message'\n /** Canonical message. */\n message: ThreadMessage\n }\n | {\n /** Server system-event timeline item. */\n kind: 'system'\n /** Canonical system event. */\n event: ThreadSystemEvent\n }\n\n/** Shared support lifecycle for Listing and Order threads. */\ntype ThreadStatus = 'open' | 'resolved'\n\n/** Perspective-private presentation preferences for one thread. */\ninterface ThreadPreferences {\n /** Whether the current perspective archived this thread. */\n archived: boolean\n /** Whether the current perspective pinned this thread. */\n pinned: boolean\n /** Whether the current perspective muted this thread. */\n muted: boolean\n}\n\n/** Perspective-private presentation preferences for one conversation. */\ninterface ConversationPreferences {\n /** Whether the current perspective archived this conversation. */\n archived: boolean\n /** Whether the current perspective muted this conversation. */\n muted: boolean\n}\n\ntype ThreadCardBase = {\n /** Stable thread identifier. */\n id: ThreadId\n /** Stable parent conversation identifier. */\n conversation_id: ConversationId\n /** Shared support status, independent of commerce status. */\n status: ThreadStatus\n /** Private preferences for the selected perspective. */\n preferences: ThreadPreferences\n /** Latest human-authored message, or null before the first message. */\n last_message: ThreadMessage | null\n /** Exact unread timeline-item count for the selected perspective. */\n unread_count: number\n /** UTC ISO 8601 timestamp of latest thread activity. */\n last_activity_at: string\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n /** UTC ISO 8601 last-update timestamp. */\n updated_at: string\n}\n\n/** Thread-card summary with kind and subject correlated at compile time. */\nexport type ThreadCard =\n | (ThreadCardBase & {\n /** General thread card. */\n kind: 'general'\n /** Correlated General subject. */\n subject: Extract<ThreadSubject, { kind: 'general' }>\n })\n | (ThreadCardBase & {\n /** Listing inquiry thread card. */\n kind: 'listing'\n /** Correlated Listing subject. */\n subject: Extract<ThreadSubject, { kind: 'listing' }>\n })\n | (ThreadCardBase & {\n /** Order support thread card. */\n kind: 'order'\n /** Correlated Order subject. */\n subject: Extract<ThreadSubject, { kind: 'order' }>\n })\n\n/** Buyer/store conversation summary containing no loose messages. */\nexport interface ConversationSummary {\n /** Stable all-time buyer/store conversation identifier. */\n id: ConversationId\n /** Buyer in this relationship. */\n buyer: BuyerSummary\n /** Store in this relationship. */\n store: StoreSummary\n /** Most recently active thread, or null when no thread has activity. */\n last_thread: ThreadCard | null\n /** Exact aggregate unread count for the selected perspective. */\n unread_count: number\n /** UTC ISO 8601 timestamp of latest child-thread activity. */\n last_activity_at: string\n /** Private preferences for the selected perspective. */\n preferences: ConversationPreferences\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n /** UTC ISO 8601 last-update timestamp. */\n updated_at: string\n}\n\n/** Idempotent conversation/thread resolution result. */\nexport interface ResolveThreadResult {\n /** Resolved all-time buyer/store conversation. */\n conversation: ConversationSummary\n /** Resolved singleton context thread. */\n thread: ThreadCard\n /** Whether either resource was created by this resolution. */\n created: {\n /** Whether the conversation was created. */\n conversation: boolean\n /** Whether the thread was created. */\n thread: boolean\n }\n}\n\n/** Newest, older, or catch-up window of ascending thread timeline items. */\nexport interface MessagePage {\n /** Timeline items ordered by ascending sequence. */\n items: ThreadTimelineItem[]\n /** Cursor for older history, or null at the beginning. */\n older_cursor: MessagingCursor | null\n /** Cursor for newer catch-up, or null at the live edge. */\n newer_cursor: MessagingCursor | null\n /** Whether older history exists. */\n has_older: boolean\n /** Whether newer history exists. */\n has_newer: boolean\n}\n\n/** Authoritative monotonic read-cursor result. */\nexport interface ReadCursorResult {\n /** Thread whose cursor was evaluated. */\n thread_id: ThreadId\n /** Last committed visible message or system-event identifier. */\n last_read_item_id: ThreadTimelineItemId\n /** Monotonic sequence of the last read item. */\n last_read_sequence: number\n /** Whether this request advanced the cursor. */\n changed: boolean\n /** UTC ISO 8601 cursor-update timestamp. */\n updated_at: string\n}\n\n/** Buyer-authorized input for idempotent thread resolution. */\nexport type BuyerResolveThreadInput =\n | {\n /** Resolve the General thread for a store. */\n kind: 'general'\n /** Store to contact. */\n store_id: string\n }\n | {\n /** Resolve a Listing inquiry thread. */\n kind: 'listing'\n /** Store owning the listing. */\n store_id: string\n /** Listing to ask about. */\n listing_id: string\n }\n | {\n /** Resolve an Order support thread. */\n kind: 'order'\n /** Authorized buyer order. */\n order_id: string\n }\n\n/** Store-authorized input for idempotent thread resolution. */\nexport type StoreResolveThreadInput =\n | {\n /** Resolve an entitled existing General relationship. */\n kind: 'general'\n /** Buyer in the entitled relationship. */\n buyer_id: string\n }\n | {\n /** Resolve an Order support thread. */\n kind: 'order'\n /** Authorized store order. */\n order_id: string\n }\n\n/** Cursor inputs for newest, older, or catch-up message windows. */\nexport type ListThreadMessagesParams =\n | {\n /** Older-history cursor. */\n before?: MessagingCursor\n /** Catch-up cursor is mutually exclusive with before. */\n after?: never\n /** Requested page size. */\n limit?: number\n }\n | {\n /** Catch-up cursor. */\n after?: MessagingCursor\n /** Older-history cursor is mutually exclusive with after. */\n before?: never\n /** Requested page size. */\n limit?: number\n }\n\n/** Caller-owned, idempotent input for one human-authored message. */\nexport interface SendThreadMessageInput {\n /**\n * Stable caller-generated identifier reused for every retry.\n *\n * The runtime method maps this value to the `Idempotency-Key` header, omits it from the JSON\n * body, and never generates a replacement key during retry.\n */\n client_message_id: string\n /** Required trimmed body of 1–2,000 characters. */\n body: string\n /** Same-thread quoted message; omit rather than send null when absent. */\n reply_to_message_id?: MessageId\n /** Safe staged attachment identifiers; empty or omitted for text-only sends. */\n attachment_ids?: string[]\n}\n\n/** Canonical result of an accepted or deduplicated send. */\nexport interface SendThreadMessageResult {\n /** Canonical committed message. */\n message: ThreadMessage\n /** Whether this response replayed an earlier accepted request. */\n deduplicated: boolean\n /** Server policy processing applied to the submitted body. */\n policy: {\n /** Whether policy processing changed the body. */\n body_modified: boolean\n /** Recipient-safe policy notices. */\n notices: string[]\n }\n}\n\n/** Lifecycle state of one staged attachment upload. */\nexport type AttachmentUploadState =\n | 'authorized'\n | 'uploaded'\n | 'pending_scan'\n | 'safe'\n | 'rejected'\n | 'expired'\n | 'claimed'\n\n/** Server capability declaration for the staged Messaging v2 rollout. */\nexport interface MessagingCapabilities {\n /** Public resource schema version. */\n api_version: 2\n /** Realtime protocol versions understood by this deployment. */\n protocol_versions: number[]\n /** Whether the Messaging v2 HTTP resource surface is enabled. */\n http: { enabled: boolean }\n /** Whether legacy writes are mirrored into Messaging v2. */\n dual_write: { enabled: boolean }\n /** Whether migration shadow reads are enabled. */\n shadow_read: { enabled: boolean }\n /** Whether clients must address a stable Messaging v2 thread. */\n require_thread: { enabled: boolean }\n /** Managed realtime capability and supported wire versions. */\n realtime: {\n /** Whether clients may establish managed realtime connections. */\n enabled: boolean\n /** Realtime protocol versions currently available. */\n protocol_versions: number[]\n }\n /** Optional attachment capability. */\n attachments: {\n /** Whether clients may expose attachment controls. */\n enabled: boolean\n /** Maximum accepted upload size. */\n max_size_bytes: number\n /** Allowed upload media types. */\n allowed_content_types: string[]\n }\n}\n\n/** Short-lived authorization for one private staged attachment upload. */\nexport interface AttachmentUploadAuthorization {\n /** Stable upload identifier. */\n id: string\n /** Thread for which the upload was authorized. */\n thread_id: ThreadId\n /** Initial upload state. */\n state: 'authorized'\n /** Absolute short-lived upload URL. */\n upload_url: string\n /** One-use upload ticket that is not an access token. */\n upload_ticket: string\n /** UTC ISO 8601 authorization expiry. */\n expires_at: string\n /** Server-accepted upload constraints. */\n accepted: {\n /** Accepted media type. */\n content_type: string\n /** Accepted byte size. */\n size_bytes: number\n /** Accepted SHA-256 digest. */\n sha256: string\n }\n}\n\n/** Current status of one private staged attachment upload. */\nexport interface AttachmentUploadStatus {\n /** Stable upload identifier. */\n id: string\n /** Thread for which the upload was authorized. */\n thread_id: ThreadId\n /** Current upload lifecycle state. */\n state: AttachmentUploadState\n /** UTC ISO 8601 upload expiry. */\n expires_at: string\n /** Safe rejection code, or null when not rejected. */\n rejection_code: string | null\n /** Committed safe attachment, or null until available. */\n attachment: MessageAttachment | null\n}\n\n/** Read-only summary of exact-participant history that cannot be assigned to a store. */\nexport interface LegacyMessageArchiveSummary {\n /** Stable legacy archive identifier. */\n id: string\n /** Other original participant. */\n other_user: BuyerSummary\n /** Latest historic message body. */\n last_message_body: string\n /** UTC ISO 8601 timestamp of the latest historic message. */\n last_message_at: string\n}\n\n/** Read-only historic message that cannot be assigned to a store conversation. */\nexport interface LegacyMessageRecord {\n /** Stable legacy message identifier. */\n id: string\n /** Original sender. */\n sender: BuyerSummary\n /** Historic message body. */\n body: string\n /** UTC ISO 8601 creation timestamp. */\n created_at: string\n}\n\n/** Safe result of resolving a temporary Buyer legacy navigation link. */\nexport type LegacyLinkResolution =\n | {\n /** Legacy link resolved to canonical v2 resources. */\n result: 'resolved'\n /** Canonical conversation identifier. */\n conversation_id: ConversationId\n /** Canonical thread identifier. */\n thread_id: ThreadId\n }\n | {\n /** Several stores match and the buyer must choose explicitly. */\n result: 'choose_store'\n /** Safe candidate stores. */\n stores: StoreSummary[]\n }\n | {\n /** Link targets exact-participant read-only legacy history. */\n result: 'legacy_archive'\n /** Canonical legacy archive identifier. */\n legacy_thread_id: string\n }\n | {\n /** Link is invalid, forbidden, or cannot be resolved safely. */\n result: 'unavailable'\n }\n\nconst MESSAGING_ERROR_CODES = [\n 'invalid_input',\n 'unauthorized',\n 'session_expired',\n 'forbidden',\n 'conversation_not_found',\n 'thread_not_found',\n 'message_not_found',\n 'timeline_item_not_found',\n 'context_mismatch',\n 'idempotency_conflict',\n 'cursor_invalid',\n 'cursor_expired',\n 'attachment_not_ready',\n 'blocked',\n 'legacy_context_required',\n 'client_upgrade_required',\n 'rate_limited',\n 'temporarily_unavailable',\n 'internal_error',\n 'invalid_response',\n 'network_error',\n] as const\n\n/** Closed messaging-specific API error code vocabulary. */\nexport type MessagingErrorCode = typeof MESSAGING_ERROR_CODES[number]\n\nconst MESSAGING_ERROR_CODE_SET: ReadonlySet<string> = new Set(MESSAGING_ERROR_CODES)\n\ntype MessagingAPIError = APIError & { code: MessagingErrorCode }\n\n/**\n * Narrow an unknown value to an API error carrying a recognized messaging code.\n *\n * @param value - Unknown caught value\n * @returns Whether the value is a messaging API error\n */\nexport function isMessagingAPIError(value: unknown): value is MessagingAPIError\n\n/**\n * Narrow an unknown value to an API error carrying one expected messaging code.\n *\n * @param value - Unknown caught value\n * @param code - Expected messaging error code\n * @returns Whether the value carries the expected code\n */\nexport function isMessagingAPIError<Code extends MessagingErrorCode>(\n value: unknown,\n code: Code,\n): value is APIError & { code: Code }\n\nexport function isMessagingAPIError(\n value: unknown,\n code?: MessagingErrorCode,\n): value is MessagingAPIError {\n if (!(value instanceof Error) || value.name !== 'APIError') {\n return false\n }\n\n const candidate = value as Error & {\n code?: unknown\n status?: unknown\n }\n if (\n typeof candidate.code !== 'string' ||\n typeof candidate.status !== 'number' ||\n !MESSAGING_ERROR_CODE_SET.has(candidate.code)\n ) {\n return false\n }\n\n return code === undefined || candidate.code === code\n}\n\n/** Error raised when a Messaging realtime frame or protocol contract is invalid. */\nexport class RealtimeProtocolError extends Error {\n /** Construct a stable protocol failure without echoing an untrusted frame. */\n constructor() {\n super('Messaging realtime protocol is invalid.')\n this.name = 'RealtimeProtocolError'\n }\n}\n\n/** Error raised when the current runtime has no supported WebSocket implementation. */\nexport class RealtimeUnavailableError extends Error {\n /** Construct a stable runtime-unavailable failure. */\n constructor() {\n super('Messaging realtime is unavailable in this runtime.')\n this.name = 'RealtimeUnavailableError'\n }\n}\n\n\n/** Cursor parameters for conversation collections. */\nexport interface ListConversationsParams {\n /** Opaque next-page cursor. */\n cursor?: MessagingCursor\n /** Page size from 1 through 100. */\n limit?: number\n}\n\n/** Cursor and filter parameters for thread-card collections. */\nexport interface ListThreadsParams extends ListConversationsParams {\n /** Include threads archived by the selected perspective. */\n include_archived?: boolean\n /** Optional shared support-status filter. */\n status?: 'open' | 'resolved'\n}\n\n/** Thread preference patch for one perspective. */\nexport interface UpdateThreadPreferencesInput {\n /** Archive or restore the thread for this perspective. */\n archived?: boolean\n /** Pin or unpin the thread for this perspective. */\n pinned?: boolean\n /** Mute or unmute the thread for this perspective. */\n muted?: boolean\n}\n\n/** Conversation preference patch for one perspective. */\nexport interface UpdateConversationPreferencesInput {\n /** Archive or restore the conversation for this perspective. */\n archived?: boolean\n /** Mute or unmute the conversation for this perspective. */\n muted?: boolean\n}\n\n/** Request options for an idempotent operation. */\nexport interface MessagingIdempotentRequestOptions {\n /** Stable key reused for an exact retry. */\n idempotencyKey: string\n /** Optional cancellation signal. */\n signal?: AbortSignal\n /** Additional non-authorization headers. */\n headers?: Record<string, string>\n}\n\n/** Metadata used to authorize one private attachment upload. */\nexport interface CreateAttachmentUploadInput {\n /** Sanitized display file name. */\n file_name: string\n /** Lowercase allowlisted media type. */\n content_type: string\n /** Exact byte length. */\n size_bytes: number\n /** Lowercase hexadecimal SHA-256 digest. */\n sha256: string\n}\n\n/** Portable in-memory body accepted by attachment upload. */\nexport type AttachmentUploadBody = Blob | ArrayBuffer | ArrayBufferView\n\n/** Short-lived mediated attachment download. */\nexport interface AttachmentDownloadAuthorization {\n /** Absolute application download URL containing a short-lived ticket. */\n url: string\n /** UTC ISO 8601 ticket expiry. */\n expires_at: string\n}\n\n/** Buyer and currently represented store inboxes. */\nexport interface MessagingInboxes {\n /** Personal buyer perspective. */\n buyer: { kind: 'buyer'; buyer: BuyerSummary }\n /** Authorized store perspectives. */\n stores: Array<{ kind: 'store'; store: StoreSummary }>\n}\n\n/** One-use realtime bootstrap ticket. */\nexport interface MessagesRealtimeTicket {\n /** Opaque ticket; never persist or log it. */\n ticket: string\n /** UTC ISO 8601 ticket expiry. */\n expires_at: string\n /** Absolute ticket-only WebSocket URL. */\n websocket_url: string\n /** Required negotiated subprotocol. */\n websocket_protocol: 'mitumba-messaging-v1'\n /** Realtime protocol version. */\n protocol_version: 1\n /** Requested resume cursor, or null for a fresh connection. */\n resume_cursor: MessagingCursor | null\n}\n\n/** Minimal event delivered by an isomorphic WebSocket transport. */\nexport interface WebSocketMessageEventLike {\n /** Untrusted frame data parsed by the SDK before exposure. */\n data: unknown\n}\n\n/** Minimal close event delivered by an isomorphic WebSocket transport. */\nexport interface WebSocketCloseEventLike {\n /** WebSocket close code. */\n code: number\n /** Safe close reason. */\n reason?: string\n /** Whether the transport observed a clean close. */\n wasClean?: boolean\n}\n\n/** Minimal WebSocket contract supported in Browser, Node, Edge, and Worker runtimes. */\nexport interface WebSocketLike {\n /** Connecting ready state. */\n readonly CONNECTING?: number\n /** Open ready state. */\n readonly OPEN?: number\n /** Current ready state. */\n readonly readyState: number\n /** Send one client frame. */\n send(data: string): void\n /** Close this transport. */\n close(code?: number, reason?: string): void\n /** Register a transport listener. */\n addEventListener(type: 'open', listener: () => void): void\n addEventListener(type: 'message', listener: (event: WebSocketMessageEventLike) => void): void\n addEventListener(type: 'close', listener: (event: WebSocketCloseEventLike) => void): void\n addEventListener(type: 'error', listener: (event: unknown) => void): void\n /** Remove a transport listener. */\n removeEventListener(type: 'open', listener: () => void): void\n removeEventListener(type: 'message', listener: (event: WebSocketMessageEventLike) => void): void\n removeEventListener(type: 'close', listener: (event: WebSocketCloseEventLike) => void): void\n removeEventListener(type: 'error', listener: (event: unknown) => void): void\n}\n\n/** Injectable WebSocket constructor for isomorphic runtimes. */\nexport type WebSocketFactory = (url: string, protocols: string | string[]) => WebSocketLike\n\n/** Managed realtime lifecycle state. */\nexport type MessagesRealtimeState = 'connecting' | 'open' | 'reconnecting' | 'closed' | 'failed'\n\n/** Durable realtime envelope shared by all resumable events. */\nexport interface MessagesRealtimeEnvelope<Type extends string, Payload> {\n /** Public resource schema version. */\n api_version: 2\n /** Wire protocol version. */\n protocol_version: 1\n /** Stable event identifier used for deduplication. */\n event_id: string\n /** Opaque audience resume cursor. */\n resume_cursor: MessagingCursor\n /** Event discriminator. */\n type: Type\n /** UTC ISO 8601 occurrence timestamp. */\n occurred_at: string\n /** Related conversation when applicable. */\n conversation_id?: ConversationId\n /** Related thread when applicable. */\n thread_id?: ThreadId\n /** Event payload validated before exposure. */\n payload: Payload\n}\n\n/** Validated managed Messaging realtime event. */\nexport type MessagesRealtimeEvent =\n | MessagesRealtimeEnvelope<'message.created', { message: ThreadMessage }>\n | MessagesRealtimeEnvelope<'system_event.created', { event: ThreadSystemEvent }>\n | MessagesRealtimeEnvelope<'conversation.updated', { conversation: ConversationSummary }>\n | MessagesRealtimeEnvelope<'thread.created', { thread: ThreadCard }>\n | MessagesRealtimeEnvelope<'thread.updated', { thread: ThreadCard }>\n | MessagesRealtimeEnvelope<'read_cursor.updated', { cursor: ReadCursorResult }>\n | MessagesRealtimeEnvelope<'attachment.updated', { upload: AttachmentUploadStatus }>\n | MessagesRealtimeEnvelope<'message.policy_applied', { message_id: MessageId; notices: string[] }>\n | {\n /** Resource schema version. */\n api_version: 2\n /** Wire protocol version. */\n protocol_version: 1\n /** Ephemeral event discriminator. */\n type: 'typing.updated'\n /** Thread scoped by this typing state. */\n thread_id: ThreadId\n /** Validated public author. */\n author: MessageAuthor\n /** Current typing state. */\n is_typing: boolean\n /** UTC ISO 8601 occurrence timestamp. */\n occurred_at: string\n }\n | {\n /** Resource schema version. */\n api_version: 2\n /** Wire protocol version. */\n protocol_version: 1\n /** Authoritative rebuild signal. */\n type: 'resync.required'\n /** Safe reason for rebuilding HTTP state. */\n reason: 'cursor_expired' | 'gap_detected' | 'authorization_changed'\n /** Resume cursor after the authoritative rebuild. */\n resume_cursor: MessagingCursor\n }\n\n/** Options for an inert or immediately started managed realtime connection. */\nexport interface MessagesRealtimeOptions {\n /** Buyer or authorized-store audience. */\n perspective: MessagingPerspective\n /** Last acknowledged cursor, or null for a fresh connection. */\n resumeCursor?: MessagingCursor | null\n /** Optional cancellation signal for ticket requests. */\n signal?: AbortSignal\n /** Initial reconnect delay in milliseconds. */\n reconnectBaseDelayMs?: number\n /** Maximum reconnect delay in milliseconds. */\n reconnectMaxDelayMs?: number\n /** Injected randomness for deterministic tests. */\n random?: () => number\n}\n\n/** Managed, resumable messaging connection. */\nexport interface MessagesRealtimeConnection {\n /** Current connection lifecycle state. */\n readonly state: MessagesRealtimeState\n /** Last acknowledged durable cursor. */\n readonly resumeCursor: MessagingCursor | null\n /** Start the inert connection. Repeated calls are safe. */\n start(): Promise<void>\n /** Permanently close and release sockets, timers, and listeners. */\n close(): void\n /** Subscribe to validated messaging events. */\n onEvent(listener: (event: MessagesRealtimeEvent) => void | Promise<void>): () => void\n /** Subscribe to lifecycle changes. */\n onStateChange(listener: (state: MessagesRealtimeState) => void): () => void\n /** Select a thread for message and typing delivery. */\n subscribeThread(threadId: ThreadId): void\n /** Stop local delivery for one selected thread. */\n unsubscribeThread(threadId: ThreadId): void\n /** Publish thread-scoped ephemeral typing state. */\n setTyping(threadId: ThreadId, isTyping: boolean): void\n}\n\n\n/** Older-history page for one read-only legacy archive. */\nexport interface LegacyMessagePage {\n /** Historic messages in ascending display order. */\n items: LegacyMessageRecord[]\n /** Cursor for older history, or null at the beginning. */\n older_cursor: MessagingCursor | null\n /** Whether older history remains. */\n has_older: boolean\n}\n\n/**\n * Create a bilateral block from a v2 inbox perspective. A buyer blocks a store by `store_id`;\n * a store blocks a buyer by `buyer_id`.\n */\nexport type MessagingBlockInput =\n | { store_id: string; reason?: string }\n | { buyer_id: string; reason?: string }\n\n/** Idempotent block result. */\nexport interface MessagingBlockResult {\n id: string\n active: boolean\n deduplicated: boolean\n}\n\n/** Result of removing a block. */\nexport interface MessagingBlockRemovedResult {\n ok: true\n active: false\n}\n","export interface TokenStore {\n getAccessToken(): Promise<string | null>\n getRefreshToken(): Promise<string | null>\n setTokens(access: string, refresh: string): Promise<void>\n clear(): Promise<void>\n}\n\nexport class MemoryTokenStore implements TokenStore {\n private accessToken: string | null = null\n private refreshToken: string | null = null\n\n async getAccessToken(): Promise<string | null> { return this.accessToken }\n async getRefreshToken(): Promise<string | null> { return this.refreshToken }\n async setTokens(access: string, refresh: string): Promise<void> {\n this.accessToken = access\n this.refreshToken = refresh\n }\n async clear(): Promise<void> {\n this.accessToken = null\n this.refreshToken = null\n }\n}\n\nconst DB_NAME = 'mitumba_sdk'\nconst STORE_NAME = 'tokens'\nconst KEY = 'auth'\n\nexport class IDBTokenStore implements TokenStore {\n private dbPromise: Promise<IDBDatabase> | null = null\n\n private openDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, 1)\n request.onupgradeneeded = () => {\n request.result.createObjectStore(STORE_NAME)\n }\n request.onsuccess = () => resolve(request.result)\n request.onerror = () => reject(request.error)\n })\n return this.dbPromise\n }\n\n private async get(): Promise<{ access: string; refresh: string } | null> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readonly')\n const req = tx.objectStore(STORE_NAME).get(KEY)\n req.onsuccess = () => resolve(req.result || null)\n req.onerror = () => reject(req.error)\n })\n }\n\n async getAccessToken(): Promise<string | null> {\n const data = await this.get()\n return data?.access ?? null\n }\n\n async getRefreshToken(): Promise<string | null> {\n const data = await this.get()\n return data?.refresh ?? null\n }\n\n async setTokens(access: string, refresh: string): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).put({ access, refresh }, KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n\n async clear(): Promise<void> {\n const db = await this.openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const req = tx.objectStore(STORE_NAME).delete(KEY)\n req.onsuccess = () => resolve()\n req.onerror = () => reject(req.error)\n })\n }\n}\n\n/** Creates IDBTokenStore if indexedDB is available, otherwise MemoryTokenStore. */\nexport function createTokenStore(): TokenStore {\n if (typeof indexedDB !== 'undefined') {\n return new IDBTokenStore()\n }\n return new MemoryTokenStore()\n}\n","import { MitumbaClientConfig, APIErrorResponse, RequestOptions, WebSocketLike } from './types'\nimport { RealtimeUnavailableError } from './types/messages-v2'\nimport { TokenStore, createTokenStore } from './token-store'\n\nexport class APIError extends Error {\n public readonly code: string\n public readonly status: number\n public readonly details?: unknown\n\n constructor(status: number, data: APIErrorResponse) {\n super(data.message || data.error)\n this.name = 'APIError'\n this.code = data.error\n this.status = status\n this.details = data.details\n }\n}\n\nfunction isExpiringSoon(token: string, thresholdSeconds: number): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]))\n const exp = payload.exp as number\n return exp - (Date.now() / 1000) < thresholdSeconds\n } catch {\n return false\n }\n}\n\nfunction isErrorRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction normalizeAPIErrorResponse(value: unknown, fallbackMessage?: string): APIErrorResponse {\n if (isErrorRecord(value) && typeof value.error === 'string') {\n return {\n error: value.error,\n message: typeof value.message === 'string' ? value.message : fallbackMessage,\n details: value.details,\n }\n }\n if (isErrorRecord(value) && isErrorRecord(value.error) && typeof value.error.code === 'string') {\n return {\n error: value.error.code,\n message: typeof value.error.message === 'string' ? value.error.message : fallbackMessage,\n details: value.error.details,\n }\n }\n return { error: 'unknown_error', message: fallbackMessage }\n}\n\nclass InvalidRefreshCredentialsError extends Error {\n constructor() {\n super('Refresh credentials are invalid.')\n this.name = 'InvalidRefreshCredentialsError'\n }\n}\n\nfunction isTokenResponse(value: unknown): value is { access_token: string; refresh_token: string } {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Record<string, unknown>\n return typeof candidate.access_token === 'string'\n && candidate.access_token.length > 0\n && typeof candidate.refresh_token === 'string'\n && candidate.refresh_token.length > 0\n}\n\nexport class APIClient {\n private config: MitumbaClientConfig\n private tokenStore: TokenStore\n private isRefreshing = false\n private refreshPromise: Promise<void> | null = null\n\n constructor(config: MitumbaClientConfig) {\n this.config = config\n this.tokenStore = config.tokenStore ?? createTokenStore()\n\n // Seed store from config if tokens provided\n if (config.token) {\n this.tokenStore.setTokens(config.token, config.refreshToken || '')\n }\n }\n\n public async setToken(token: string, refreshToken?: string): Promise<void> {\n this.config.token = token\n if (refreshToken && refreshToken.length > 0) {\n this.config.refreshToken = refreshToken\n }\n const effectiveRefresh = refreshToken && refreshToken.length > 0\n ? refreshToken\n : this.config.refreshToken && this.config.refreshToken.length > 0\n ? this.config.refreshToken\n : ''\n await this.tokenStore.setTokens(token, effectiveRefresh)\n }\n\n /**\n * Set both tokens explicitly. Requires a valid refresh token.\n * Preferred over setToken() to avoid dropping the refresh token.\n */\n public async setSession(tokens: { access_token: string; refresh_token: string }): Promise<void> {\n this.config.token = tokens.access_token\n this.config.refreshToken = tokens.refresh_token\n await this.tokenStore.setTokens(tokens.access_token, tokens.refresh_token)\n }\n\n public getToken(): string | undefined {\n return this.config.token\n }\n\n public getBaseUrl(): string {\n return this.config.baseUrl\n }\n\n /** Create an isomorphic WebSocket using the configured or global transport. */\n public createWebSocket(url: string, protocols: string | string[]): WebSocketLike {\n if (this.config.webSocketFactory) return this.config.webSocketFactory(url, protocols)\n const Constructor = globalThis.WebSocket\n if (typeof Constructor !== 'function') throw new RealtimeUnavailableError()\n return new Constructor(url, protocols) as unknown as WebSocketLike\n }\n\n public async clearToken(): Promise<void> {\n this.config.token = undefined\n this.config.refreshToken = undefined\n await this.tokenStore.clear()\n }\n\n /**\n * Check if user has a stored session (access or refresh token available).\n */\n public async isAuthenticated(): Promise<boolean> {\n const access = this.config.token ?? await this.tokenStore.getAccessToken()\n if (access) return true\n const refresh = await this.tokenStore.getRefreshToken()\n return !!refresh\n }\n\n /**\n * Hydrate tokens from the store into memory (call on app boot).\n */\n public async hydrate(): Promise<void> {\n const access = await this.tokenStore.getAccessToken()\n const refresh = await this.tokenStore.getRefreshToken()\n if (access) this.config.token = access\n if (refresh) this.config.refreshToken = refresh\n }\n\n public async ensureFreshToken(options?: RequestOptions): Promise<void> {\n // Try hydrating from store if no in-memory token\n if (!this.config.token) {\n const stored = await this.tokenStore.getAccessToken()\n if (stored) this.config.token = stored\n const refresh = await this.tokenStore.getRefreshToken()\n if (refresh) this.config.refreshToken = refresh\n }\n\n // Proactive refresh if token expires within 60 seconds\n if (this.config.token && isExpiringSoon(this.config.token, 60) && this.config.refreshToken && this.config.refreshToken.length > 0) {\n await this.handleTokenRefresh(options?.signal)\n }\n }\n\n private async request<T>(\n method: string, \n path: string, \n body?: unknown, \n params?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions\n ): Promise<T> {\n // Proactive refresh before request (skip for auth endpoints)\n if (!path.includes('/auth/refresh') && !path.includes('/auth/login') && !path.includes('/auth/register')) {\n await this.ensureFreshToken(options)\n }\n\n const url = new URL(path, this.config.baseUrl)\n \n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n }\n }\n\n const headers = new Headers(options?.headers)\n if (body && !(body instanceof FormData)) {\n headers.set('Content-Type', 'application/json')\n }\n\n if (this.config.token) {\n // Always wins over a custom header: callers cannot bypass token refresh or impersonate a\n // different session through RequestOptions.\n headers.set('Authorization', `Bearer ${this.config.token}`)\n }\n\n const init: RequestInit = {\n method,\n headers,\n body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined,\n signal: options?.signal\n }\n\n const maxRetries = this.config.maxRetries ?? 3\n let attempt = 0\n let response: Response\n\n while (true) {\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()}`)\n }\n \n const startTime = Date.now()\n try {\n response = await fetch(url.toString(), init)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw err\n }\n if (attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] Network error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n throw new APIError(0, { error: 'network_error', message: err instanceof Error ? err.message : 'Network request failed' })\n }\n\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${method} ${url.toString()} - ${response.status} (${Date.now() - startTime}ms)`)\n }\n\n if (response.status >= 500 && attempt < maxRetries) {\n attempt++\n if (this.config.debug) {\n console.log(`[Mitumba SDK] ${response.status} error. Retrying ${method} ${url.toString()} (attempt ${attempt})`)\n }\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 100))\n continue\n }\n\n break\n }\n\n // Handle 401 — attempt refresh and retry\n if (response.status === 401 && !path.includes('/auth/refresh') && !path.includes('/auth/login') && !path.includes('/auth/register')) {\n const hasRefreshToken = this.config.refreshToken && this.config.refreshToken.length > 0\n\n if (hasRefreshToken) {\n try {\n await this.handleTokenRefresh(options?.signal)\n } catch (error) {\n if (!(error instanceof InvalidRefreshCredentialsError)) throw error\n this.config.onAuthExpired?.()\n throw new APIError(401, { error: 'session_expired', message: 'Session expired. Please log in again.' })\n }\n headers.set('Authorization', `Bearer ${this.config.token}`)\n // Replay failures deliberately propagate unchanged. A successful refresh is not an\n // expired session merely because the network drops or the caller aborts the replay.\n response = await fetch(url.toString(), { ...init, headers })\n } else {\n // No refresh token — session is dead, fire callback immediately\n if (this.config.onAuthExpired) {\n this.config.onAuthExpired()\n }\n throw new APIError(401, { error: 'session_expired', message: 'Session expired. Please log in again.' })\n }\n }\n\n if (!response.ok) {\n let decoded: unknown\n try {\n decoded = await response.json()\n } catch {\n decoded = null\n }\n throw new APIError(response.status, normalizeAPIErrorResponse(decoded, response.statusText))\n }\n\n if (response.status === 204) {\n return undefined as unknown as T\n }\n\n return response.json() as Promise<T>\n }\n\n private async handleTokenRefresh(signal?: AbortSignal): Promise<void> {\n if (this.isRefreshing && this.refreshPromise) {\n return this.refreshPromise\n }\n\n this.isRefreshing = true\n this.refreshPromise = (async () => {\n try {\n const url = new URL('/auth/refresh', this.config.baseUrl)\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ refresh_token: this.config.refreshToken }),\n signal,\n })\n\n if (response.status === 400 || response.status === 401) {\n await this.clearToken()\n throw new InvalidRefreshCredentialsError()\n }\n if (!response.ok) {\n let decoded: unknown\n try {\n decoded = await response.json()\n } catch {\n decoded = null\n }\n throw new APIError(response.status, normalizeAPIErrorResponse(decoded, response.statusText || 'Token refresh failed.'))\n }\n\n let decoded: unknown\n try {\n decoded = await response.json()\n } catch {\n throw new APIError(response.status, { error: 'refresh_response_invalid', message: 'Token refresh returned an invalid response.' })\n }\n if (!isTokenResponse(decoded)) {\n throw new APIError(response.status, { error: 'refresh_response_invalid', message: 'Token refresh returned an invalid response.' })\n }\n\n this.config.token = decoded.access_token\n this.config.refreshToken = decoded.refresh_token\n await this.tokenStore.setTokens(decoded.access_token, decoded.refresh_token)\n this.config.onTokenRefresh?.({ token: decoded.access_token, refreshToken: decoded.refresh_token })\n } finally {\n this.isRefreshing = false\n this.refreshPromise = null\n }\n })()\n\n return this.refreshPromise\n }\n\n public get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, params, options)\n }\n\n public post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, undefined, options)\n }\n\n public put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, undefined, options)\n }\n\n public patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PATCH', path, body, undefined, options)\n }\n\n public delete<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, body, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n RegisterInput,\n LoginInput,\n SendOtpInput,\n VerifyOtpInput,\n ForgotPasswordInput,\n ResetPasswordInput,\n CompleteOnboardingInput,\n Verify2FAInput,\n TwoFactorRequired,\n BecomeSellerInput,\n BecomeBaleSellerInput,\n PublicKeyCredentialRequestOptionsJSON,\n AuthenticationResponseJSON,\n UserProfile,\n AuthTokens,\n MessageResponse,\n RequestOptions,\n AuthCapabilities,\n RegenerateBackupCodesResult,\n RequestRecoveryInput,\n RequestRecoveryResult,\n RecoveryStatusResult,\n CompleteRecoveryResult,\n AdminRecoveryRequest,\n AdminRecoveryEvent,\n RootSetupInput,\n RootSetupResult,\n} from '../types'\n\nfunction isAuthTokens(result: unknown): result is AuthTokens {\n return typeof result === 'object' && result !== null && 'access_token' in result && 'refresh_token' in result\n}\n\nexport class AuthModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Register a new account.\n * If using EmailRegisterInput, returns AuthTokens (auto-persisted).\n * If using PhoneRegisterInput, returns MessageResponse (OTP sent).\n */\n async register(input: RegisterInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse> {\n const result = await this.client.post<AuthTokens | MessageResponse>('/auth/register', input, options)\n if (isAuthTokens(result)) {\n await this.client.setSession(result)\n }\n return result\n }\n\n /**\n * Log in to an existing account.\n * If using EmailLoginInput, returns AuthTokens (auto-persisted) or TwoFactorRequired.\n * If using PhoneLoginInput, returns MessageResponse (OTP sent).\n */\n async login(input: LoginInput, options?: RequestOptions): Promise<AuthTokens | MessageResponse | TwoFactorRequired> {\n const result = await this.client.post<AuthTokens | MessageResponse | TwoFactorRequired>('/auth/login', input, options)\n if (isAuthTokens(result)) {\n await this.client.setSession(result)\n }\n return result\n }\n\n /**\n * Send an OTP code to a phone number.\n */\n async sendOtp(input: SendOtpInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/otp/send', input, options)\n }\n\n /**\n * Verify an OTP code. Tokens are auto-persisted.\n */\n async verifyOtp(input: VerifyOtpInput, options?: RequestOptions): Promise<AuthTokens> {\n const result = await this.client.post<AuthTokens>('/auth/otp/verify', input, options)\n await this.client.setSession(result)\n return result\n }\n\n /**\n * Refresh the access token using a refresh token.\n */\n async refresh(input: { refresh_token: string }, options?: RequestOptions): Promise<AuthTokens> {\n const result = await this.client.post<AuthTokens>('/auth/refresh', input, options)\n await this.client.setSession(result)\n return result\n }\n\n /**\n * Revoke the refresh token and log out. Clears stored session.\n */\n async logout(input: { refresh_token: string }, options?: RequestOptions): Promise<{ ok: boolean }> {\n const result = await this.client.post<{ ok: boolean }>('/auth/logout', input, options)\n await this.client.clearToken()\n return result\n }\n\n /**\n * Request a password reset email.\n */\n async forgotPassword(input: ForgotPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/forgot-password', input, options)\n }\n\n /**\n * Reset the password using a token from the reset email.\n */\n async resetPassword(input: ResetPasswordInput, options?: RequestOptions): Promise<MessageResponse> {\n return this.client.post<MessageResponse>('/auth/reset-password', input, options)\n }\n\n /**\n * Get the current authenticated user's profile.\n */\n async me(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n /**\n * Complete the onboarding flow.\n */\n async completeOnboarding(input: CompleteOnboardingInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/onboarding/complete', input, options)\n }\n\n /**\n * Verify 2FA code during login. Tokens are auto-persisted.\n */\n async verify2FA(input: Verify2FAInput, options?: RequestOptions): Promise<AuthTokens> {\n const result = await this.client.post<AuthTokens>('/auth/2fa/login', input, options)\n await this.client.setSession(result)\n return result\n }\n\n /**\n * Send a 2FA challenge during login (for SMS/email methods).\n * Call before verify2FA when the user picks a non-TOTP method.\n */\n async sendLogin2FAChallenge(input: { temp_token: string; method_id: string }, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/login/challenge', input, options)\n }\n\n /**\n * Send a verification code to the user's email.\n */\n async sendVerificationCode(email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/send', email ? { email } : undefined, options)\n }\n\n /**\n * Verify the email with the 6-digit code.\n */\n async verifyEmail(code: string, email?: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/verify-email/confirm', email ? { code, email } : { code }, options)\n }\n\n /**\n * Upgrade the current user to a seller role.\n */\n async becomeSeller(input: BecomeSellerInput, options?: RequestOptions): Promise<{ ok: true; roles: string[]; sti_score: number }> {\n return this.client.post<{ ok: true; roles: string[]; sti_score: number }>('/auth/become-seller', input, options)\n }\n\n /**\n * Upgrade the current user to a bale (wholesale) seller role.\n * Mutually exclusive with retail seller — 409 if already a retail seller.\n */\n async becomeBaleSeller(input: BecomeBaleSellerInput, options?: RequestOptions): Promise<{ ok: true; roles: string[] }> {\n return this.client.post<{ ok: true; roles: string[] }>('/auth/become-bale-seller', input, options)\n }\n\n /**\n * Check if the account is eligible for deletion and what blockers exist.\n */\n async getDeletionEligibility(options?: RequestOptions): Promise<{ eligible: boolean; reasons: string[]; totp_enabled: boolean }> {\n return this.client.get<{ eligible: boolean; reasons: string[]; totp_enabled: boolean }>('/auth/account/deletion-eligibility', undefined, options)\n }\n\n /**\n * Request account deletion. Sends a confirmation email if eligible.\n */\n async requestAccountDeletion(options?: RequestOptions): Promise<{ ok: true } | { blocked: true; reasons: string[] }> {\n return this.client.post<{ ok: true } | { blocked: true; reasons: string[] }>('/auth/account/deletion-request', undefined, options)\n }\n\n /**\n * Confirm account deletion (from emailed link). Clears local session on success.\n */\n async confirmAccountDeletion(input: { token: string; code?: string }, options?: RequestOptions): Promise<{ ok: true }> {\n const result = await this.client.delete<{ ok: true }>('/auth/account', input, options)\n await this.client.clearToken()\n return result\n }\n\n // ── Passkey Login ──\n\n /**\n * Start passkey login — get assertion options for navigator.credentials.get().\n */\n async startPasskeyLogin(input: { temp_token: string; method_id?: string }, options?: RequestOptions): Promise<{ options: PublicKeyCredentialRequestOptionsJSON }> {\n return this.client.post<{ options: PublicKeyCredentialRequestOptionsJSON }>('/auth/2fa/login/passkey/start', input, options)\n }\n\n /**\n * Finish passkey login — submit the browser's assertion response. Tokens are auto-persisted.\n */\n async finishPasskeyLogin(input: { temp_token: string; credential: AuthenticationResponseJSON }, options?: RequestOptions): Promise<AuthTokens> {\n const result = await this.client.post<AuthTokens>('/auth/2fa/login/passkey/finish', input, options)\n await this.client.setSession(result)\n return result\n }\n\n /**\n * One-time root bootstrap. The setup secret travels in a header and is never part of the JSON\n * body, where an error logger or request capture is more likely to record it.\n */\n async setupRoot(input: RootSetupInput, options?: RequestOptions): Promise<RootSetupResult> {\n const { setup_secret, ...body } = input\n return this.client.post<RootSetupResult>(\n '/auth/root/setup',\n body,\n { ...options, headers: { ...options?.headers, 'X-Root-Setup-Secret': setup_secret } },\n )\n }\n\n // ── Capabilities and backup-code lifecycle ──\n\n /** Public auth-mode document. Never requires or changes the session. */\n async capabilities(options?: RequestOptions): Promise<AuthCapabilities> {\n return this.client.get<AuthCapabilities>('/auth/capabilities', undefined, options)\n }\n\n /**\n * Replace every backup code after re-proving the current password.\n *\n * The result is intentionally not persisted by the SDK: codes are shown once, and storing them in\n * a browser turns a recovery credential into something a stolen session can read.\n */\n async regenerateBackupCodes(\n currentPassword: string,\n options?: RequestOptions,\n ): Promise<RegenerateBackupCodesResult> {\n return this.client.post<RegenerateBackupCodesResult>(\n '/auth/2fa/backup-codes/regenerate',\n { current_password: currentPassword },\n options,\n )\n }\n\n // ── Assisted account recovery ──\n\n async requestRecovery(\n input: RequestRecoveryInput,\n options?: RequestOptions,\n ): Promise<RequestRecoveryResult> {\n return this.client.post<RequestRecoveryResult>('/auth/recovery/request', input, options)\n }\n\n /**\n * Cancel with the token from the email. Always returns ok, whether it was valid or already used,\n * so this cannot be used to probe for live recoveries.\n */\n async cancelRecovery(token: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/recovery/cancel', { token }, options)\n }\n\n async recoveryStatus(tempToken: string, options?: RequestOptions): Promise<RecoveryStatusResult> {\n return this.client.get<RecoveryStatusResult>('/auth/recovery/status', { temp_token: tempToken }, options)\n }\n\n /**\n * Complete with a fresh temp token once cooling-off ends. Tokens are persisted; backup codes are\n * returned to the caller only and never stored.\n */\n async completeRecovery(tempToken: string, options?: RequestOptions): Promise<CompleteRecoveryResult> {\n const result = await this.client.post<CompleteRecoveryResult>('/auth/recovery/complete', { temp_token: tempToken }, options)\n await this.client.setSession(result)\n return result\n }\n\n // ── Account recovery review (requires recovery:review) ──\n\n async listRecoveryRequests(\n status: AdminRecoveryRequest['status'] = 'pending',\n options?: RequestOptions,\n ): Promise<{ requests: AdminRecoveryRequest[] }> {\n return this.client.get<{ requests: AdminRecoveryRequest[] }>('/auth/recovery/queue', { status }, options)\n }\n\n async approveRecovery(\n id: string,\n reviewNote: string,\n options?: RequestOptions,\n ): Promise<{ id: string; status: 'approved'; effective_at: string }> {\n return this.client.post<{ id: string; status: 'approved'; effective_at: string }>(\n `/auth/recovery/${id}/approve`,\n { review_note: reviewNote },\n options,\n )\n }\n\n async rejectRecovery(\n id: string,\n reviewNote: string,\n options?: RequestOptions,\n ): Promise<{ id: string; status: 'rejected' }> {\n return this.client.post<{ id: string; status: 'rejected' }>(\n `/auth/recovery/${id}/reject`,\n { review_note: reviewNote },\n options,\n )\n }\n\n async recoveryEvents(id: string, options?: RequestOptions): Promise<{ events: AdminRecoveryEvent[] }> {\n return this.client.get<{ events: AdminRecoveryEvent[] }>(`/auth/recovery/${id}/events`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n Category,\n City,\n Condition,\n CreateListingInput,\n Listing,\n ListingImage,\n ListingStatus,\n ListingsFeedParams,\n PaginatedResponse,\n PresignImageResponse,\n SellerStorefront,\n SimilarListing,\n Store,\n UpdateListingInput,\n RequestOptions,\n} from '../types'\n\nexport class ListingsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the marketplace feed with optional filters.\n */\n async getFeed(params?: ListingsFeedParams, options?: RequestOptions): Promise<PaginatedResponse<Listing>> {\n // APIClient handles converting params to string|number|boolean properly\n return this.client.get<PaginatedResponse<Listing>>(\n '/listings/feed', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get full details of a single listing, including its images.\n */\n async getById(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.client.get<Listing & { images: ListingImage[] }>(`/listings/${id}`, undefined, options)\n }\n\n /**\n * Create a new listing (requires seller role).\n */\n async create(input: CreateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.post<Listing>('/listings', input, options)\n }\n\n /**\n * Update an existing listing.\n */\n async update(id: string, input: UpdateListingInput, options?: RequestOptions): Promise<Listing> {\n return this.client.put<Listing>(`/listings/${id}`, input, options)\n }\n\n /**\n * Change the status of a listing.\n */\n async updateStatus(id: string, status: ListingStatus, options?: RequestOptions): Promise<{ ok: boolean; status: ListingStatus }> {\n return this.client.patch<{ ok: boolean; status: ListingStatus }>(`/listings/${id}/status`, { status }, options)\n }\n\n /**\n * Soft delete a listing (sets status to 'removed').\n */\n async delete(id: string, options?: RequestOptions): Promise<{ ok: boolean }> {\n return this.client.delete<{ ok: boolean }>(`/listings/${id}`, undefined, options)\n }\n\n /**\n * Get a seller's public storefront.\n */\n async getSellerStorefront(\n sellerId: string,\n params?: { page?: number; page_size?: number },\n options?: RequestOptions\n ): Promise<SellerStorefront> {\n return this.client.get<SellerStorefront>(\n `/listings/seller/${sellerId}`, \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * List all supported categories.\n */\n async getCategories(options?: RequestOptions): Promise<Category[]> {\n return this.client.get<Category[]>('/listings/categories', undefined, options)\n }\n\n /**\n * List all supported cities.\n */\n async getCities(options?: RequestOptions): Promise<City[]> {\n return this.client.get<City[]>('/listings/cities', undefined, options)\n }\n\n /**\n * Get trending listings, optionally filtered by category.\n */\n async getTrending(categoryId?: string, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n '/listings/trending',\n categoryId ? { category_id: categoryId } : undefined,\n options\n )\n }\n\n /**\n * Get top-performing stores for the home feed.\n */\n async getTopStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/top-stores', undefined, options)\n }\n\n /**\n * Get personalized \"for you\" listings (returns recent for anonymous users).\n */\n async getForYou(options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>('/listings/for-you', undefined, options)\n }\n\n /**\n * Get a presigned upload URL for a listing image.\n * Index should be between 0 and 9.\n */\n async presignImage(listingId: string, index: number, options?: RequestOptions): Promise<PresignImageResponse> {\n return this.client.post<PresignImageResponse>(`/listings/${listingId}/images/presign`, { index }, options)\n }\n\n /**\n * Upload an image file directly for a listing.\n * Uses multipart/form-data.\n */\n async uploadImage(listingId: string, file: Blob, index: number, options?: RequestOptions): Promise<{ r2_key: string; image_id: string; url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('index', String(index))\n return this.client.post<{ r2_key: string; image_id: string; url: string }>(`/listings/${listingId}/images/upload`, formData, options)\n }\n\n /**\n * Browse the listing feed (alias for getFeed with simplified params).\n */\n async feed(params?: { page?: number; city?: string; category?: string; sort?: string }, options?: RequestOptions): Promise<{ data: Listing[]; page: number }> {\n return this.client.get<{ data: Listing[]; page: number }>(\n '/listings',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a single listing by ID (alias for getById).\n */\n async get(id: string, options?: RequestOptions): Promise<Listing & { images: ListingImage[] }> {\n return this.getById(id, options)\n }\n\n /**\n * Full-text search with filters.\n */\n async search(params: { q: string; category?: string; condition?: Condition; min_price?: number; max_price?: number; sort?: string; page?: number }, options?: RequestOptions): Promise<{ data: Listing[]; total: number }> {\n return this.client.get<{ data: Listing[]; total: number }>(\n '/search',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get similar listings for a given listing.\n */\n async getSimilar(listingId: string, mode?: 'global' | 'store', options?: RequestOptions): Promise<{ data: SimilarListing[] }> {\n return this.client.get<{ data: SimilarListing[] }>(\n `/listings/${listingId}/similar`,\n mode ? { mode } : undefined,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type { PaginatedResponse, SearchParams, SearchResult, SearchHistoryItem, SaveSearchInput, TrendingTerm, RequestOptions } from '../types'\n\nexport class SearchModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Perform a full-text search with optional filters.\n */\n async query(params: SearchParams, options?: RequestOptions): Promise<PaginatedResponse<SearchResult>> {\n return this.client.get<PaginatedResponse<SearchResult>>(\n '/search', \n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get trending search terms.\n */\n async trending(params?: { city_id?: string }, options?: RequestOptions): Promise<{ terms: TrendingTerm[] }> {\n return this.client.get<{ terms: TrendingTerm[] }>(\n '/search/trending',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get the user's search history.\n */\n async getHistory(options?: RequestOptions): Promise<{ data: SearchHistoryItem[] }> {\n return this.client.get<{ data: SearchHistoryItem[] }>('/search/history', undefined, options)\n }\n\n /**\n * Save a search query to history.\n */\n async saveHistory(input: SaveSearchInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/search/history', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateOrderInput, Order, OrderEvent, OrderHistoryParams, OrderStatus, TransitionOrderInput, RequestOptions } from '../types'\n\nexport class OrdersModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Create a new order from a listing.\n */\n async create(input: CreateOrderInput, options?: RequestOptions): Promise<{ order_id: string; total: number; delivery_fee: number }> {\n return this.client.post<{ order_id: string; total: number; delivery_fee: number }>('/orders', input, options)\n }\n\n /**\n * Get full details of an order, including its event timeline.\n */\n async getById(id: string, options?: RequestOptions): Promise<Order & { events: OrderEvent[] }> {\n return this.client.get<Order & { events: OrderEvent[] }>(`/orders/${id}`, undefined, options)\n }\n\n /**\n * Transition the status of an order.\n */\n async transition(id: string, input: TransitionOrderInput, options?: RequestOptions): Promise<{ ok: boolean; status: OrderStatus }> {\n return this.client.post<{ ok: boolean; status: OrderStatus }>(`/orders/${id}/transition`, input, options)\n }\n\n /**\n * Get the order history for the current authenticated user.\n */\n async getHistory(params?: OrderHistoryParams, options?: RequestOptions): Promise<{ data: Order[]; page: number; page_size: number }> {\n return this.client.get<{ data: Order[]; page: number; page_size: number }>(\n '/orders/history',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n}\n","import { APIClient } from '../client'\nimport type {\n CheckoutStatusResponse,\n InitiateCheckoutInput,\n InitiateCheckoutResponse,\n MpesaInput,\n PaystackInput,\n PaystackInitResponse,\n PaymentStatusResponse,\n StkPushInput,\n StkPushResponse,\n RequestOptions,\n} from '../types'\n\nexport class PayModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Initiate an M-Pesa STK Push payment for an order.\n */\n async initiateStk(input: StkPushInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate M-Pesa STK Push (alias for initiateStk).\n */\n async initMpesa(input: MpesaInput, options?: RequestOptions): Promise<StkPushResponse> {\n return this.client.post<StkPushResponse>('/pay/stk', input, options)\n }\n\n /**\n * Initiate a Paystack payment — returns access_code for inline popup.\n */\n async initPaystack(input: PaystackInput, options?: RequestOptions): Promise<PaystackInitResponse> {\n return this.client.post<PaystackInitResponse>('/pay/paystack/init', input, options)\n }\n\n /**\n * Initiate a provider-neutral checkout for an order.\n *\n * The payment provider is selected by the API. Continue checkout using the\n * returned next action, then poll {@link getCheckoutStatus} for payment state.\n * Retrying after cancellation requires the same input and idempotency key.\n *\n * @param input - Order, idempotency key, and buyer-selected payment method.\n * @param options - Request options, including an optional abort signal.\n * @returns The initiated attempt and its required continuation action.\n * @throws {APIError} When the API rejects or cannot initiate the checkout.\n */\n async initiateCheckout(\n input: InitiateCheckoutInput,\n options?: RequestOptions,\n ): Promise<InitiateCheckoutResponse> {\n return this.client.post<InitiateCheckoutResponse>('/pay/checkout/initiate', input, options)\n }\n\n /**\n * Poll for the current status of a payment by its order ID.\n *\n * @deprecated Use {@link getCheckoutStatus} for the typed checkout lifecycle.\n * This method retains its legacy route and response for compatibility.\n */\n async getStatus(orderId: string, options?: RequestOptions): Promise<PaymentStatusResponse> {\n return this.client.get<PaymentStatusResponse>(`/pay/status/${orderId}`, undefined, options)\n }\n\n /**\n * Get the buyer-visible checkout lifecycle for a retail or bale order.\n */\n async getCheckoutStatus(orderId: string, options?: RequestOptions): Promise<CheckoutStatusResponse> {\n return this.client.get<CheckoutStatusResponse>(`/pay/checkout-status/${orderId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { VAZIOutfit, VAZIOutfitDetail, VaziFeedParams, VaziFeedResponse, RequestOptions } from '../types'\n\nexport class VaziModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Browse the AI-curated outfit feed.\n */\n async getFeed(params?: VaziFeedParams, options?: RequestOptions): Promise<VaziFeedResponse> {\n return this.client.get<VaziFeedResponse>(\n '/vazi/feed',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Get a complete outfit built around a specific seed listing.\n */\n async getCompleteLook(listingId: string, options?: RequestOptions): Promise<{ outfits: VAZIOutfit[] }> {\n return this.client.get<{ outfits: VAZIOutfit[] }>(`/vazi/complete/${listingId}`, undefined, options)\n }\n\n /**\n * Get a single outfit by ID with full item details.\n */\n async getOutfit(outfitId: string, options?: RequestOptions): Promise<VAZIOutfitDetail> {\n return this.client.get<VAZIOutfitDetail>(`/vazi/outfits/${outfitId}`, undefined, options)\n }\n}\n","import { APIClient, APIError } from '../client'\nimport { RealtimeProtocolError, RealtimeUnavailableError } from '../types/messages-v2'\nimport type {\n AttachmentUploadStatus,\n ConversationSummary,\n MessageAuthor,\n MessagesRealtimeConnection,\n MessagesRealtimeEvent,\n MessagesRealtimeOptions,\n MessagesRealtimeState,\n MessagesRealtimeTicket,\n ReadCursorResult,\n ThreadCard,\n ThreadMessage,\n ThreadSystemEvent,\n WebSocketCloseEventLike,\n WebSocketLike,\n WebSocketMessageEventLike,\n} from '../types'\n\nconst PROTOCOL = 'mitumba-messaging-v1'\nconst TYPING_THROTTLE_MS = 750\nconst TYPING_CLEAR_MS = 3_000\nconst MAX_DEDUPLICATION_IDS = 2_000\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction isAuthor(value: unknown): value is MessageAuthor {\n if (!isRecord(value)) return false\n if (value.side === 'buyer') return isRecord(value.buyer) && typeof value.buyer.id === 'string'\n return value.side === 'store' && isRecord(value.store) && typeof value.store.id === 'string'\n}\n\nfunction isThreadMessage(value: unknown): value is ThreadMessage {\n return isRecord(value)\n && typeof value.id === 'string'\n && typeof value.thread_id === 'string'\n && Number.isSafeInteger(value.sequence)\n && typeof value.body === 'string'\n && isAuthor(value.author)\n && Array.isArray(value.attachments)\n && typeof value.created_at === 'string'\n}\n\nfunction isThreadCard(value: unknown): value is ThreadCard {\n return isRecord(value)\n && typeof value.id === 'string'\n && typeof value.conversation_id === 'string'\n && ['general', 'listing', 'order'].includes(String(value.kind))\n && typeof value.unread_count === 'number'\n}\n\nfunction isConversation(value: unknown): value is ConversationSummary {\n return isRecord(value)\n && typeof value.id === 'string'\n && isRecord(value.buyer)\n && isRecord(value.store)\n && typeof value.unread_count === 'number'\n}\n\nfunction isSystemEvent(value: unknown): value is ThreadSystemEvent {\n return isRecord(value)\n && typeof value.id === 'string'\n && typeof value.thread_id === 'string'\n && Number.isSafeInteger(value.sequence)\n && value.kind === 'thread.linked'\n}\n\nfunction isReadCursor(value: unknown): value is ReadCursorResult {\n return isRecord(value)\n && typeof value.thread_id === 'string'\n && typeof value.last_read_item_id === 'string'\n && Number.isSafeInteger(value.last_read_sequence)\n}\n\nfunction isUpload(value: unknown): value is AttachmentUploadStatus {\n return isRecord(value)\n && typeof value.id === 'string'\n && typeof value.thread_id === 'string'\n && ['authorized', 'uploaded', 'pending_scan', 'safe', 'rejected', 'expired', 'claimed'].includes(String(value.state))\n}\n\nfunction validDurablePayload(type: string, payload: unknown): boolean {\n if (!isRecord(payload)) return false\n if (type === 'message.created') return isThreadMessage(payload.message)\n if (type === 'system_event.created') return isSystemEvent(payload.event)\n if (type === 'conversation.updated') return isConversation(payload.conversation)\n if (type === 'thread.created' || type === 'thread.updated') return isThreadCard(payload.thread)\n if (type === 'read_cursor.updated') return isReadCursor(payload.cursor)\n if (type === 'attachment.updated') return isUpload(payload.upload)\n return type === 'message.policy_applied'\n && typeof payload.message_id === 'string'\n && Array.isArray(payload.notices)\n && payload.notices.every((notice) => typeof notice === 'string')\n}\n\nfunction parseEvent(value: unknown): MessagesRealtimeEvent | { type: 'ready'; resume_cursor: string | null } {\n if (!isRecord(value) || value.api_version !== 2 || value.protocol_version !== 1 || typeof value.type !== 'string') {\n throw new RealtimeProtocolError()\n }\n if (value.type === 'ready') {\n if (typeof value.connection_id !== 'string' || (value.resume_cursor !== null && typeof value.resume_cursor !== 'string')) {\n throw new RealtimeProtocolError()\n }\n return { type: 'ready', resume_cursor: value.resume_cursor as string | null }\n }\n if (value.type === 'typing.updated') {\n if (typeof value.thread_id !== 'string' || !isAuthor(value.author) || typeof value.is_typing !== 'boolean' || typeof value.occurred_at !== 'string') {\n throw new RealtimeProtocolError()\n }\n return value as unknown as MessagesRealtimeEvent\n }\n if (value.type === 'resync.required') {\n if (!['cursor_expired', 'gap_detected', 'authorization_changed'].includes(String(value.reason)) || typeof value.resume_cursor !== 'string') {\n throw new RealtimeProtocolError()\n }\n return value as unknown as MessagesRealtimeEvent\n }\n const durableTypes = [\n 'message.created', 'system_event.created', 'conversation.updated', 'thread.created',\n 'thread.updated', 'read_cursor.updated', 'attachment.updated', 'message.policy_applied',\n ]\n if (!durableTypes.includes(value.type)\n || typeof value.event_id !== 'string'\n || typeof value.resume_cursor !== 'string'\n || typeof value.occurred_at !== 'string'\n || !validDurablePayload(value.type, value.payload)) {\n throw new RealtimeProtocolError()\n }\n return value as unknown as MessagesRealtimeEvent\n}\n\nfunction ticketPath(options: MessagesRealtimeOptions): string {\n return options.perspective.kind === 'buyer'\n ? '/notify/v2/inboxes/buyer/realtime/tickets'\n : `/notify/v2/inboxes/stores/${encodeURIComponent(options.perspective.store_id)}/realtime/tickets`\n}\n\nfunction parseTicket(value: unknown): MessagesRealtimeTicket {\n if (!isRecord(value) || value.api_version !== 2 || !isRecord(value.data)) throw new RealtimeProtocolError()\n const ticket = value.data\n if (typeof ticket.ticket !== 'string'\n || typeof ticket.expires_at !== 'string'\n || typeof ticket.websocket_url !== 'string'\n || ticket.websocket_protocol !== PROTOCOL\n || ticket.protocol_version !== 1\n || (ticket.resume_cursor !== null && typeof ticket.resume_cursor !== 'string')) {\n throw new RealtimeProtocolError()\n }\n let url: URL\n try {\n url = new URL(ticket.websocket_url)\n } catch {\n throw new RealtimeProtocolError()\n }\n if (!['ws:', 'wss:'].includes(url.protocol) || url.searchParams.has('token') || !url.searchParams.has('ticket')) {\n throw new RealtimeProtocolError()\n }\n return ticket as unknown as MessagesRealtimeTicket\n}\n\nexport class ManagedMessagesRealtimeConnection implements MessagesRealtimeConnection {\n private currentState: MessagesRealtimeState = 'closed'\n private currentCursor: string | null\n private socket: WebSocketLike | null = null\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private typingTimers = new Map<string, ReturnType<typeof setTimeout>>()\n private typingSentAt = new Map<string, number>()\n private eventListeners = new Set<(event: MessagesRealtimeEvent) => void | Promise<void>>()\n private stateListeners = new Set<(state: MessagesRealtimeState) => void>()\n private subscribedThreads = new Set<string>()\n private seenEventIds = new Set<string>()\n private lastMessageSequence = new Map<string, number>()\n private explicitClose = false\n private reconnectAttempt = 0\n private startPromise: Promise<void> | null = null\n private resolveStart: (() => void) | null = null\n private rejectStart: ((error: unknown) => void) | null = null\n private readonly onOpen = (): void => undefined\n private readonly onMessage = (event: WebSocketMessageEventLike): void => { void this.handleMessage(event) }\n private readonly onClose = (event: WebSocketCloseEventLike): void => { this.handleClose(event) }\n private readonly onError = (): void => undefined\n\n constructor(\n private readonly client: APIClient,\n private readonly options: MessagesRealtimeOptions,\n ) {\n this.currentCursor = options.resumeCursor ?? null\n }\n\n get state(): MessagesRealtimeState { return this.currentState }\n get resumeCursor(): string | null { return this.currentCursor }\n\n onEvent(listener: (event: MessagesRealtimeEvent) => void | Promise<void>): () => void {\n this.eventListeners.add(listener)\n return () => { this.eventListeners.delete(listener) }\n }\n\n onStateChange(listener: (state: MessagesRealtimeState) => void): () => void {\n this.stateListeners.add(listener)\n return () => { this.stateListeners.delete(listener) }\n }\n\n subscribeThread(threadId: string): void { this.subscribedThreads.add(threadId) }\n\n unsubscribeThread(threadId: string): void {\n this.clearTyping(threadId, true)\n this.subscribedThreads.delete(threadId)\n }\n\n setTyping(threadId: string, isTyping: boolean): void {\n if (!this.subscribedThreads.has(threadId) || this.currentState !== 'open' || !this.socket) return\n const now = Date.now()\n const last = this.typingSentAt.get(threadId) ?? 0\n if (now - last < TYPING_THROTTLE_MS) return\n this.send({ protocol_version: 1, type: 'typing.set', thread_id: threadId, is_typing: isTyping })\n this.typingSentAt.set(threadId, now)\n const existing = this.typingTimers.get(threadId)\n if (existing) clearTimeout(existing)\n if (isTyping) {\n this.typingTimers.set(threadId, setTimeout(() => {\n this.typingSentAt.delete(threadId)\n this.setTyping(threadId, false)\n this.typingTimers.delete(threadId)\n }, TYPING_CLEAR_MS))\n } else {\n this.typingTimers.delete(threadId)\n }\n }\n\n async start(): Promise<void> {\n if (this.explicitClose) throw new RealtimeUnavailableError()\n if (this.currentState === 'open') return\n if (this.startPromise) return this.startPromise\n const pending = new Promise<void>((resolve, reject) => {\n this.resolveStart = resolve\n this.rejectStart = reject\n })\n this.startPromise = pending\n await this.open(false).catch((error: unknown) => {\n if (error instanceof RealtimeProtocolError\n || error instanceof RealtimeUnavailableError\n || (error instanceof APIError && [401, 403, 409].includes(error.status))) {\n this.fail(error)\n } else {\n this.scheduleReconnect()\n }\n })\n return pending\n }\n\n close(): void {\n this.explicitClose = true\n this.clearReconnect()\n this.clearAllTyping()\n this.detachSocket(true)\n this.transition('closed')\n this.resolveStart?.()\n this.finishStart()\n this.eventListeners.clear()\n this.stateListeners.clear()\n }\n\n private async open(reconnecting: boolean): Promise<void> {\n this.transition(reconnecting ? 'reconnecting' : 'connecting')\n const raw = await this.client.post<unknown>(ticketPath(this.options), {\n resume_cursor: this.currentCursor,\n supported_protocol_versions: [1],\n }, { signal: this.options.signal })\n if (this.explicitClose) return\n const ticket = parseTicket(raw)\n const socket = this.client.createWebSocket(ticket.websocket_url, ticket.websocket_protocol)\n this.socket = socket\n socket.addEventListener('open', this.onOpen)\n socket.addEventListener('message', this.onMessage)\n socket.addEventListener('close', this.onClose)\n socket.addEventListener('error', this.onError)\n }\n\n private async handleMessage(event: WebSocketMessageEventLike): Promise<void> {\n try {\n if (typeof event.data !== 'string') throw new RealtimeProtocolError()\n let decoded: unknown\n try { decoded = JSON.parse(event.data) } catch { throw new RealtimeProtocolError() }\n const parsed = parseEvent(decoded)\n if (parsed.type === 'ready') {\n this.currentCursor = parsed.resume_cursor ?? this.currentCursor\n this.reconnectAttempt = 0\n this.transition('open')\n this.resolveStart?.()\n this.finishStart()\n return\n }\n if ('event_id' in parsed) {\n if (this.seenEventIds.has(parsed.event_id)) {\n this.ack(parsed.event_id, parsed.resume_cursor)\n return\n }\n if (parsed.type === 'message.created') {\n const message = parsed.payload.message\n const previous = this.lastMessageSequence.get(message.thread_id) ?? 0\n if (message.sequence <= previous) {\n this.remember(parsed.event_id)\n this.ack(parsed.event_id, parsed.resume_cursor)\n return\n }\n this.lastMessageSequence.set(message.thread_id, message.sequence)\n }\n if (parsed.thread_id && this.subscribedThreads.size > 0 && !this.subscribedThreads.has(parsed.thread_id)) {\n this.remember(parsed.event_id)\n this.ack(parsed.event_id, parsed.resume_cursor)\n return\n }\n } else if (parsed.type === 'typing.updated' && !this.subscribedThreads.has(parsed.thread_id)) {\n return\n }\n\n for (const listener of [...this.eventListeners]) await listener(parsed)\n if ('event_id' in parsed) {\n this.remember(parsed.event_id)\n this.currentCursor = parsed.resume_cursor\n this.ack(parsed.event_id, parsed.resume_cursor)\n } else if (parsed.type === 'resync.required') {\n this.currentCursor = parsed.resume_cursor\n }\n } catch (error) {\n this.fail(error instanceof RealtimeProtocolError ? error : new RealtimeProtocolError())\n this.socket?.close(4004, 'protocol_error')\n }\n }\n\n private handleClose(event: WebSocketCloseEventLike): void {\n this.detachSocket(false)\n this.clearAllTyping()\n if (this.explicitClose) return\n if ([4002, 4003, 4004].includes(event.code)) {\n this.fail(new RealtimeProtocolError())\n return\n }\n this.scheduleReconnect()\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer || this.explicitClose) return\n this.transition('reconnecting')\n const base = Math.max(10, this.options.reconnectBaseDelayMs ?? 500)\n const maximum = Math.max(base, this.options.reconnectMaxDelayMs ?? 30_000)\n const cap = Math.min(maximum, base * (2 ** this.reconnectAttempt))\n const random = this.options.random ?? Math.random\n const delay = Math.floor(random() * cap)\n this.reconnectAttempt += 1\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null\n void this.open(true).catch((error: unknown) => {\n if (error instanceof APIError && [401, 403].includes(error.status)) this.fail(error)\n else this.scheduleReconnect()\n })\n }, delay)\n }\n\n private ack(eventId: string, cursor: string): void {\n this.send({ protocol_version: 1, type: 'ack', event_id: eventId, resume_cursor: cursor })\n }\n\n private send(frame: unknown): void {\n if (!this.socket || this.currentState !== 'open') return\n try { this.socket.send(JSON.stringify(frame)) } catch { /* close/reconnect owns recovery */ }\n }\n\n private remember(eventId: string): void {\n this.seenEventIds.add(eventId)\n if (this.seenEventIds.size <= MAX_DEDUPLICATION_IDS) return\n const oldest = this.seenEventIds.values().next().value\n if (typeof oldest === 'string') this.seenEventIds.delete(oldest)\n }\n\n private clearTyping(threadId: string, sendFalse: boolean): void {\n const timer = this.typingTimers.get(threadId)\n if (timer) clearTimeout(timer)\n this.typingTimers.delete(threadId)\n this.typingSentAt.delete(threadId)\n if (sendFalse && this.subscribedThreads.has(threadId)) {\n this.send({ protocol_version: 1, type: 'typing.set', thread_id: threadId, is_typing: false })\n }\n }\n\n private clearAllTyping(): void {\n for (const timer of this.typingTimers.values()) clearTimeout(timer)\n this.typingTimers.clear()\n this.typingSentAt.clear()\n }\n\n private clearReconnect(): void {\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n\n private detachSocket(close: boolean): void {\n const socket = this.socket\n if (!socket) return\n socket.removeEventListener('open', this.onOpen)\n socket.removeEventListener('message', this.onMessage)\n socket.removeEventListener('close', this.onClose)\n socket.removeEventListener('error', this.onError)\n if (close) {\n try { socket.close(1000, 'client_close') } catch { /* already closed */ }\n }\n this.socket = null\n }\n\n private transition(state: MessagesRealtimeState): void {\n if (this.currentState === state) return\n this.currentState = state\n for (const listener of [...this.stateListeners]) listener(state)\n }\n\n private fail(error: unknown): void {\n this.clearReconnect()\n this.transition('failed')\n this.rejectStart?.(error)\n this.finishStart()\n }\n\n private finishStart(): void {\n this.resolveStart = null\n this.rejectStart = null\n this.startPromise = null\n }\n}\n","import { APIClient, APIError } from '../client'\nimport type {\n AttachmentDownloadAuthorization,\n AttachmentUploadAuthorization,\n AttachmentUploadBody,\n AttachmentUploadStatus,\n BuyerResolveThreadInput,\n ConversationSummary,\n CreateAttachmentUploadInput,\n CreateMessageReportInput,\n CreateMessageReportResult,\n CursorPage,\n LegacyLinkResolution,\n LegacyMessageArchiveSummary,\n LegacyMessagePage,\n ListConversationsParams,\n ListThreadMessagesParams,\n ListThreadsParams,\n MessagePage,\n MessagingCapabilities,\n MessagingIdempotentRequestOptions,\n MessagingBlockInput,\n MessagingBlockRemovedResult,\n MessagingBlockResult,\n MessagingInboxes,\n MessagingPerspective,\n MessagesRealtimeConnection,\n MessagesRealtimeOptions,\n ReadCursorResult,\n RequestOptions,\n ResolveThreadResult,\n SendThreadMessageInput,\n SendThreadMessageResult,\n StoreResolveThreadInput,\n ThreadCard,\n ThreadId,\n UpdateConversationPreferencesInput,\n UpdateThreadPreferencesInput,\n} from '../types'\nimport { ManagedMessagesRealtimeConnection } from '../realtime/messages-realtime'\n\nfunction encode(value: string): string {\n return encodeURIComponent(value)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction unwrap<T>(value: unknown, valid: (data: unknown) => boolean = () => true): T {\n if (!isRecord(value) || value.api_version !== 2 || !('data' in value) || !valid(value.data)) {\n throw new APIError(502, { error: 'invalid_response', message: 'Messaging returned an invalid response.' })\n }\n return value.data as T\n}\n\nfunction isPage(value: unknown): boolean {\n return isRecord(value) && Array.isArray(value.items)\n}\n\nfunction isIdentified(value: unknown): boolean {\n return isRecord(value) && typeof value.id === 'string'\n}\n\nfunction perspectiveBase(perspective: MessagingPerspective): string {\n return perspective.kind === 'buyer'\n ? '/notify/v2/inboxes/buyer'\n : `/notify/v2/inboxes/stores/${encode(perspective.store_id)}`\n}\n\nfunction query(params: object): Record<string, string | number | boolean | undefined> | undefined {\n const entries = Object.entries(params) as Array<[string, string | number | boolean | undefined]>\n return entries.some(([, value]) => value !== undefined) ? Object.fromEntries(entries) : undefined\n}\n\nfunction idempotentOptions(options: MessagingIdempotentRequestOptions): RequestOptions {\n if (!options.idempotencyKey.trim()) throw new TypeError('idempotencyKey is required.')\n return {\n signal: options.signal,\n headers: { ...options.headers, 'Idempotency-Key': options.idempotencyKey },\n }\n}\n\nfunction validateLimit(params: { limit?: number }): void {\n if (params.limit !== undefined && (!Number.isInteger(params.limit) || params.limit < 1 || params.limit > 100)) {\n throw new RangeError('Messaging limit must be an integer from 1 through 100.')\n }\n}\n\nfunction validateSendInput(input: SendThreadMessageInput): void {\n if (!input.client_message_id.trim()) throw new TypeError('client_message_id is required.')\n const length = input.body.trim().length\n if (length < 1 || length > 2_000) throw new RangeError('Message body must contain 1 to 2,000 characters after trimming.')\n}\n\nfunction validateAttachmentInput(input: CreateAttachmentUploadInput): void {\n if (!input.file_name.trim() || !input.content_type.trim()) throw new TypeError('Attachment file name and content type are required.')\n if (!Number.isSafeInteger(input.size_bytes) || input.size_bytes < 1) throw new RangeError('Attachment size must be a positive integer.')\n if (!/^[a-f0-9]{64}$/u.test(input.sha256)) throw new TypeError('Attachment SHA-256 must be lowercase hexadecimal.')\n}\n\nfunction uploadBodySize(body: AttachmentUploadBody): number {\n if ('size' in body) return body.size\n return body.byteLength\n}\n\nasync function parseDirectResponse<T>(response: Response): Promise<T> {\n let decoded: unknown\n try {\n decoded = await response.json()\n } catch {\n throw new APIError(response.status || 502, { error: 'invalid_response', message: 'Messaging returned an invalid response.' })\n }\n if (!response.ok) {\n const error = isRecord(decoded) && isRecord(decoded.error)\n ? decoded.error\n : decoded\n throw new APIError(response.status, {\n error: isRecord(error) && typeof error.code === 'string'\n ? error.code\n : isRecord(error) && typeof error.error === 'string'\n ? error.error\n : 'unknown_error',\n message: isRecord(error) && typeof error.message === 'string' ? error.message : response.statusText,\n details: isRecord(error) ? error.details : undefined,\n })\n }\n return unwrap<T>(decoded)\n}\n\nexport class MessagesModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Create a bilateral block from a v2 inbox perspective. A buyer blocks a store (`{ store_id }`);\n * a store blocks a buyer (`{ buyer_id }`). Idempotent.\n */\n async createMessagingBlock(\n perspective: MessagingPerspective,\n input: MessagingBlockInput,\n options?: RequestOptions,\n ): Promise<MessagingBlockResult> {\n const value = await this.client.post<unknown>(`${perspectiveBase(perspective)}/blocks`, input, options)\n return unwrap<MessagingBlockResult>(value, isIdentified)\n }\n\n /** Remove a block the current perspective created. */\n async removeMessagingBlock(\n perspective: MessagingPerspective,\n blockId: string,\n options?: RequestOptions,\n ): Promise<MessagingBlockRemovedResult> {\n const value = await this.client.delete<unknown>(`${perspectiveBase(perspective)}/blocks/${encode(blockId)}`, undefined, options)\n return unwrap<MessagingBlockRemovedResult>(value, isRecord)\n }\n\n /** File a message or conversation report from a v2 inbox perspective. Idempotent on open reports. */\n async createMessagingReport(\n perspective: MessagingPerspective,\n input: CreateMessageReportInput,\n options?: RequestOptions,\n ): Promise<CreateMessageReportResult> {\n const value = await this.client.post<unknown>(`${perspectiveBase(perspective)}/reports`, input, options)\n return unwrap<CreateMessageReportResult>(value, isIdentified)\n }\n\n /** Discover server messaging capabilities. */\n async getMessagingCapabilities(options?: RequestOptions): Promise<MessagingCapabilities> {\n const value = await this.client.get<unknown>('/notify/v2/capabilities', undefined, options)\n return unwrap<MessagingCapabilities>(value, isRecord)\n }\n\n /** List buyer and represented-store inbox perspectives. */\n async listMessagingInboxes(options?: RequestOptions): Promise<MessagingInboxes> {\n const value = await this.client.get<unknown>('/notify/v2/inboxes', undefined, options)\n return unwrap<MessagingInboxes>(value, isRecord)\n }\n\n /** List personal buyer conversations. */\n async listConversations(params: ListConversationsParams = {}, options?: RequestOptions): Promise<CursorPage<ConversationSummary>> {\n validateLimit(params)\n const value = await this.client.get<unknown>('/notify/v2/inboxes/buyer/conversations', query(params), options)\n return unwrap<CursorPage<ConversationSummary>>(value, isPage)\n }\n\n /** List conversations for one represented store. */\n async listStoreConversations(storeId: string, params: ListConversationsParams = {}, options?: RequestOptions): Promise<CursorPage<ConversationSummary>> {\n validateLimit(params)\n const value = await this.client.get<unknown>(`/notify/v2/inboxes/stores/${encode(storeId)}/conversations`, query(params), options)\n return unwrap<CursorPage<ConversationSummary>>(value, isPage)\n }\n\n /** Get one authorized buyer/store conversation. */\n async getConversation(perspective: MessagingPerspective, conversationId: string, options?: RequestOptions): Promise<ConversationSummary> {\n const value = await this.client.get<unknown>(`${perspectiveBase(perspective)}/conversations/${encode(conversationId)}`, undefined, options)\n const data = unwrap<{ conversation: ConversationSummary }>(value, isRecord)\n if (!isIdentified(data.conversation)) throw new APIError(502, { error: 'invalid_response' })\n return data.conversation\n }\n\n /** Resolve a General, Listing, or Order thread idempotently. */\n async resolveThread(\n perspective: MessagingPerspective,\n input: BuyerResolveThreadInput | StoreResolveThreadInput,\n options: MessagingIdempotentRequestOptions,\n ): Promise<ResolveThreadResult> {\n const value = await this.client.post<unknown>(`${perspectiveBase(perspective)}/threads/resolve`, input, idempotentOptions(options))\n return unwrap<ResolveThreadResult>(value, (data) => isRecord(data) && isIdentified(data.thread) && isIdentified(data.conversation))\n }\n\n /** List contextual thread cards for one conversation. */\n async listThreads(\n perspective: MessagingPerspective,\n conversationId: string,\n params: ListThreadsParams = {},\n options?: RequestOptions,\n ): Promise<CursorPage<ThreadCard>> {\n validateLimit(params)\n const value = await this.client.get<unknown>(\n `${perspectiveBase(perspective)}/conversations/${encode(conversationId)}/threads`,\n query(params),\n options,\n )\n return unwrap<CursorPage<ThreadCard>>(value, isPage)\n }\n\n /** Get one contextual thread card and its conversation. */\n async getConversationThread(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n options?: RequestOptions,\n ): Promise<{ conversation: ConversationSummary; thread: ThreadCard }> {\n const value = await this.client.get<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}`, undefined, options)\n return unwrap(value, (data) => isRecord(data) && isIdentified(data.thread) && isIdentified(data.conversation))\n }\n\n /** Update shared support status for a Listing or Order thread. */\n async updateThreadStatus(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n status: 'open' | 'resolved',\n options?: RequestOptions,\n ): Promise<ThreadCard> {\n const value = await this.client.patch<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}/status`, { status }, options)\n const data = unwrap<{ thread: ThreadCard }>(value, isRecord)\n if (!isIdentified(data.thread)) throw new APIError(502, { error: 'invalid_response' })\n return data.thread\n }\n\n /** Update perspective-private thread preferences. */\n async updateThreadPreferences(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n preferences: UpdateThreadPreferencesInput,\n options?: RequestOptions,\n ): Promise<ThreadCard> {\n const value = await this.client.patch<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}/preferences`, preferences, options)\n const data = unwrap<{ thread: ThreadCard }>(value, isRecord)\n if (!isIdentified(data.thread)) throw new APIError(502, { error: 'invalid_response' })\n return data.thread\n }\n\n /** Update perspective-private conversation preferences. */\n async updateConversationPreferences(\n perspective: MessagingPerspective,\n conversationId: string,\n preferences: UpdateConversationPreferencesInput,\n options?: RequestOptions,\n ): Promise<ConversationSummary> {\n const value = await this.client.patch<unknown>(`${perspectiveBase(perspective)}/conversations/${encode(conversationId)}/preferences`, preferences, options)\n const data = unwrap<{ conversation: ConversationSummary }>(value, isRecord)\n if (!isIdentified(data.conversation)) throw new APIError(502, { error: 'invalid_response' })\n return data.conversation\n }\n\n /** List the newest, older, or catch-up timeline window for one thread. */\n async listThreadMessages(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n params: ListThreadMessagesParams = {},\n options?: RequestOptions,\n ): Promise<MessagePage> {\n validateLimit(params)\n const value = await this.client.get<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}/messages`, query(params), options)\n return unwrap<MessagePage>(value, isPage)\n }\n\n /** Send one idempotent message without ever replacing the caller-owned ID. */\n async sendThreadMessage(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n input: SendThreadMessageInput,\n options?: RequestOptions,\n ): Promise<SendThreadMessageResult> {\n validateSendInput(input)\n const { client_message_id, ...body } = input\n const value = await this.client.post<unknown>(\n `${perspectiveBase(perspective)}/threads/${encode(threadId)}/messages`,\n body,\n { ...options, headers: { ...options?.headers, 'Idempotency-Key': client_message_id } },\n )\n return unwrap<SendThreadMessageResult>(value, (data) => isRecord(data) && isIdentified(data.message))\n }\n\n /** Advance the selected perspective read cursor to one visible timeline item. */\n async advanceThreadReadCursor(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n timelineItemId: string,\n options?: RequestOptions,\n ): Promise<ReadCursorResult> {\n const value = await this.client.put<unknown>(\n `${perspectiveBase(perspective)}/threads/${encode(threadId)}/read-cursor`,\n { timeline_item_id: timelineItemId },\n options,\n )\n return unwrap<ReadCursorResult>(value, (data) => isRecord(data) && typeof data.last_read_sequence === 'number')\n }\n\n /** List read-only exact-participant legacy archives. */\n async listLegacyMessageArchives(params: ListConversationsParams = {}, options?: RequestOptions): Promise<CursorPage<LegacyMessageArchiveSummary>> {\n validateLimit(params)\n const value = await this.client.get<unknown>('/notify/v2/legacy-messages', query(params), options)\n return unwrap<CursorPage<LegacyMessageArchiveSummary>>(value, isPage)\n }\n\n /** List messages in one read-only legacy archive. */\n async listLegacyMessages(legacyThreadId: string, params: ListThreadMessagesParams = {}, options?: RequestOptions): Promise<LegacyMessagePage> {\n validateLimit(params)\n const value = await this.client.get<unknown>(`/notify/v2/legacy-messages/${encode(legacyThreadId)}`, query(params), options)\n return unwrap<LegacyMessagePage>(value, isPage)\n }\n\n /** Resolve a temporary partner/order link without guessing between stores. */\n async resolveLegacyLink(\n input: { partner_id: string; store_id: string | null; order_id: string | null },\n options?: RequestOptions,\n ): Promise<LegacyLinkResolution> {\n const value = await this.client.post<unknown>('/notify/v2/inboxes/buyer/legacy-links/resolve', input, options)\n return unwrap<LegacyLinkResolution>(value, (data) => isRecord(data) && typeof data.result === 'string')\n }\n\n /** Authorize a private attachment upload for one thread. */\n async createThreadAttachmentUpload(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n input: CreateAttachmentUploadInput,\n options?: RequestOptions,\n ): Promise<AttachmentUploadAuthorization> {\n validateAttachmentInput(input)\n const value = await this.client.post<unknown>(`${perspectiveBase(perspective)}/threads/${encode(threadId)}/attachment-uploads`, input, options)\n return unwrap<AttachmentUploadAuthorization>(value, (data) => isRecord(data) && data.state === 'authorized' && typeof data.upload_url === 'string')\n }\n\n /** Upload exact bytes through a one-use application ticket. */\n async uploadThreadAttachment(\n authorization: AttachmentUploadAuthorization,\n body: AttachmentUploadBody,\n options?: RequestOptions,\n ): Promise<AttachmentUploadStatus> {\n if (uploadBodySize(body) !== authorization.accepted.size_bytes) {\n throw new RangeError('Attachment body size does not match its authorization.')\n }\n const response = await fetch(authorization.upload_url, {\n method: 'PUT',\n headers: { ...options?.headers, 'Content-Type': authorization.accepted.content_type },\n body: body as BodyInit,\n signal: options?.signal,\n })\n return parseDirectResponse<AttachmentUploadStatus>(response)\n }\n\n /** Get current status for an upload created by the same perspective. */\n async getThreadAttachmentUpload(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n uploadId: string,\n options?: RequestOptions,\n ): Promise<AttachmentUploadStatus> {\n const value = await this.client.get<unknown>(\n `${perspectiveBase(perspective)}/threads/${encode(threadId)}/attachment-uploads/${encode(uploadId)}`,\n undefined,\n options,\n )\n return unwrap<AttachmentUploadStatus>(value, (data) => isRecord(data) && typeof data.state === 'string')\n }\n\n /** Create a short-lived mediated download for one committed attachment. */\n async createThreadAttachmentDownload(\n perspective: MessagingPerspective,\n threadId: ThreadId,\n attachmentId: string,\n options?: RequestOptions,\n ): Promise<AttachmentDownloadAuthorization> {\n const value = await this.client.post<unknown>(\n `${perspectiveBase(perspective)}/threads/${encode(threadId)}/attachments/${encode(attachmentId)}/download`,\n undefined,\n options,\n )\n return unwrap<AttachmentDownloadAuthorization>(value, (data) => isRecord(data) && typeof data.url === 'string')\n }\n\n /** Create an inert managed realtime connection. Register listeners before start(). */\n createMessagesRealtimeConnection(options: MessagesRealtimeOptions): MessagesRealtimeConnection {\n return new ManagedMessagesRealtimeConnection(this.client, options)\n }\n\n /** Create and start a managed realtime connection. */\n async connectMessagesRealtime(options: MessagesRealtimeOptions): Promise<MessagesRealtimeConnection> {\n const connection = this.createMessagesRealtimeConnection(options)\n await connection.start()\n return connection\n }\n}\n","import { APIClient } from '../client'\nimport type { Notification, RequestOptions } from '../types'\n\nexport class NotificationsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List paginated notifications with unread count.\n */\n async list(page?: number, options?: RequestOptions): Promise<{ data: Notification[]; unread_count: number; page: number }> {\n return this.client.get<{ data: Notification[]; unread_count: number; page: number }>(\n '/notify/notifications',\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Mark notifications as read. If ids omitted, marks all as read.\n */\n async markRead(ids?: string[], options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/notifications/read', ids ? { ids } : {}, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateStoreInput, UpdateStoreInput, StoreStats, StoreSettings, StoreAnalytics, Listing, Store, FollowedStore, RequestOptions } from '../types'\n\nexport class StoresModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Get a store by its URL slug.\n */\n async getBySlug(slug: string, options?: RequestOptions): Promise<Store> {\n return this.client.get<Store>(`/listings/stores/${slug}`, undefined, options)\n }\n\n /**\n * Follow a store.\n */\n async follow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/stores/${storeId}/follow`, undefined, options)\n }\n\n /**\n * Unfollow a store.\n */\n async unfollow(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/stores/${storeId}/follow`, undefined, options)\n }\n\n /**\n * Get paginated listings for a specific store.\n */\n async getListings(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Listing[] }> {\n return this.client.get<{ data: Listing[] }>(\n `/listings/stores/${storeId}/listings`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Get all stores owned by the authenticated user.\n */\n async getMyStores(options?: RequestOptions): Promise<{ data: Store[] }> {\n return this.client.get<{ data: Store[] }>('/listings/stores/mine', undefined, options)\n }\n\n /**\n * Get stores the authenticated user follows.\n */\n async getFollowing(params?: { page?: number }, options?: RequestOptions): Promise<{ data: FollowedStore[]; page: number; page_size: number }> {\n return this.client.get<{ data: FollowedStore[]; page: number; page_size: number }>(\n '/listings/stores/following',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /**\n * Create a new store.\n */\n async create(input: CreateStoreInput, options?: RequestOptions): Promise<{ id: string; slug: string }> {\n return this.client.post<{ id: string; slug: string }>('/listings/stores', input, options)\n }\n\n /**\n * Update a store's details.\n */\n async update(storeId: string, input: UpdateStoreInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}`, input, options)\n }\n\n /**\n * Get store statistics.\n */\n async getStats(storeId: string, options?: RequestOptions): Promise<StoreStats> {\n return this.client.get<StoreStats>(`/listings/stores/${storeId}/stats`, undefined, options)\n }\n\n /**\n * Get store settings.\n */\n async getSettings(storeId: string, options?: RequestOptions): Promise<StoreSettings> {\n return this.client.get<StoreSettings>(`/listings/stores/${storeId}/settings`, undefined, options)\n }\n\n /**\n * Update store settings (partial).\n */\n async updateSettings(storeId: string, input: Partial<StoreSettings>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/stores/${storeId}/settings`, input, options)\n }\n\n /**\n * Get store analytics.\n */\n async getAnalytics(storeId: string, period?: 'daily' | 'weekly' | 'monthly', options?: RequestOptions): Promise<StoreAnalytics> {\n return this.client.get<StoreAnalytics>(\n `/listings/stores/${storeId}/analytics`,\n period ? { period } : undefined,\n options\n )\n }\n\n /**\n * Upload a store logo image.\n */\n async uploadLogo(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/logo`, formData, options)\n }\n\n /**\n * Upload a store banner image.\n */\n async uploadBanner(storeId: string, file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>(`/listings/stores/${storeId}/banner`, formData, options)\n }\n\n /**\n * Delete a store. Blocked if active orders, pending payouts, or open disputes exist.\n */\n async delete(storeId: string, options?: RequestOptions): Promise<{ ok: true } | { blocked: true; reasons: string[] }> {\n return this.client.delete<{ ok: true } | { blocked: true; reasons: string[] }>(`/listings/stores/${storeId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateReviewInput, Review, ReviewableOrder, RequestOptions } from '../types'\n\nexport class ReviewsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List reviews for a store (public).\n */\n async list(storeId: string, page?: number, options?: RequestOptions): Promise<{ data: Review[]; total: number; avg_rating: number; page: number }> {\n return this.client.get<{ data: Review[]; total: number; avg_rating: number; page: number }>(\n `/listings/stores/${storeId}/reviews`,\n page !== undefined ? { page } : undefined,\n options\n )\n }\n\n /**\n * Create a review for a store (authenticated).\n */\n async create(storeId: string, input: CreateReviewInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>(`/listings/stores/${storeId}/reviews`, input, options)\n }\n\n /**\n * Get orders eligible for review (delivered/completed, not yet reviewed).\n */\n async getReviewableOrders(storeId: string, options?: RequestOptions): Promise<{ data: ReviewableOrder[] }> {\n return this.client.get<{ data: ReviewableOrder[] }>(`/listings/stores/${storeId}/reviews/eligible`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { WishlistListing, RequestOptions } from '../types'\n\nexport class WishlistsModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List saved listings.\n */\n async list(options?: RequestOptions): Promise<{ data: WishlistListing[] }> {\n return this.client.get<{ data: WishlistListing[] }>('/listings/wishlists', undefined, options)\n }\n\n /**\n * Add a listing to the wishlist.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/wishlists/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the wishlist.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/wishlists/${listingId}`, undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CartItem, RequestOptions } from '../types'\n\nexport class CartModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * List items in the cart.\n */\n async list(options?: RequestOptions): Promise<{ data: CartItem[] }> {\n return this.client.get<{ data: CartItem[] }>('/listings/cart', undefined, options)\n }\n\n /**\n * Add a listing to the cart.\n */\n async add(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/listings/cart/${listingId}`, undefined, options)\n }\n\n /**\n * Remove a listing from the cart.\n */\n async remove(listingId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/cart/${listingId}`, undefined, options)\n }\n\n /**\n * Update the quantity of a cart item.\n */\n async updateQuantity(listingId: string, quantity: number, options?: RequestOptions): Promise<{ ok: true; quantity: number }> {\n return this.client.patch<{ ok: true; quantity: number }>(`/listings/cart/${listingId}`, { quantity }, options)\n }\n\n /**\n * Checkout the cart — creates orders grouped by store and clears the cart.\n */\n async checkout(options?: RequestOptions): Promise<{ order_ids: string[]; count: number }> {\n return this.client.post<{ order_ids: string[]; count: number }>('/orders/checkout', undefined, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n UpdateProfileInput,\n ChangePasswordInput,\n Session,\n NotificationPref,\n Address,\n AddAddressInput,\n PaymentMethod,\n AddPaymentMethodInput,\n LinkedAccount,\n LinkedAccountProvider,\n TwoFactorMethod,\n Add2FAMethodInput,\n Add2FAMethodResult,\n PublicKeyCredentialCreationOptionsJSON,\n RegistrationResponseJSON,\n UserProfile,\n RequestOptions,\n} from '../types'\n\nexport class SettingsModule {\n constructor(private readonly client: APIClient) {}\n\n // ── Profile ──\n\n async getProfile(options?: RequestOptions): Promise<UserProfile> {\n return this.client.get<UserProfile>('/auth/me', undefined, options)\n }\n\n async updateProfile(input: UpdateProfileInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/me', input, options)\n }\n\n // ── Security ──\n\n async changePassword(input: ChangePasswordInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/change-password', input, options)\n }\n\n async getSessions(options?: RequestOptions): Promise<{ data: Session[] }> {\n return this.client.get<{ data: Session[] }>('/auth/sessions', undefined, options)\n }\n\n async revokeSession(sessionId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/sessions/${sessionId}`, undefined, options)\n }\n\n // ── Notification Preferences ──\n\n async getNotificationPrefs(options?: RequestOptions): Promise<{ data: NotificationPref[] }> {\n return this.client.get<{ data: NotificationPref[] }>('/auth/notification-prefs', undefined, options)\n }\n\n async updateNotificationPref(channel: string, enabled: boolean, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/notification-prefs/${channel}`, { enabled }, options)\n }\n\n // ── Preferences ──\n\n async getPreferences(options?: RequestOptions): Promise<{ data: Record<string, string> }> {\n return this.client.get<{ data: Record<string, string> }>('/auth/preferences', undefined, options)\n }\n\n async updatePreferences(prefs: Record<string, string>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>('/auth/preferences', { prefs }, options)\n }\n\n // ── Addresses ──\n\n async getAddresses(options?: RequestOptions): Promise<{ data: Address[] }> {\n return this.client.get<{ data: Address[] }>('/auth/addresses', undefined, options)\n }\n\n async addAddress(input: AddAddressInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/addresses', input, options)\n }\n\n async updateAddress(id: string, input: Partial<AddAddressInput>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/auth/addresses/${id}`, input, options)\n }\n\n async deleteAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/addresses/${id}`, undefined, options)\n }\n\n async setDefaultAddress(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/addresses/${id}/default`, undefined, options)\n }\n\n // ── Payment Methods ──\n\n async getPaymentMethods(options?: RequestOptions): Promise<{ data: PaymentMethod[] }> {\n return this.client.get<{ data: PaymentMethod[] }>('/auth/payment-methods', undefined, options)\n }\n\n async addPaymentMethod(input: AddPaymentMethodInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/auth/payment-methods', input, options)\n }\n\n async deletePaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/payment-methods/${id}`, undefined, options)\n }\n\n async setDefaultPaymentMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/payment-methods/${id}/default`, undefined, options)\n }\n\n // ── Linked Accounts ──\n\n async getLinkedAccounts(options?: RequestOptions): Promise<{ data: LinkedAccount[] }> {\n return this.client.get<{ data: LinkedAccount[] }>('/auth/linked-accounts', undefined, options)\n }\n\n async linkAccount(provider: LinkedAccountProvider, token: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/linked-accounts', { provider, token }, options)\n }\n\n async unlinkAccount(provider: LinkedAccountProvider, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/linked-accounts/${provider}`, undefined, options)\n }\n\n // ── 2FA ──\n\n async setup2FA(options?: RequestOptions): Promise<{ secret: string; otpauth_uri: string }> {\n return this.client.post<{ secret: string; otpauth_uri: string }>('/auth/2fa/setup', undefined, options)\n }\n\n async verify2FA(code: string, options?: RequestOptions): Promise<{ ok: true; backup_codes: string[] }> {\n return this.client.post<{ ok: true; backup_codes: string[] }>('/auth/2fa/verify', { code }, options)\n }\n\n async disable2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/disable', { code }, options)\n }\n\n async enable2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/auth/2fa/enable', { code }, options)\n }\n\n async delete2FA(code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>('/auth/2fa', { code }, options)\n }\n\n // ── Multi-Method 2FA ──\n\n async list2FAMethods(options?: RequestOptions): Promise<{ methods: TwoFactorMethod[] }> {\n return this.client.get<{ methods: TwoFactorMethod[] }>('/auth/2fa/methods', undefined, options)\n }\n\n async add2FAMethod(input: Add2FAMethodInput, options?: RequestOptions): Promise<Add2FAMethodResult> {\n return this.client.post<Add2FAMethodResult>('/auth/2fa/methods', input, options)\n }\n\n async verify2FAMethod(id: string, code: string, options?: RequestOptions): Promise<{ ok: true; backup_codes?: string[] }> {\n return this.client.post<{ ok: true; backup_codes?: string[] }>(`/auth/2fa/methods/${id}/verify`, { code }, options)\n }\n\n async enable2FAMethod(id: string, code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/2fa/methods/${id}/enable`, { code }, options)\n }\n\n async disable2FAMethod(id: string, code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/2fa/methods/${id}/disable`, { code }, options)\n }\n\n async delete2FAMethod(id: string, code: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/auth/2fa/methods/${id}`, { code }, options)\n }\n\n async setPrimary2FAMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/2fa/methods/${id}/primary`, undefined, options)\n }\n\n async challenge2FAMethod(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/auth/2fa/methods/${id}/challenge`, undefined, options)\n }\n\n // ── Passkey Registration ──\n\n async startPasskeyRegistration(input?: { label?: string }, options?: RequestOptions): Promise<{ method_id: string; options: PublicKeyCredentialCreationOptionsJSON }> {\n return this.client.post<{ method_id: string; options: PublicKeyCredentialCreationOptionsJSON }>('/auth/2fa/methods', { type: 'passkey', ...input }, options)\n }\n\n async finishPasskeyRegistration(methodId: string, credential: RegistrationResponseJSON, options?: RequestOptions): Promise<{ ok: true; backup_codes?: string[] }> {\n return this.client.post<{ ok: true; backup_codes?: string[] }>(`/auth/2fa/methods/${methodId}/passkey/finish`, credential, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { MailerTemplate, SendEmailInput, RequestOptions } from '../types'\n\nexport class MailerModule {\n constructor(private readonly client: APIClient) {}\n\n /**\n * Send a transactional email via the notifications worker.\n */\n async send(template: MailerTemplate, input: SendEmailInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>('/notify/email', { template, ...input }, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Business, UpdateBusinessInput, RequestOptions } from '../types'\n\nexport class BusinessesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Get all businesses owned by the current user. */\n async getMine(options?: RequestOptions): Promise<{ data: Business[] }> {\n return this.client.get<{ data: Business[] }>('/listings/businesses/mine', undefined, options)\n }\n\n /** Get a business by ID. */\n async getById(id: string, options?: RequestOptions): Promise<Business> {\n return this.client.get<Business>(`/listings/businesses/${id}`, undefined, options)\n }\n\n /** Update a business. */\n async update(id: string, input: UpdateBusinessInput, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.put<{ ok: true }>(`/listings/businesses/${id}`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n BlockedIp, SystemStats, AdminUserListItem, AdminUserDetail, AdminStoreListItem,\n AdminStoreDetail, AdminVerificationItem, StiEvent, AdminListingItem,\n AdminOrderListItem, AdminOrderDetail, AdminPayoutItem, AdminReport,\n AdminVaziOutfit, RequestOptions, AdminPermission, AdminRolePreset,\n AdminPermissionDescription, AdminOperator, AdminAuditEntry, PendingPayoutApproval,\n AdminWholesalePendingStore,\n} from '../types'\n\nexport class AdminModule {\n constructor(private readonly client: APIClient) {}\n\n // ── IP Blocking ──\n\n /**\n * @deprecated Pass a reason as the second argument. Kept source-compatible because the method was\n * already published, even though the endpoint did not exist at the time.\n */\n async blockIp(ip: string, durationHours?: number, options?: RequestOptions): Promise<{ ok: true; blocked: string; hours: number; expires_at: string; note: string }>\n async blockIp(ip: string, reason: string, durationHours?: number, options?: RequestOptions): Promise<{ ok: true; blocked: string; hours: number; expires_at: string; note: string }>\n async blockIp(\n ip: string,\n reasonOrDuration: string | number = 24,\n durationOrOptions?: number | RequestOptions,\n maybeOptions?: RequestOptions,\n ): Promise<{ ok: true; blocked: string; hours: number; expires_at: string; note: string }> {\n const modern = typeof reasonOrDuration === 'string'\n const reason = modern ? reasonOrDuration : 'No reason supplied by legacy SDK caller'\n const durationHours = modern\n ? (typeof durationOrOptions === 'number' ? durationOrOptions : 24)\n : reasonOrDuration\n const options = modern\n ? (typeof durationOrOptions === 'object' ? durationOrOptions : maybeOptions)\n : (typeof durationOrOptions === 'object' ? durationOrOptions : undefined)\n\n return this.client.post<{ ok: true; blocked: string; hours: number; expires_at: string; note: string }>(\n '/admin/block-ip',\n { ip, reason, duration_hours: durationHours },\n options,\n )\n }\n\n async unblockIp(ip: string, options?: RequestOptions): Promise<{ ok: true; unblocked: string }> {\n return this.client.post<{ ok: true; unblocked: string }>('/admin/unblock-ip', { ip }, options)\n }\n\n async getBlockedIps(options?: RequestOptions): Promise<{ data: BlockedIp[] }> {\n return this.client.get<{ data: BlockedIp[] }>('/admin/blocked-ips', undefined, options)\n }\n\n // ── Stats ──\n\n async getSystemStats(options?: RequestOptions): Promise<SystemStats> {\n return this.client.get<SystemStats>('/admin/stats', undefined, options)\n }\n\n async getStatsTimeseries(params?: { metric?: 'orders' | 'gmv' | 'users'; days?: number }, options?: RequestOptions): Promise<{ metric: string; days: number; data: { day: string; value: number }[] }> {\n return this.client.get<{ metric: string; days: number; data: { day: string; value: number }[] }>('/admin/stats/timeseries', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async getStatsByCity(options?: RequestOptions): Promise<{ data: { city: string; orders: number; gmv: number }[] }> {\n return this.client.get<{ data: { city: string; orders: number; gmv: number }[] }>('/admin/stats/by-city', undefined, options)\n }\n\n // ── Users ──\n\n async listUsers(params?: { q?: string; page?: number }, options?: RequestOptions): Promise<{ data: AdminUserListItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminUserListItem[]; page: number; page_size: number }>('/admin/users', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async getUser(userId: string, options?: RequestOptions): Promise<AdminUserDetail> {\n return this.client.get<AdminUserDetail>(`/admin/users/${userId}`, undefined, options)\n }\n\n async suspendUser(userId: string, reason: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/suspend`, { reason }, options)\n }\n\n async unsuspendUser(userId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/unsuspend`, undefined, options)\n }\n\n async setUserRole(userId: string, role: string, action: 'grant' | 'revoke', options?: RequestOptions): Promise<{ ok: true; roles: string[] }> {\n return this.client.post<{ ok: true; roles: string[] }>(`/admin/users/${userId}/roles`, { role, action }, options)\n }\n\n async revokeUserSessions(userId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/users/${userId}/revoke-sessions`, undefined, options)\n }\n\n // ── Stores ──\n\n async listStores(params?: { q?: string; verified?: 0 | 1; tier?: 'free' | 'pro'; page?: number }, options?: RequestOptions): Promise<{ data: AdminStoreListItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminStoreListItem[]; page: number; page_size: number }>('/admin/stores', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async getStore(storeId: string, options?: RequestOptions): Promise<AdminStoreDetail> {\n return this.client.get<AdminStoreDetail>(`/admin/stores/${storeId}`, undefined, options)\n }\n\n async verifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/verify`, undefined, options)\n }\n\n async unverifyStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/stores/${storeId}/unverify`, undefined, options)\n }\n\n // ── Verification Queue ──\n\n async listVerifications(params?: { status?: 'pending' | 'verified' | 'rejected' | 'unverified'; page?: number }, options?: RequestOptions): Promise<{ data: AdminVerificationItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminVerificationItem[]; page: number; page_size: number }>('/admin/verifications', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async approveVerification(userId: string, options?: RequestOptions): Promise<{ ok: true; verification_status: 'verified' }> {\n return this.client.post<{ ok: true; verification_status: 'verified' }>(`/admin/verifications/${userId}/approve`, undefined, options)\n }\n\n async rejectVerification(userId: string, reason?: string, options?: RequestOptions): Promise<{ ok: true; verification_status: 'rejected' }> {\n return this.client.post<{ ok: true; verification_status: 'rejected' }>(`/admin/verifications/${userId}/reject`, reason ? { reason } : undefined, options)\n }\n\n // ── STI ──\n\n async adjustSti(userId: string, input: { score?: number; delta?: number; reason: string }, options?: RequestOptions): Promise<{ ok: true; score_before: number; score_after: number }> {\n return this.client.post<{ ok: true; score_before: number; score_after: number }>(`/admin/sellers/${userId}/sti`, input, options)\n }\n\n async getStiEvents(userId: string, params?: { page?: number }, options?: RequestOptions): Promise<{ data: StiEvent[]; page: number; page_size: number }> {\n return this.client.get<{ data: StiEvent[]; page: number; page_size: number }>(`/admin/sellers/${userId}/sti-events`, params as Record<string, string | number | boolean | undefined>, options)\n }\n\n // ── Listings Moderation ──\n\n async listListings(params?: { status?: string; photo_verified?: 0 | 1; page?: number }, options?: RequestOptions): Promise<{ data: AdminListingItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminListingItem[]; page: number; page_size: number }>('/admin/listings', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async removeListing(listingId: string, reason?: string, options?: RequestOptions): Promise<{ ok: true; status: 'removed' }> {\n return this.client.post<{ ok: true; status: 'removed' }>(`/admin/listings/${listingId}/remove`, reason ? { reason } : undefined, options)\n }\n\n async reinstateListing(listingId: string, options?: RequestOptions): Promise<{ ok: true; status: 'active' }> {\n return this.client.post<{ ok: true; status: 'active' }>(`/admin/listings/${listingId}/reinstate`, undefined, options)\n }\n\n // ── Orders ──\n\n async listOrders(params?: { status?: string; q?: string; page?: number }, options?: RequestOptions): Promise<{ data: AdminOrderListItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminOrderListItem[]; page: number; page_size: number }>('/admin/orders', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async getOrder(orderId: string, options?: RequestOptions): Promise<AdminOrderDetail> {\n return this.client.get<AdminOrderDetail>(`/admin/orders/${orderId}`, undefined, options)\n }\n\n async forceTransitionOrder(orderId: string, status: string, note?: string, options?: RequestOptions): Promise<{ ok: true; status: string }> {\n return this.client.post<{ ok: true; status: string }>(`/admin/orders/${orderId}/transition`, { status, note }, options)\n }\n\n // ── Payouts ──\n\n async getPayoutSummary(options?: RequestOptions): Promise<{ owed: number; held: number; sent_today: number }> {\n return this.client.get<{ owed: number; held: number; sent_today: number }>('/admin/payouts/summary', undefined, options)\n }\n\n async listPayouts(params?: { status?: 'pending' | 'sent' | 'failed'; on_hold?: 0 | 1; page?: number }, options?: RequestOptions): Promise<{ data: AdminPayoutItem[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminPayoutItem[]; page: number; page_size: number }>('/admin/payouts', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async disbursePayout(payoutId: string, options?: RequestOptions): Promise<{ ok: true; result: unknown }> {\n return this.client.post<{ ok: true; result: unknown }>(`/admin/payouts/${payoutId}/disburse`, undefined, options)\n }\n\n // ── Reports Moderation ──\n\n async listReports(params?: { status?: 'open' | 'reviewed' | 'dismissed' | 'actioned'; type?: 'listing' | 'review' | 'store' | 'user'; page?: number }, options?: RequestOptions): Promise<{ data: AdminReport[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminReport[]; page: number; page_size: number }>('/admin/reports', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async resolveReport(reportId: string, status: 'reviewed' | 'dismissed' | 'actioned', note?: string, options?: RequestOptions): Promise<{ ok: true; status: string }> {\n return this.client.post<{ ok: true; status: string }>(`/admin/reports/${reportId}/resolve`, { status, note }, options)\n }\n\n // ── Review Moderation ──\n\n async removeReview(reviewId: string, reason?: string, options?: RequestOptions): Promise<{ ok: true; hidden: true }> {\n return this.client.post<{ ok: true; hidden: true }>(`/admin/reviews/${reviewId}/remove`, reason ? { reason } : undefined, options)\n }\n\n async reinstateReview(reviewId: string, options?: RequestOptions): Promise<{ ok: true; hidden: false }> {\n return this.client.post<{ ok: true; hidden: false }>(`/admin/reviews/${reviewId}/reinstate`, undefined, options)\n }\n\n // ── VAZI Moderation ──\n\n async listVaziOutfits(params?: { page?: number }, options?: RequestOptions): Promise<{ data: AdminVaziOutfit[]; page: number; page_size: number }> {\n return this.client.get<{ data: AdminVaziOutfit[]; page: number; page_size: number }>('/admin/vazi/outfits', params as Record<string, string | number | boolean | undefined>, options)\n }\n\n async removeVaziOutfit(outfitId: string, reason?: string, options?: RequestOptions): Promise<{ ok: true; removed: true }> {\n return this.client.post<{ ok: true; removed: true }>(`/admin/vazi/outfits/${outfitId}/remove`, reason ? { reason } : undefined, options)\n }\n\n async reinstateVaziOutfit(outfitId: string, options?: RequestOptions): Promise<{ ok: true; removed: false }> {\n return this.client.post<{ ok: true; removed: false }>(`/admin/vazi/outfits/${outfitId}/reinstate`, undefined, options)\n }\n\n // ── Operators, roles, and audit ──\n\n async listOperators(options?: RequestOptions): Promise<{ operators: AdminOperator[] }> {\n return this.client.get<{ operators: AdminOperator[] }>('/admin/operators', undefined, options)\n }\n\n async listAdminRoles(options?: RequestOptions): Promise<{ roles: AdminRolePreset[]; permissions: AdminPermissionDescription[] }> {\n return this.client.get<{ roles: AdminRolePreset[]; permissions: AdminPermissionDescription[] }>('/admin/roles', undefined, options)\n }\n\n async grantOperatorPermission(userId: string, permission: AdminPermission, options?: RequestOptions): Promise<{ ok: true; already_held: boolean }> {\n return this.client.post<{ ok: true; already_held: boolean }>(`/admin/operators/${userId}/permissions`, { permission }, options)\n }\n\n async revokeOperatorPermission(userId: string, permission: AdminPermission, options?: RequestOptions): Promise<{ ok: true; note: string }> {\n return this.client.delete<{ ok: true; note: string }>(`/admin/operators/${userId}/permissions/${encodeURIComponent(permission)}`, undefined, options)\n }\n\n async grantOperatorRole(userId: string, role: string, options?: RequestOptions): Promise<{ ok: true; role: string; granted: AdminPermission[]; already_held: AdminPermission[] }> {\n return this.client.post<{ ok: true; role: string; granted: AdminPermission[]; already_held: AdminPermission[] }>(`/admin/operators/${userId}/roles`, { role }, options)\n }\n\n async getAuditLog(limit = 100, options?: RequestOptions): Promise<{ entries: AdminAuditEntry[] }> {\n return this.client.get<{ entries: AdminAuditEntry[] }>('/admin/audit', { limit }, options)\n }\n\n // ── Payout approval ──\n\n async listPayoutsAwaitingApproval(options?: RequestOptions): Promise<{ payouts: PendingPayoutApproval[] }> {\n return this.client.get<{ payouts: PendingPayoutApproval[] }>('/admin/payouts/pending-approval', undefined, options)\n }\n\n async approvePayout(payoutId: string, options?: RequestOptions): Promise<{ ok: true; already_approved: boolean }> {\n return this.client.post<{ ok: true; already_approved: boolean }>(`/admin/payouts/${payoutId}/approve`, undefined, options)\n }\n\n async holdPayout(payoutId: string, reason: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/payouts/${payoutId}/hold`, { reason }, options)\n }\n\n /** Repair a Daraja payout whose provider reference failed to persist. */\n async repairPayoutCorrelation(payoutId: string, providerRef: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/payouts/${payoutId}/correlation`, { provider_ref: providerRef }, options)\n }\n\n // ── Wholesale moderation ──\n\n async listPendingWholesaleStores(options?: RequestOptions): Promise<{ data: AdminWholesalePendingStore[] }> {\n return this.client.get<{ data: AdminWholesalePendingStore[] }>('/admin/wholesale/pending', undefined, options)\n }\n\n async verifyWholesaleStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/wholesale/stores/${storeId}/verify`, undefined, options)\n }\n\n async unverifyWholesaleStore(storeId: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/admin/wholesale/stores/${storeId}/unverify`, undefined, options)\n }\n\n // ── Broadcast ──\n\n async broadcast(input: { title: string; body: string; segment?: 'all' | 'sellers' | 'buyers' }, options?: RequestOptions): Promise<{ ok: true; segment: string; recipients: number }> {\n return this.client.post<{ ok: true; segment: string; recipients: number }>('/admin/broadcast', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { Dispute, RaiseDisputeInput, RespondDisputeInput, ResolveDisputeInput, DisputeListParams, RequestOptions } from '../types'\n\nexport class DisputesModule {\n constructor(private readonly client: APIClient) {}\n\n /** Raise a dispute on an order (buyer). */\n async raise(orderId: string, input: RaiseDisputeInput, options?: RequestOptions): Promise<{ dispute_id: string; status: 'open' }> {\n return this.client.post<{ dispute_id: string; status: 'open' }>(`/orders/${orderId}/dispute`, input, options)\n }\n\n /** Get the dispute for a specific order. */\n async getForOrder(orderId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/${orderId}/dispute`, undefined, options)\n }\n\n /** Get a dispute by ID. */\n async get(disputeId: string, options?: RequestOptions): Promise<Dispute> {\n return this.client.get<Dispute>(`/orders/disputes/${disputeId}`, undefined, options)\n }\n\n /** Add evidence to a dispute. */\n async addEvidence(disputeId: string, input: { type: 'image' | 'text'; content: string }, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.post<{ ok: true }>(`/orders/disputes/${disputeId}/evidence`, input, options)\n }\n\n /** Escalate a dispute to admin review (buyer). */\n async escalate(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'under_review' }> {\n return this.client.post<{ ok: true; status: 'under_review' }>(`/orders/disputes/${disputeId}/escalate`, undefined, options)\n }\n\n /** Withdraw a dispute (buyer). */\n async withdraw(disputeId: string, options?: RequestOptions): Promise<{ ok: true; status: 'withdrawn' }> {\n return this.client.post<{ ok: true; status: 'withdrawn' }>(`/orders/disputes/${disputeId}/withdraw`, undefined, options)\n }\n\n /** Respond to a dispute (seller). */\n async respond(disputeId: string, input: RespondDisputeInput, options?: RequestOptions): Promise<{ ok: true; status?: string; voluntary?: boolean }> {\n return this.client.post<{ ok: true; status?: string; voluntary?: boolean }>(`/orders/disputes/${disputeId}/respond`, input, options)\n }\n\n /** List all disputes (admin). */\n async list(params?: DisputeListParams, options?: RequestOptions): Promise<{ data: Dispute[]; page: number; page_size: number }> {\n return this.client.get<{ data: Dispute[]; page: number; page_size: number }>(\n '/orders/disputes',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n /** Resolve a dispute (admin). */\n async resolve(disputeId: string, input: ResolveDisputeInput, options?: RequestOptions): Promise<{ ok: true; status: string; sti_impact: number }> {\n return this.client.post<{ ok: true; status: string; sti_impact: number }>(`/orders/disputes/${disputeId}/resolve`, input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { RequestOptions } from '../types'\n\nexport class UploadsModule {\n constructor(private readonly client: APIClient) {}\n\n /** Upload a file (avatar, evidence, etc). Returns the public CDN URL. */\n async upload(file: Blob, options?: RequestOptions): Promise<{ url: string }> {\n const formData = new FormData()\n formData.append('file', file)\n return this.client.post<{ url: string }>('/listings/uploads', formData, options)\n }\n}\n","import { APIClient } from '../client'\nimport type { CreateReportInput, RequestOptions } from '../types'\n\nexport class ReportsModule {\n constructor(private readonly client: APIClient) {}\n\n /** Report a listing, review, store, or user for admin review. */\n async create(input: CreateReportInput, options?: RequestOptions): Promise<{ ok: true; already_reported?: boolean }> {\n return this.client.post<{ ok: true; already_reported?: boolean }>('/listings/reports', input, options)\n }\n}\n","import { APIClient } from '../client'\nimport type {\n WholesaleStore, WholesaleDepot, Bale, BaleDetail, BaleFeedItem,\n CreateBaleInput, SaveWholesaleStoreInput, AddDepotInput, WholesaleFeedParams,\n BaleOrder, BaleOrderEvent, BaleOrderStatus, CreateBaleOrderInput,\n BaleImageUploadResult, WholesaleAnalytics, PresignImageResponse,\n RequestOptions,\n} from '../types'\n\nexport class WholesaleModule {\n constructor(private readonly client: APIClient) {}\n\n // ── Wholesale Store ──\n\n /** Get the current user's wholesale store and depots. */\n async getWholesaleStore(options?: RequestOptions): Promise<{ store: WholesaleStore | null; depots?: WholesaleDepot[] }> {\n return this.client.get<{ store: WholesaleStore | null; depots?: WholesaleDepot[] }>('/listings/wholesale/store', undefined, options)\n }\n\n /** Create or update the wholesale store (bale_seller only). */\n async saveWholesaleStore(input: SaveWholesaleStoreInput, options?: RequestOptions): Promise<{ id: string; verified?: boolean }> {\n return this.client.post<{ id: string; verified?: boolean }>('/listings/wholesale/store', input, options)\n }\n\n /** Add a depot to the wholesale store. */\n async addDepot(input: AddDepotInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/listings/wholesale/store/depots', input, options)\n }\n\n /** Remove a depot. */\n async removeDepot(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/wholesale/store/depots/${id}`, undefined, options)\n }\n\n // ── Bales ──\n\n /** Create a bale listing (requires verified wholesale store). */\n async createBale(input: CreateBaleInput, options?: RequestOptions): Promise<{ id: string }> {\n return this.client.post<{ id: string }>('/listings/bales', input, options)\n }\n\n /** Get a bale by ID (public). */\n async getBale(id: string, options?: RequestOptions): Promise<BaleDetail> {\n return this.client.get<BaleDetail>(`/listings/bales/${id}`, undefined, options)\n }\n\n /** Update a bale. */\n async updateBale(id: string, input: Partial<CreateBaleInput>, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.patch<{ ok: true }>(`/listings/bales/${id}`, input, options)\n }\n\n /** Soft-delete a bale. */\n async removeBale(id: string, options?: RequestOptions): Promise<{ ok: true }> {\n return this.client.delete<{ ok: true }>(`/listings/bales/${id}`, undefined, options)\n }\n\n /** Get all bales for the current user's wholesale store. */\n async myBales(options?: RequestOptions): Promise<{ data: Bale[] }> {\n return this.client.get<{ data: Bale[] }>('/listings/wholesale/mine/bales', undefined, options)\n }\n\n // ── Bale Images ──\n\n /**\n * Presign a bale image upload slot (requires the owning wholesale store).\n *\n * @param baleId - The bale to attach the image to\n * @param index - The slot index; slot 0 is the cover\n * @returns The storage key and image id for the slot\n * @throws {APIError} On network or server errors\n */\n async presignBaleImage(baleId: string, index: number, options?: RequestOptions): Promise<PresignImageResponse> {\n return this.client.post<PresignImageResponse>(`/listings/bales/${baleId}/images/presign`, { index }, options)\n }\n\n /**\n * Upload a bale image file directly. Uses multipart/form-data. Slot 0 is the cover.\n *\n * @param baleId - The bale to attach the image to\n * @param file - The image file as a `Blob` (React Native passes a `{ uri, name, type }` part)\n * @param index - The slot index; slot 0 is the cover\n * @returns The storage key, image id, and public URL\n * @throws {APIError} On network or server errors\n */\n async uploadBaleImage(baleId: string, file: Blob, index: number, options?: RequestOptions): Promise<BaleImageUploadResult> {\n const formData = new FormData()\n formData.append('file', file)\n formData.append('index', String(index))\n return this.client.post<BaleImageUploadResult>(`/listings/bales/${baleId}/images/upload`, formData, options)\n }\n\n // ── Feed ──\n\n /** Browse the wholesale bale feed (public). */\n async wholesaleFeed(params?: WholesaleFeedParams, options?: RequestOptions): Promise<{ data: BaleFeedItem[]; limit: number; offset: number }> {\n return this.client.get<{ data: BaleFeedItem[]; limit: number; offset: number }>(\n '/listings/wholesale/feed',\n params as unknown as Record<string, string | number | boolean | undefined>,\n options\n )\n }\n\n // ── Bale Orders ──\n\n /** Create a bale order (buyer). */\n async createBaleOrder(input: CreateBaleOrderInput, options?: RequestOptions): Promise<{ id: string; total_kes: number }> {\n return this.client.post<{ id: string; total_kes: number }>('/listings/bale-orders', input, options)\n }\n\n /** Get the buyer's bale orders. */\n async myBaleOrders(options?: RequestOptions): Promise<{ data: BaleOrder[] }> {\n return this.client.get<{ data: BaleOrder[] }>('/listings/bale-orders/mine', undefined, options)\n }\n\n /** Get incoming bale orders (seller). */\n async incomingBaleOrders(options?: RequestOptions): Promise<{ data: BaleOrder[] }> {\n return this.client.get<{ data: BaleOrder[] }>('/listings/wholesale/orders', undefined, options)\n }\n\n /** Get a bale order by ID with event timeline. */\n async getBaleOrder(id: string, options?: RequestOptions): Promise<BaleOrder & { events: BaleOrderEvent[] }> {\n return this.client.get<BaleOrder & { events: BaleOrderEvent[] }>(`/listings/bale-orders/${id}`, undefined, options)\n }\n\n /** Transition a bale order status. */\n async transitionBaleOrder(id: string, action: 'confirm' | 'dispatch' | 'deliver' | 'receive', options?: RequestOptions): Promise<{ ok: true; status: BaleOrderStatus }> {\n return this.client.post<{ ok: true; status: BaleOrderStatus }>(`/listings/bale-orders/${id}/transition`, { action }, options)\n }\n\n // ── Analytics ──\n\n /**\n * Get performance analytics for the current user's wholesale store (bale_seller only).\n *\n * The wholesale store is resolved server-side from the session, so no store id is passed — the\n * same way `getWholesaleStore`, `myBales`, and `incomingBaleOrders` work.\n *\n * @param period - Optional granularity; defaults to the server's default window\n * @returns Revenue series, order breakdown, top bales, and totals\n * @throws {APIError} On network or server errors\n *\n * @example\n * ```typescript\n * const analytics = await sdk.wholesale.getAnalytics('weekly')\n * ```\n */\n async getAnalytics(period?: 'daily' | 'weekly' | 'monthly', options?: RequestOptions): Promise<WholesaleAnalytics> {\n return this.client.get<WholesaleAnalytics>('/listings/wholesale/analytics', period ? { period } : undefined, options)\n }\n}\n","export interface AuthTokens {\r\n access_token: string\r\n refresh_token: string\r\n expires_in: number\r\n}\r\n\r\nexport interface MessageResponse {\r\n message: string\r\n}\r\n\r\nexport interface EmailRegisterInput {\r\n email: string\r\n password: string // min 8 chars\r\n display_name?: string\r\n device?: string\r\n}\r\n\r\nexport interface PhoneRegisterInput {\r\n phone: string // format: +254XXXXXXXXX\r\n}\r\n\r\nexport type RegisterInput = EmailRegisterInput | PhoneRegisterInput\r\n\r\nexport interface EmailLoginInput {\r\n email: string\r\n password: string\r\n device?: string\r\n remember?: boolean\r\n}\r\n\r\nexport interface PhoneLoginInput {\r\n phone: string\r\n}\r\n\r\nexport type LoginInput = EmailLoginInput | PhoneLoginInput\r\n\r\nexport interface SendOtpInput {\r\n phone: string\r\n}\r\n\r\nexport interface VerifyOtpInput {\r\n phone: string\r\n code: string // 6 digits\r\n}\r\n\r\nexport interface ForgotPasswordInput {\r\n email: string\r\n}\r\n\r\nexport interface ResetPasswordInput {\r\n token: string\r\n password: string\r\n}\r\n\r\nexport interface CompleteOnboardingInput {\r\n display_name: string\r\n county: string\r\n phone: string\r\n}\r\n\r\nexport interface TwoFactorRequired {\r\n requires_2fa: true\r\n temp_token: string\r\n methods?: { id: string; type: TwoFactorMethodType; label: string | null }[]\r\n}\r\n\r\nexport interface Verify2FAInput {\r\n temp_token: string\r\n code: string\r\n method_id?: string\r\n}\r\n\r\nexport const TWO_FACTOR_METHOD_TYPES = ['totp', 'sms', 'email', 'passkey'] as const\r\nexport type TwoFactorMethodType = typeof TWO_FACTOR_METHOD_TYPES[number]\r\n\r\nexport interface TwoFactorMethod {\r\n id: string\r\n type: TwoFactorMethodType\r\n label: string | null\r\n enabled: boolean\r\n is_primary: boolean\r\n verified_at: string | null\r\n created_at: string\r\n last_used_at: string | null\r\n}\r\n\r\nexport interface Add2FAMethodInput {\r\n type: TwoFactorMethodType\r\n label?: string\r\n target?: string\r\n}\r\n\r\nexport interface Add2FAMethodResult {\r\n id: string\r\n otpauth_uri?: string\r\n secret?: string\r\n}\r\n\r\n/** WebAuthn L2 JSON — options returned by the server for navigator.credentials.create() */\r\nexport interface PublicKeyCredentialCreationOptionsJSON {\r\n rp: { name: string; id?: string }\r\n user: { id: string; name: string; displayName: string }\r\n challenge: string\r\n pubKeyCredParams: { type: string; alg: number }[]\r\n timeout?: number\r\n excludeCredentials?: { id: string; type: string; transports?: string[] }[]\r\n authenticatorSelection?: { authenticatorAttachment?: string; residentKey?: string; requireResidentKey?: boolean; userVerification?: string }\r\n attestation?: string\r\n extensions?: Record<string, unknown>\r\n}\r\n\r\n/** WebAuthn L2 JSON — the browser's response from navigator.credentials.create() */\r\nexport interface RegistrationResponseJSON {\r\n id: string\r\n rawId: string\r\n response: { clientDataJSON: string; attestationObject: string; transports?: string[] }\r\n type: string\r\n clientExtensionResults?: Record<string, unknown>\r\n authenticatorAttachment?: string\r\n}\r\n\r\n/** WebAuthn L2 JSON — options returned by the server for navigator.credentials.get() */\r\nexport interface PublicKeyCredentialRequestOptionsJSON {\r\n challenge: string\r\n timeout?: number\r\n rpId?: string\r\n allowCredentials?: { id: string; type: string; transports?: string[] }[]\r\n userVerification?: string\r\n extensions?: Record<string, unknown>\r\n}\r\n\r\n/** WebAuthn L2 JSON — the browser's response from navigator.credentials.get() */\r\nexport interface AuthenticationResponseJSON {\r\n id: string\r\n rawId: string\r\n response: { clientDataJSON: string; authenticatorData: string; signature: string; userHandle?: string }\r\n type: string\r\n clientExtensionResults?: Record<string, unknown>\r\n authenticatorAttachment?: string\r\n}\r\n\r\nexport type BusinessType = 'individual' | 'business'\r\nexport type SellerType = 'retail' | 'bale'\r\n\r\nexport interface BecomeSellerInput {\r\n business_type?: BusinessType\r\n /** @deprecated Use business_type instead */\r\n seller_type?: 'individual' | 'business'\r\n sti_score?: number\r\n business_name?: string\r\n id_number?: string\r\n kra_pin?: string\r\n phone?: string\r\n county?: string\r\n town?: string\r\n categories?: string[]\r\n condition_grades?: string[]\r\n delivery_method?: 'self' | 'mitumba-logistics'\r\n price_range_min?: number\r\n price_range_max?: number\r\n}\r\n\r\nexport interface BecomeBaleSellerInput {\r\n business_type?: BusinessType\r\n business_name?: string\r\n kra_pin?: string\r\n id_number?: string\r\n phone?: string\r\n county?: string\r\n}\r\n\r\nexport interface UserProfile {\r\n id: string\r\n email: string | null\r\n phone: string | null\r\n display_name: string | null\r\n city_id: string | null\r\n county: string | null\r\n bio: string | null\r\n avatar_url: string | null\r\n onboarding_completed: boolean\r\n email_verified: boolean\r\n totp_enabled: boolean\r\n totp_configured: boolean\r\n two_factor_methods_count?: number\r\n sms_2fa_available?: boolean\r\n email_2fa_available?: boolean\r\n /** Unused backup codes left. */\r\n backup_codes_remaining?: number\r\n /** True at two or fewer, while a verified second factor exists. */\r\n backup_codes_low?: boolean\r\n /** Explicit admin grants, whether or not they currently reach the token. */\r\n admin_permissions?: import('./admin').AdminPermission[]\r\n /** Grants exist but are withheld until a second factor is verified. */\r\n admin_enrolment_required?: boolean\r\n is_active: boolean\r\n created_at: string\r\n roles: string[]\r\n}\r\n\r\n\r\n// ── Public capabilities, backup-code lifecycle, and assisted recovery ─────────\r\n\r\nexport interface AuthCapabilities {\r\n sms_otp_enabled: boolean\r\n email_2fa_enabled: boolean\r\n password_min_length: number\r\n}\r\n\r\nexport interface RegenerateBackupCodesResult {\r\n /** Shown once. Never persisted by the SDK. */\r\n backup_codes: string[]\r\n remaining: number\r\n}\r\n\r\nexport type RecoveryStatus = 'none' | 'pending' | 'approved'\r\n\r\nexport interface RequestRecoveryInput {\r\n temp_token: string\r\n reason?: string\r\n}\r\n\r\nexport interface RequestRecoveryResult {\r\n id: string\r\n status: 'pending' | 'approved'\r\n cooling_off_hours: number\r\n payout_freeze_days?: number\r\n hours_remaining?: number | null\r\n already_open: boolean\r\n}\r\n\r\nexport interface RecoveryStatusResult {\r\n status: RecoveryStatus\r\n id?: string\r\n cooling_off_hours: number\r\n payout_freeze_days?: number\r\n hours_remaining?: number | null\r\n can_complete?: boolean\r\n}\r\n\r\nexport interface CompleteRecoveryResult extends AuthTokens {\r\n /** Shown once. Never persisted by the SDK. */\r\n backup_codes: string[]\r\n payout_frozen_until: string\r\n payout_freeze_days: number\r\n}\r\n\r\nexport interface AdminRecoveryRequest {\r\n id: string\r\n user_id: string\r\n email: string\r\n status: 'pending' | 'approved' | 'rejected' | 'cancelled' | 'completed'\r\n reason: string | null\r\n requested_ip: string | null\r\n reviewed_by: string | null\r\n reviewed_at: string | null\r\n review_note: string | null\r\n effective_at: string | null\r\n completed_at: string | null\r\n created_at: string\r\n}\r\n\r\nexport interface AdminRecoveryEvent {\r\n id: string\r\n event: string\r\n actor_id: string | null\r\n detail: string | null\r\n created_at: string\r\n}\r\n\nexport interface RootSetupInput {\n email: string\n password: string\n /** One-time bootstrap secret, removed from the Worker immediately after setup. */\n setup_secret: string\n}\n\nexport interface RootSetupResult {\n ok: true\n permissions: import('./admin').AdminPermission[]\n next_step: string\n}\n","export const CONDITIONS = ['new', 'like_new', 'good', 'fair'] as const\nexport type Condition = typeof CONDITIONS[number]\n\nexport const LISTING_STATUSES = ['draft', 'active', 'sold', 'removed'] as const\nexport type ListingStatus = typeof LISTING_STATUSES[number]\n\nexport interface ListingImage {\n id: string\n listing_id: string\n url: string\n position: number\n created_at: string\n}\n\nexport interface SellerProfile {\n id: string\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n}\n\nexport interface Listing {\n id: string\n seller_id: string\n title: string\n description: string | null\n category_id: string\n city_id: string\n price: number // KES integer\n condition: Condition\n status: ListingStatus\n photo_verified: boolean\n vazi_eligible: boolean\n size: string | null\n created_at: string\n updated_at: string\n // Seller profile (joined)\n sti_score: number\n verification_status: string\n seller_type: 'individual' | 'bale'\n // Images (only present on GET /listings/:id, not in feed)\n images?: ListingImage[]\n // First image as full CDN URL (present in feeds/store listings)\n image_url?: string | null\n // All image CDN URLs ordered by position (present in feeds)\n media?: string[]\n}\n\nexport interface ListingsFeedParams {\n city_id?: string\n category_id?: string\n min_price?: number\n max_price?: number\n condition?: Condition\n sort?: 'recency' | 'price_asc' | 'price_desc'\n page?: number\n page_size?: number\n}\n\nexport interface CreateListingInput {\n store_id: string\n title: string\n description?: string\n category_id: string\n city_id: string\n price: number\n condition: Condition\n size?: string\n vazi_eligible?: boolean\n}\n\nexport type UpdateListingInput = Partial<CreateListingInput>\n\nexport interface Category {\n id: string\n name: string\n slug: string\n}\n\nexport interface City {\n id: string\n name: string\n delivery_fee: number\n}\n\nexport interface SellerStorefront {\n seller: SellerProfile\n listings: Listing[]\n total: number\n page: number\n page_size: number\n has_more: boolean\n}\n\nexport interface PresignImageResponse {\n r2_key: string\n image_id: string\n}\n\nexport interface SimilarListing {\n id: string\n title: string\n price: number\n condition: string\n category_id: string\n store_id: string | null\n image_keys: string | null\n created_at: string\n}\n","export const ORDER_STATUSES = [\n 'created',\n 'payment_pending',\n 'paid',\n 'seller_confirmed',\n 'shipped',\n 'delivered',\n 'completed',\n 'cancelled',\n 'disputed',\n] as const\n\nexport type OrderStatus = typeof ORDER_STATUSES[number]\n\nexport interface OrderEvent {\n id: string\n order_id: string\n actor: string // user ID or 'system'\n old_status: string\n new_status: string\n note: string | null\n created_at: string\n}\n\nexport interface DeliveryAddress {\n label: string\n line1: string\n city: string\n county: string\n phone: string\n}\n\nexport interface Order {\n id: string\n buyer_id: string\n seller_id: string\n listing_id: string\n amount: number\n delivery_fee: number\n total: number\n status: OrderStatus\n city_id: string\n created_at: string\n updated_at: string\n // Joined listing details\n listing_title: string | null\n listing_image_url: string | null\n listing_condition: string | null\n listing_size: string | null\n // Joined buyer details\n buyer_name: string | null\n buyer_phone: string | null\n // Buyer's default delivery address\n delivery_address: DeliveryAddress | null\n events?: OrderEvent[]\n}\n\nexport interface CreateOrderInput {\n listing_id: string\n}\n\nexport interface TransitionOrderInput {\n status: OrderStatus\n note?: string\n}\n\nexport interface OrderHistoryParams {\n role?: 'buyer' | 'seller'\n store_id?: string\n page?: number\n}\n","import type { OrderStatus } from './orders'\nimport type { BaleOrderStatus } from './wholesale'\n\nexport interface StkPushInput {\n order_id: string\n phone: string // format: +254XXXXXXXXX\n}\n\nexport type MpesaInput = StkPushInput\n\nexport interface StkPushResponse {\n payment_id: string\n provider: string\n}\n\nexport interface PaystackInput {\n order_id: string\n email: string\n}\n\nexport interface PaystackInitResponse {\n access_code: string\n authorization_url: string\n reference: string\n}\n\nexport const PAYMENT_STATUSES = ['initiated', 'funded', 'failed', 'refunded', 'cancelled'] as const\nexport type PaymentStatus = typeof PAYMENT_STATUSES[number]\n\nexport interface PaymentStatusResponse {\n id: string\n status: PaymentStatus\n total: number\n}\n\nexport type KnownPaymentProvider =\n | 'daraja'\n | 'intasend'\n | 'paystack'\n | 'airtel'\n\nexport type ProviderId = KnownPaymentProvider | (string & {})\n\nexport type PaymentProvider = ProviderId\n\nexport type CheckoutPaymentMethod =\n | { type: 'mobile_money'; phone: string }\n | { type: 'card' }\n\nexport interface InitiateCheckoutInput {\n order_id: string\n idempotency_key: string\n method: CheckoutPaymentMethod\n}\n\nexport type CheckoutNextAction =\n | { type: 'await_confirmation' }\n | { type: 'redirect'; url: string; expires_at: string | null }\n\nexport interface InitiateCheckoutResponse {\n version: 1\n order_id: string\n attempt: {\n id: string\n sequence: number\n provider: ProviderId\n status: 'initiated'\n }\n next_action: CheckoutNextAction\n}\n\nexport type PaymentAttemptStatus = 'initiated' | 'funded' | 'failed' | 'refunded' | 'cancelled'\n\nexport type CheckoutStatus = 'pending' | 'paid' | 'failed' | 'cancelled' | 'refunded'\n\nexport type CheckoutOrder =\n | { type: 'retail'; status: OrderStatus }\n | { type: 'bale'; status: BaleOrderStatus }\n\nexport interface CheckoutStatusResponse {\n version: 1\n order_id: string\n order: CheckoutOrder\n checkout_status: CheckoutStatus\n terminal: boolean\n retryable: boolean\n amount: {\n currency: 'KES'\n minor_units: number\n }\n latest_attempt: {\n id: string\n sequence: number\n provider: PaymentProvider\n status: PaymentAttemptStatus\n terminal: boolean\n created_at: string\n updated_at: string\n } | null\n attempt_count: number\n order_updated_at: string\n status_updated_at: string\n server_time: string\n poll_after_ms: number\n}\n","export const DISPUTE_REASONS = ['not_received', 'not_as_described', 'damaged', 'counterfeit', 'wrong_item'] as const\nexport type DisputeReason = typeof DISPUTE_REASONS[number]\n\nexport const DESIRED_RESOLUTIONS = ['refund', 'replacement', 'partial_refund'] as const\nexport type DesiredResolution = typeof DESIRED_RESOLUTIONS[number]\n\nexport const DISPUTE_STATUSES = ['open', 'seller_responded', 'under_review', 'resolved_refund', 'resolved_release', 'resolved_partial', 'withdrawn'] as const\nexport type DisputeStatus = typeof DISPUTE_STATUSES[number]\n\nexport interface DisputeEvidence {\n id: string\n uploader_role: 'buyer' | 'seller' | 'admin'\n type: 'image' | 'text'\n content: string\n created_at: string\n}\n\nexport interface DisputeEvent {\n actor_role: 'buyer' | 'seller' | 'admin' | 'system'\n action: string\n old_status: string | null\n new_status: string | null\n note: string | null\n created_at: string\n}\n\nexport interface Dispute {\n id: string\n order_id: string\n buyer_id: string\n seller_id: string\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n status: DisputeStatus\n amount_disputed: number\n resolution: 'refund' | 'release' | 'partial' | null\n resolution_amount: number | null\n resolution_note: string | null\n sti_impact: number | null\n seller_responded_at: string | null\n escalated_at: string | null\n resolved_at: string | null\n created_at: string\n updated_at: string\n evidence?: DisputeEvidence[]\n events?: DisputeEvent[]\n}\n\nexport interface RaiseDisputeInput {\n reason: DisputeReason\n description: string\n desired_resolution: DesiredResolution\n evidence_urls?: string[]\n}\n\nexport interface RespondDisputeInput {\n accept: boolean\n message?: string\n evidence_urls?: string[]\n}\n\nexport interface ResolveDisputeInput {\n resolution: 'refund' | 'release' | 'partial'\n amount?: number\n note?: string\n}\n\nexport interface DisputeListParams {\n status?: DisputeStatus\n page?: number\n}\n","export type BaleGrade = 'Cream' | 'A' | 'B' | 'C'\nexport type BaleType = 'original' | 'sorted'\n\nexport interface WholesaleStore {\n id: string\n name: string\n slug: string\n tagline: string | null\n description: string | null\n logo_url: string | null\n origins: string[]\n verified: boolean\n}\n\nexport interface WholesaleDepot {\n id: string\n name: string\n address: string | null\n city_id: string | null\n is_primary: boolean\n}\n\nexport interface Bale {\n id: string\n store_id: string\n seller_id: string\n title: string\n category: string\n grade: BaleGrade\n bale_type: BaleType\n weight_kg: number\n origin: string | null\n est_pieces: number | null\n price_kes: number\n moq: number\n mix: string | null\n description: string | null\n city_id: string | null\n status: 'draft' | 'active' | 'sold_out'\n created_at: string\n}\n\nexport interface BaleDetail extends Bale {\n images: string[]\n store: { name: string; slug: string; verified: boolean; sti: number | null }\n}\n\nexport interface CreateBaleInput {\n title: string\n category: string\n grade: BaleGrade\n bale_type?: BaleType\n weight_kg: number\n origin?: string\n est_pieces?: number\n price_kes: number\n moq?: number\n mix?: string\n description?: string\n city_id?: string\n status?: 'draft' | 'active' | 'sold_out'\n}\n\nexport interface WholesaleFeedParams {\n q?: string\n category?: string\n grade?: BaleGrade\n origin?: string\n city_id?: string\n limit?: number\n offset?: number\n}\n\nexport interface BaleFeedItem extends Bale {\n image_url: string | null\n store: { name: string; slug: string; verified: boolean; sti: number | null }\n}\n\nexport interface SaveWholesaleStoreInput {\n name: string\n tagline?: string\n description?: string\n logo_url?: string\n origins?: string[]\n}\n\nexport interface AddDepotInput {\n name: string\n address?: string\n city_id?: string\n is_primary?: boolean\n}\n\n// ── Bale Orders ──\n\nexport const BALE_ORDER_STATUSES = ['pending_payment', 'paid', 'confirmed', 'in_transit', 'delivered', 'completed', 'cancelled'] as const\nexport type BaleOrderStatus = typeof BALE_ORDER_STATUSES[number]\n\nexport type BaleFulfillment = 'pickup' | 'courier'\n\nexport interface BaleOrder {\n id: string\n bale_id: string\n buyer_id: string\n seller_id: string\n store_id: string\n title: string\n grade: string\n origin: string | null\n image_url: string | null\n qty: number\n unit_kes: number\n total_kes: number\n fulfillment: BaleFulfillment\n freight_kes: number | null\n status: BaleOrderStatus\n city_id: string | null\n buyer_name: string | null\n store_name: string | null\n created_at: string\n}\n\nexport interface BaleOrderEvent {\n actor: string\n old_status: string | null\n new_status: string\n note: string | null\n created_at: string\n}\n\nexport interface CreateBaleOrderInput {\n bale_id: string\n qty?: number\n fulfillment: BaleFulfillment\n}\n\n// ── Bale Images ──\n\n/**\n * Result of uploading a bale image directly via multipart/form-data. Mirrors the listing image\n * upload result; the presign step reuses `PresignImageResponse` from the listings types.\n */\nexport interface BaleImageUploadResult {\n r2_key: string\n image_id: string\n url: string\n}\n\n// ── Wholesale Analytics ──\n\n/**\n * Performance analytics for a wholesale store. Mirrors the retail `StoreAnalytics` shape where it\n * applies (revenue series, order breakdown) and adapts the rest to bales (top bales, bale totals).\n */\nexport interface WholesaleAnalytics {\n revenue: { date: string; revenue: number; orders: number }[]\n orders_breakdown: { date: string; completed: number; pending: number; cancelled: number }[]\n top_bales: { bale_id: string; title: string; orders: number; revenue: number }[]\n totals: { bales: number; orders: number; revenue: number }\n}\n","/**\n * Canonical go.mitumba.africa share URLs — the one place clients build listing, store and bale share links.\n *\n * Forms follow Mitumba-Ltd/mitumba-links `docs/product/share-urls.md`: `/l/{listingId}`, `/s/{storeSlug}` and\n * `/b/{baleId}` with no slug, query or fragment. Pure functions: no network access, safe in any runtime.\n */\n\nexport const DEFAULT_SHARE_ORIGIN = 'https://go.mitumba.africa'\n\nexport interface ShareUrlOptions {\n /**\n * Override the share origin, e.g. a staging Worker. Must be an `https://` origin (no path, query or\n * credentials); `http://localhost` / `http://127.0.0.1` are allowed for local development.\n * Defaults to {@link DEFAULT_SHARE_ORIGIN}.\n */\n origin?: string\n}\n\nconst ID_PATTERN = /^[0-9a-f]{32}$/\nconst SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n\nfunction resolveOrigin(origin: string | undefined): string {\n if (origin === undefined) return DEFAULT_SHARE_ORIGIN\n let url: URL\n try {\n url = new URL(origin)\n } catch {\n throw new TypeError(`Invalid share origin: ${origin}`)\n }\n const local = url.protocol === 'http:' && (url.hostname === 'localhost' || url.hostname === '127.0.0.1')\n if ((url.protocol !== 'https:' && !local) || url.username || url.password) {\n throw new TypeError(`Share origin must be https:// (or http://localhost): ${origin}`)\n }\n if ((url.pathname !== '/' && url.pathname !== '') || url.search || url.hash) {\n throw new TypeError(`Share origin must not include a path, query or fragment: ${origin}`)\n }\n return url.origin\n}\n\nfunction identifier(kind: string, value: string): string {\n const normalized = typeof value === 'string' ? value.trim().toLowerCase() : ''\n if (!ID_PATTERN.test(normalized)) throw new TypeError(`Invalid ${kind} ID: ${String(value)}`)\n return normalized\n}\n\n/** `https://go.mitumba.africa/l/{listingId}` */\nexport function listingShareUrl(listingId: string, options: ShareUrlOptions = {}): string {\n return `${resolveOrigin(options.origin)}/l/${encodeURIComponent(identifier('listing', listingId))}`\n}\n\n/** `https://go.mitumba.africa/s/{storeSlug}` */\nexport function storeShareUrl(storeSlug: string, options: ShareUrlOptions = {}): string {\n const slug = typeof storeSlug === 'string' ? storeSlug.trim().toLowerCase() : ''\n if (slug.length > 64 || !SLUG_PATTERN.test(slug)) throw new TypeError(`Invalid store slug: ${String(storeSlug)}`)\n return `${resolveOrigin(options.origin)}/s/${encodeURIComponent(slug)}`\n}\n\n/** `https://go.mitumba.africa/b/{baleId}` */\nexport function baleShareUrl(baleId: string, options: ShareUrlOptions = {}): string {\n return `${resolveOrigin(options.origin)}/b/${encodeURIComponent(identifier('bale', baleId))}`\n}\n","import { APIClient } from './client'\nimport { MitumbaClientConfig } from './types'\nimport { AuthModule } from './modules/auth'\nimport { ListingsModule } from './modules/listings'\nimport { SearchModule } from './modules/search'\nimport { OrdersModule } from './modules/orders'\nimport { PayModule } from './modules/pay'\nimport { VaziModule } from './modules/vazi'\nimport { MessagesModule } from './modules/messages'\nimport { NotificationsModule } from './modules/notifications'\nimport { StoresModule } from './modules/stores'\nimport { ReviewsModule } from './modules/reviews'\nimport { WishlistsModule } from './modules/wishlists'\nimport { CartModule } from './modules/cart'\nimport { SettingsModule } from './modules/settings'\nimport { MailerModule } from './modules/mailer'\nimport { BusinessesModule } from './modules/businesses'\nimport { AdminModule } from './modules/admin'\nimport { DisputesModule } from './modules/disputes'\nimport { UploadsModule } from './modules/uploads'\nimport { ReportsModule } from './modules/reports'\nimport { WholesaleModule } from './modules/wholesale'\n\nexport class MitumbaClient {\n public readonly api: APIClient\n public readonly auth: AuthModule\n public readonly listings: ListingsModule\n public readonly search: SearchModule\n public readonly orders: OrdersModule\n public readonly pay: PayModule\n public readonly vazi: VaziModule\n public readonly messages: MessagesModule\n public readonly notifications: NotificationsModule\n public readonly stores: StoresModule\n public readonly reviews: ReviewsModule\n public readonly wishlists: WishlistsModule\n public readonly cart: CartModule\n public readonly settings: SettingsModule\n public readonly mailer: MailerModule\n public readonly businesses: BusinessesModule\n public readonly admin: AdminModule\n public readonly disputes: DisputesModule\n public readonly uploads: UploadsModule\n public readonly reports: ReportsModule\n public readonly wholesale: WholesaleModule\n\n constructor(config: MitumbaClientConfig) {\n this.api = new APIClient(config)\n this.auth = new AuthModule(this.api)\n this.listings = new ListingsModule(this.api)\n this.search = new SearchModule(this.api)\n this.orders = new OrdersModule(this.api)\n this.pay = new PayModule(this.api)\n this.vazi = new VaziModule(this.api)\n this.messages = new MessagesModule(this.api)\n this.notifications = new NotificationsModule(this.api)\n this.stores = new StoresModule(this.api)\n this.reviews = new ReviewsModule(this.api)\n this.wishlists = new WishlistsModule(this.api)\n this.cart = new CartModule(this.api)\n this.settings = new SettingsModule(this.api)\n this.mailer = new MailerModule(this.api)\n this.businesses = new BusinessesModule(this.api)\n this.admin = new AdminModule(this.api)\n this.disputes = new DisputesModule(this.api)\n this.uploads = new UploadsModule(this.api)\n this.reports = new ReportsModule(this.api)\n this.wholesale = new WholesaleModule(this.api)\n }\n\n /**\n * Set the access token for authenticated requests.\n * Optionally pass a refresh token to enable automatic token rotation.\n */\n public setToken(token: string, refreshToken?: string) {\n this.api.setToken(token, refreshToken)\n }\n\n /**\n * Set both tokens explicitly. Preferred — prevents dropping the refresh token.\n */\n public setSession(tokens: { access_token: string; refresh_token: string }) {\n return this.api.setSession(tokens)\n }\n\n /**\n * Get the current access token.\n */\n public getToken(): string | undefined {\n return this.api.getToken()\n }\n\n /**\n * Clear the current tokens.\n */\n public clearToken() {\n this.api.clearToken()\n }\n\n /**\n * Hydrate tokens from persistent store (call on app boot).\n */\n public hydrate(): Promise<void> {\n return this.api.hydrate()\n }\n\n /**\n * Check if user has a stored session.\n */\n public isAuthenticated(): Promise<boolean> {\n return this.api.isAuthenticated()\n }\n}\n\nexport * from './types'\nexport { APIClient, APIError } from './client'\nexport { MemoryTokenStore, IDBTokenStore, createTokenStore } from './token-store'\nexport type { TokenStore } from './token-store'\nexport { AuthModule } from './modules/auth'\nexport { ListingsModule } from './modules/listings'\nexport { SearchModule } from './modules/search'\nexport { OrdersModule } from './modules/orders'\nexport { PayModule } from './modules/pay'\nexport { VaziModule } from './modules/vazi'\nexport { MessagesModule } from './modules/messages'\nexport { NotificationsModule } from './modules/notifications'\nexport { StoresModule } from './modules/stores'\nexport { ReviewsModule } from './modules/reviews'\nexport { WishlistsModule } from './modules/wishlists'\nexport { CartModule } from './modules/cart'\nexport { SettingsModule } from './modules/settings'\nexport { MailerModule } from './modules/mailer'\nexport { BusinessesModule } from './modules/businesses'\nexport { AdminModule } from './modules/admin'\nexport { DisputesModule } from './modules/disputes'\nexport { UploadsModule } from './modules/uploads'\nexport { ReportsModule } from './modules/reports'\nexport { WholesaleModule } from './modules/wholesale'\n\nexport { DEFAULT_SHARE_ORIGIN, listingShareUrl, storeShareUrl, baleShareUrl } from './share'\nexport type { ShareUrlOptions } from './share'\n"]}
|