@kaelum/pay 0.1.0 → 0.1.2

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.cjs CHANGED
@@ -271,10 +271,12 @@ function toPaylink(raw) {
271
271
  }
272
272
  return void 0;
273
273
  };
274
+ const embedToken = asOptionalString(get("embedToken", "embed_token", "token"));
275
+ const rawUrl = asOptionalString(get("url", "payment_url", "paymentUrl", "checkout_url", "embed_url", "link"));
274
276
  return {
275
- id: String(get("id", "paylink_id", "embedToken", "embed_token") ?? ""),
276
- url: String(get("url", "payment_url", "paymentUrl", "checkout_url") ?? ""),
277
- embedToken: asOptionalString(get("embedToken", "embed_token", "token")),
277
+ id: String(get("id", "paylink_id") ?? embedToken ?? ""),
278
+ url: rawUrl ?? (embedToken ? `https://kaelum.app/pay/${embedToken}` : ""),
279
+ embedToken,
278
280
  embedHtml: asOptionalString(get("embedHtml", "embed_html", "html")),
279
281
  amountGbp: Number(get("amountGbp", "amount_gbp", "amount") ?? 0),
280
282
  description: String(get("description") ?? ""),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/transport.ts","../src/resources/paylinks.ts","../src/resources/payments.ts","../src/resources/data.ts","../src/webhooks.ts","../src/client.ts"],"names":["optionalString","optionalNumber","pickArray","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error types raised by the KAELUM Pay SDK.\n *\n * Every error thrown by the SDK extends {@link KaelumError}, so a single\n * `catch (err) { if (err instanceof KaelumError) ... }` covers them all.\n */\n\n/** Base class for all errors raised by the KAELUM Pay SDK. */\nexport class KaelumError extends Error {\n /** Machine-readable error code. */\n public readonly code: string;\n\n constructor(message: string, code = \"kaelum_error\") {\n super(message);\n this.name = \"KaelumError\";\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Raised when the KAELUM Pay API returns an error response, or when an\n * MCP tool call completes with an error result.\n */\nexport class KaelumApiError extends KaelumError {\n /** HTTP status code, when the error came from an HTTP response. */\n public readonly status?: number;\n /** The tool or endpoint that produced the error. */\n public readonly tool?: string;\n /** The raw error payload returned by the server, when available. */\n public readonly raw?: unknown;\n\n constructor(\n message: string,\n options: { status?: number; tool?: string; code?: string; raw?: unknown } = {},\n ) {\n super(message, options.code ?? \"api_error\");\n this.name = \"KaelumApiError\";\n this.status = options.status;\n this.tool = options.tool;\n this.raw = options.raw;\n }\n}\n\n/**\n * Raised when authentication fails: a missing, malformed, or rejected\n * secret key, session token, or user API key.\n */\nexport class KaelumAuthenticationError extends KaelumApiError {\n constructor(message: string, options: { status?: number; tool?: string; raw?: unknown } = {}) {\n super(message, { ...options, code: \"authentication_error\" });\n this.name = \"KaelumAuthenticationError\";\n }\n}\n\n/**\n * Raised when the SDK cannot reach the KAELUM Pay API: a network failure,\n * a timeout, or an unparseable response.\n */\nexport class KaelumConnectionError extends KaelumError {\n /** The underlying cause, when one is available. */\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message, \"connection_error\");\n this.name = \"KaelumConnectionError\";\n this.cause = cause;\n }\n}\n\n/**\n * Raised by {@link Webhooks.constructEvent} when a webhook payload fails\n * signature verification. Treat this as a hostile request: never act on\n * the payload.\n */\nexport class KaelumSignatureVerificationError extends KaelumError {\n constructor(message: string) {\n super(message, \"signature_verification_failed\");\n this.name = \"KaelumSignatureVerificationError\";\n }\n}\n\n/** Raised when the SDK is given invalid arguments before any network call. */\nexport class KaelumInvalidRequestError extends KaelumError {\n constructor(message: string) {\n super(message, \"invalid_request\");\n this.name = \"KaelumInvalidRequestError\";\n }\n}\n","/**\n * The current version of the KAELUM Pay SDK.\n * Kept in sync with the `version` field in package.json.\n */\nexport const VERSION = \"0.1.0\";\n","/**\n * Transport layer for the KAELUM Pay SDK.\n *\n * The KAELUM Pay API is exposed as an MCP (Model Context Protocol) server\n * over JSON-RPC 2.0. This module is the only place in the SDK that speaks\n * the wire protocol: every resource method calls {@link McpTransport.call}\n * with a tool name and arguments, and receives a parsed result back.\n */\n\nimport {\n KaelumApiError,\n KaelumAuthenticationError,\n KaelumConnectionError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\n/** The production KAELUM MCP endpoint. */\nexport const DEFAULT_BASE_URL =\n \"https://kaelum-mcp.kaelumtechnologies.workers.dev/mcp\";\n\n/** Parsed result of an MCP tool call. */\nexport type McpResult = Record<string, unknown>;\n\ninterface TransportOptions {\n baseUrl?: string;\n timeoutMs?: number;\n maxRetries?: number;\n fetch?: typeof fetch;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number;\n result?: {\n content?: Array<{ type: string; text?: string }>;\n structuredContent?: unknown;\n isError?: boolean;\n };\n error?: { code: number; message: string; data?: unknown };\n}\n\n/** Speaks JSON-RPC 2.0 to the KAELUM MCP server. */\nexport class McpTransport {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: typeof fetch;\n private requestId = 0;\n\n constructor(options: TransportOptions = {}) {\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.maxRetries = options.maxRetries ?? 2;\n\n const resolvedFetch = options.fetch ?? globalThis.fetch;\n if (typeof resolvedFetch !== \"function\") {\n throw new KaelumConnectionError(\n \"No `fetch` implementation found. Use Node.js 18 or later, or pass a `fetch` option.\",\n );\n }\n this.fetchImpl = resolvedFetch;\n }\n\n /**\n * Call a KAELUM MCP tool by name and return its parsed result.\n *\n * @param tool - The MCP tool name, for example `kaelum_create_paylink`.\n * @param args - Arguments for the tool, in the server's snake_case form.\n */\n async call(tool: string, args: Record<string, unknown>): Promise<McpResult> {\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n id: ++this.requestId,\n method: \"tools/call\",\n params: { name: tool, arguments: args },\n });\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n return await this.send(tool, body);\n } catch (err) {\n lastError = err;\n // API and authentication errors are deterministic. Do not retry them.\n if (err instanceof KaelumApiError) throw err;\n if (attempt < this.maxRetries) {\n await delay(250 * 2 ** attempt);\n continue;\n }\n }\n }\n throw lastError instanceof Error\n ? new KaelumConnectionError(\n `Could not reach the KAELUM Pay API: ${lastError.message}`,\n lastError,\n )\n : new KaelumConnectionError(\"Could not reach the KAELUM Pay API.\");\n }\n\n private async send(tool: string, body: string): Promise<McpResult> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n \"User-Agent\": `kaelum-pay-node/${VERSION}`,\n },\n body,\n signal: controller.signal,\n });\n } catch (err) {\n throw new KaelumConnectionError(\n err instanceof Error && err.name === \"AbortError\"\n ? `Request timed out after ${this.timeoutMs}ms.`\n : \"Network request failed.\",\n err,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const text = await response.text();\n\n if (response.status === 401 || response.status === 403) {\n throw new KaelumAuthenticationError(\n \"The KAELUM Pay API rejected the request credentials.\",\n { status: response.status, tool, raw: text },\n );\n }\n if (!response.ok) {\n throw new KaelumApiError(\n `The KAELUM Pay API returned HTTP ${response.status}.`,\n { status: response.status, tool, raw: text },\n );\n }\n\n const rpc = parseJsonRpc(text);\n\n if (rpc.error) {\n throw new KaelumApiError(rpc.error.message || \"MCP call failed.\", {\n tool,\n code: `rpc_${rpc.error.code}`,\n raw: rpc.error.data ?? rpc.error,\n });\n }\n\n const result = rpc.result ?? {};\n const parsed = extractResult(result);\n return unwrapEnvelope(parsed, tool, result.isError === true);\n }\n}\n\n/**\n * KAELUM MCP tools return a standard envelope:\n * `{ success, data, meta, timestamp, api_version, platform }`.\n * This unwraps the envelope to the `data` payload, and turns an\n * unsuccessful response into a typed error.\n */\nfunction unwrapEnvelope(\n parsed: McpResult,\n tool: string,\n isError: boolean,\n): McpResult {\n const hasEnvelope =\n typeof parsed[\"success\"] === \"boolean\" && \"data\" in parsed;\n const failed = isError || parsed[\"success\"] === false;\n\n if (failed) {\n const message = errorMessage(parsed);\n if (/auth|unauthor|invalid key|forbidden|secret key/i.test(message)) {\n throw new KaelumAuthenticationError(message, { tool, raw: parsed });\n }\n throw new KaelumApiError(message, { tool, raw: parsed });\n }\n\n if (hasEnvelope) {\n const data = parsed[\"data\"];\n if (data && typeof data === \"object\") return data as McpResult;\n return { value: data };\n }\n return parsed;\n}\n\n/** Pull a human-readable message out of an error payload. */\nfunction errorMessage(parsed: McpResult): string {\n const candidate = parsed[\"error\"] ?? parsed[\"message\"];\n if (typeof candidate === \"string\" && candidate) return candidate;\n if (candidate && typeof candidate === \"object\") {\n const nested = (candidate as Record<string, unknown>)[\"message\"];\n if (typeof nested === \"string\" && nested) return nested;\n }\n return \"The KAELUM Pay tool returned an error.\";\n}\n\n/** Parse a JSON-RPC response, accepting both plain JSON and SSE framing. */\nfunction parseJsonRpc(text: string): JsonRpcResponse {\n const trimmed = text.trim();\n // Server-sent events framing: pull the JSON out of the last `data:` line.\n if (trimmed.startsWith(\"event:\") || trimmed.includes(\"\\ndata:\")) {\n const dataLines = trimmed\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trim());\n const payload = dataLines[dataLines.length - 1];\n if (payload) {\n return JSON.parse(payload) as JsonRpcResponse;\n }\n }\n try {\n return JSON.parse(trimmed) as JsonRpcResponse;\n } catch {\n throw new KaelumConnectionError(\n \"The KAELUM Pay API returned a response that could not be parsed.\",\n );\n }\n}\n\n/** Turn an MCP tool result into a plain object. */\nfunction extractResult(result: NonNullable<JsonRpcResponse[\"result\"]>): McpResult {\n if (result.structuredContent && typeof result.structuredContent === \"object\") {\n return result.structuredContent as McpResult;\n }\n const textBlock = result.content?.find((block) => block.type === \"text\");\n const raw = textBlock?.text ?? \"\";\n if (!raw) return {};\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as McpResult;\n return { value: parsed };\n } catch {\n // Not JSON: return the human-readable text under a `message` key.\n return { message: raw };\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Pay links: fixed-amount hosted checkout pages.\n *\n * A pay link is the simplest way to accept KLM. Create one server-side,\n * then either redirect the customer to {@link Paylink.url} or render the\n * embedded checkout widget against it. See `docs/checkout.md`.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type { Paylink, PaylinkCreateParams, PaylinkListParams } from \"../types.js\";\n\n/** Create and list KAELUM Pay links. */\nexport class Paylinks {\n constructor(\n private readonly transport: McpTransport,\n private readonly secretKey: string,\n ) {}\n\n /**\n * Create a fixed-amount pay link.\n *\n * The returned {@link Paylink.url} is a hosted checkout page. Redirect a\n * customer to it, or pass it to the embedded checkout widget. Customers\n * receive the standard 6%+ KLM spending discount automatically.\n *\n * @example\n * ```ts\n * const link = await kaelum.paylinks.create({\n * amountGbp: 49.99,\n * description: \"Order #1024\",\n * redirectUrl: \"https://shop.example.com/thank-you\",\n * webhookUrl: \"https://shop.example.com/webhooks/kaelum\",\n * });\n * // Send the customer to link.url\n * ```\n */\n async create(params: PaylinkCreateParams): Promise<Paylink> {\n if (!(params.amountGbp > 0)) {\n throw new KaelumInvalidRequestError(\"`amountGbp` must be greater than 0.\");\n }\n if (!params.description?.trim()) {\n throw new KaelumInvalidRequestError(\"`description` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_create_paylink\", {\n amount_gbp: params.amountGbp,\n description: params.description,\n developer_secret_key: this.secretKey,\n ...(params.redirectUrl ? { redirect_url: params.redirectUrl } : {}),\n ...(params.webhookUrl ? { webhook_url: params.webhookUrl } : {}),\n });\n\n return toPaylink(result);\n }\n\n /**\n * List your existing pay links, most recent first.\n *\n * @example\n * ```ts\n * const links = await kaelum.paylinks.list({ limit: 25 });\n * ```\n */\n async list(params: PaylinkListParams = {}): Promise<Paylink[]> {\n const result = await this.transport.call(\"kaelum_list_paylinks\", {\n developer_secret_key: this.secretKey,\n ...(params.limit ? { limit: params.limit } : {}),\n });\n\n const items = pickArray(result);\n return items.map(toPaylink);\n }\n}\n\n/** Normalise a raw MCP result into a {@link Paylink}. */\nexport function toPaylink(raw: Record<string, unknown>): Paylink {\n const get = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (raw[key] !== undefined && raw[key] !== null) return raw[key];\n }\n return undefined;\n };\n\n return {\n id: String(get(\"id\", \"paylink_id\", \"embedToken\", \"embed_token\") ?? \"\"),\n url: String(get(\"url\", \"payment_url\", \"paymentUrl\", \"checkout_url\") ?? \"\"),\n embedToken: asOptionalString(get(\"embedToken\", \"embed_token\", \"token\")),\n embedHtml: asOptionalString(get(\"embedHtml\", \"embed_html\", \"html\")),\n amountGbp: Number(get(\"amountGbp\", \"amount_gbp\", \"amount\") ?? 0),\n description: String(get(\"description\") ?? \"\"),\n status: asOptionalString(get(\"status\")) as Paylink[\"status\"],\n redirectUrl: asOptionalString(get(\"redirectUrl\", \"redirect_url\")),\n webhookUrl: asOptionalString(get(\"webhookUrl\", \"webhook_url\")),\n usageCount: asOptionalNumber(get(\"usageCount\", \"usage_count\", \"uses\")),\n createdAt: asOptionalString(get(\"createdAt\", \"created_at\", \"created\")),\n };\n}\n\nfunction pickArray(result: Record<string, unknown>): Array<Record<string, unknown>> {\n if (Array.isArray(result)) return result as Array<Record<string, unknown>>;\n for (const key of [\"paylinks\", \"data\", \"items\", \"results\"]) {\n const value = result[key];\n if (Array.isArray(value)) return value as Array<Record<string, unknown>>;\n }\n return [];\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction asOptionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Server-to-server KLM payments.\n *\n * This is the direct payment API. It moves KLM from a customer account to\n * a merchant or creator account. Use it when you are building an agent, a\n * point-of-sale flow, or any integration that holds a customer session.\n *\n * The flow is two-step and deliberate:\n * 1. {@link Payments.initiate} returns a PENDING transaction.\n * 2. After the customer confirms the details, {@link Payments.confirm}\n * executes the transfer. A confirmed transfer cannot be reversed.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type {\n AuthenticateParams,\n AuthSession,\n PaymentInitiateParams,\n PaymentTransaction,\n} from \"../types.js\";\n\n/** Authenticate a KAELUM account for the server-to-server payment API. */\nexport class Auth {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * Exchange an account number and personal API key for a session token.\n * The token is valid for roughly one hour.\n *\n * @example\n * ```ts\n * const session = await kaelum.auth.authenticate({\n * accountNumber: \"KA-100245\",\n * apiKey: process.env.KAELUM_USER_KEY!,\n * });\n * ```\n */\n async authenticate(params: AuthenticateParams): Promise<AuthSession> {\n if (!params.accountNumber?.trim()) {\n throw new KaelumInvalidRequestError(\"`accountNumber` is required.\");\n }\n if (!params.apiKey?.trim()) {\n throw new KaelumInvalidRequestError(\"`apiKey` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_authenticate\", {\n account_number: params.accountNumber,\n api_key: params.apiKey,\n });\n\n const token = result[\"sessionToken\"] ?? result[\"session_token\"] ?? result[\"token\"];\n if (typeof token !== \"string\" || !token) {\n throw new KaelumInvalidRequestError(\n \"Authentication did not return a session token.\",\n );\n }\n return {\n sessionToken: token,\n expiresAt: optionalString(result[\"expiresAt\"] ?? result[\"expires_at\"]),\n };\n }\n}\n\n/** Initiate, confirm, cancel, and check KLM payments. */\nexport class Payments {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * Initiate a KLM payment. Returns a PENDING transaction with full\n * details. Always present those details to the customer and require\n * explicit confirmation before calling {@link Payments.confirm}.\n */\n async initiate(params: PaymentInitiateParams): Promise<PaymentTransaction> {\n if (!(params.amountKlm >= 1)) {\n throw new KaelumInvalidRequestError(\"`amountKlm` must be at least 1.\");\n }\n if (!params.merchantId?.trim()) {\n throw new KaelumInvalidRequestError(\"`merchantId` is required.\");\n }\n if (!params.sessionToken?.trim()) {\n throw new KaelumInvalidRequestError(\"`sessionToken` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_payment_initiate\", {\n amount_klm: params.amountKlm,\n merchant_id: params.merchantId,\n session_token: params.sessionToken,\n ...(params.reference ? { reference: params.reference } : {}),\n });\n return toTransaction(result);\n }\n\n /**\n * Confirm and execute a previously initiated payment.\n * This transfers KLM and cannot be reversed.\n */\n async confirm(sessionToken: string, transactionId: string): Promise<PaymentTransaction> {\n requireToken(sessionToken);\n requireTransactionId(transactionId);\n const result = await this.transport.call(\"kaelum_payment_confirm\", {\n session_token: sessionToken,\n transaction_id: transactionId,\n });\n return toTransaction(result);\n }\n\n /** Cancel a payment that is still PENDING. */\n async cancel(sessionToken: string, transactionId: string): Promise<PaymentTransaction> {\n requireToken(sessionToken);\n requireTransactionId(transactionId);\n const result = await this.transport.call(\"kaelum_payment_cancel\", {\n session_token: sessionToken,\n transaction_id: transactionId,\n });\n return toTransaction(result);\n }\n\n /**\n * Check the current status of a transaction. Accepts either a session\n * token or a read-only API key.\n *\n * @example\n * ```ts\n * const tx = await kaelum.payments.status(\"txn_abc123\", {\n * sessionToken: session.sessionToken,\n * });\n * ```\n */\n async status(\n transactionId: string,\n auth: { sessionToken?: string; apiKey?: string },\n ): Promise<PaymentTransaction> {\n requireTransactionId(transactionId);\n if (!auth.sessionToken && !auth.apiKey) {\n throw new KaelumInvalidRequestError(\n \"Provide either a `sessionToken` or an `apiKey` to check status.\",\n );\n }\n const result = await this.transport.call(\"kaelum_payment_status\", {\n transaction_id: transactionId,\n ...(auth.sessionToken ? { session_token: auth.sessionToken } : {}),\n ...(auth.apiKey ? { api_key: auth.apiKey } : {}),\n });\n return toTransaction(result);\n }\n}\n\n/** Normalise a raw MCP result into a {@link PaymentTransaction}. */\nexport function toTransaction(raw: Record<string, unknown>): PaymentTransaction {\n const get = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (raw[key] !== undefined && raw[key] !== null) return raw[key];\n }\n return undefined;\n };\n return {\n transactionId: String(\n get(\"transactionId\", \"transaction_id\", \"id\", \"txn_id\") ?? \"\",\n ),\n status: String(get(\"status\") ?? \"PENDING\") as PaymentTransaction[\"status\"],\n amountKlm: Number(get(\"amountKlm\", \"amount_klm\", \"amount\") ?? 0),\n amountGbp: optionalNumber(get(\"amountGbp\", \"amount_gbp\")),\n merchantId: String(get(\"merchantId\", \"merchant_id\") ?? \"\"),\n reference: optionalString(get(\"reference\")),\n createdAt: optionalString(get(\"createdAt\", \"created_at\", \"created\")),\n };\n}\n\nfunction requireToken(token: string): void {\n if (!token?.trim()) {\n throw new KaelumInvalidRequestError(\"A session token is required.\");\n }\n}\n\nfunction requireTransactionId(id: string): void {\n if (!id?.trim()) {\n throw new KaelumInvalidRequestError(\"A transaction ID is required.\");\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Read-only KAELUM resources: KLM price, account balances, the merchant\n * directory, developer keys, and K.A.T.E. engine status.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type {\n AccountBalance,\n DeveloperKey,\n KateStatus,\n KlmPrice,\n Merchant,\n} from \"../types.js\";\n\n/** The current KLM price, governed by the K.A.T.E. engine. */\nexport class Klm {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the current KLM price. */\n async price(): Promise<KlmPrice> {\n const raw = await this.transport.call(\"kaelum_get_klm_price\", {});\n return {\n priceGbp: Number(\n raw[\"priceGbp\"] ?? raw[\"price_gbp\"] ?? raw[\"price\"] ?? raw[\"current_price_gbp\"] ?? 0,\n ),\n currency: optionalString(raw[\"currency\"]) ?? \"GBP\",\n asOf: optionalString(raw[\"asOf\"] ?? raw[\"as_of\"] ?? raw[\"timestamp\"]),\n };\n }\n}\n\n/** KAELUM account balances. */\nexport class Balances {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the balance summary for a KAELUM account. */\n async retrieve(userId: string): Promise<AccountBalance> {\n if (!userId?.trim()) {\n throw new KaelumInvalidRequestError(\"`userId` is required.\");\n }\n const raw = await this.transport.call(\"kaelum_get_user_balance\", {\n user_id: userId,\n });\n return {\n userId,\n balanceKlm: Number(raw[\"balanceKlm\"] ?? raw[\"balance_klm\"] ?? raw[\"balance\"] ?? 0),\n balanceGbp: optionalNumber(raw[\"balanceGbp\"] ?? raw[\"balance_gbp\"]),\n tier: optionalString(raw[\"tier\"] ?? raw[\"account_tier\"]),\n status: optionalString(raw[\"status\"] ?? raw[\"account_status\"]),\n };\n }\n}\n\n/** The KAELUM merchant and creator directory. */\nexport class Merchants {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * List merchants and creators that can receive KLM payments.\n *\n * @param query - Optional keyword to filter the directory.\n */\n async list(query?: string): Promise<Merchant[]> {\n const raw = await this.transport.call(\n \"kaelum_get_merchants\",\n query ? { query } : {},\n );\n const items = pickArray(raw, [\"merchants\", \"data\", \"items\", \"results\"]);\n return items.map((item) => ({\n id: String(item[\"id\"] ?? item[\"merchant_id\"] ?? item[\"account_id\"] ?? \"\"),\n name: String(item[\"name\"] ?? item[\"merchant_name\"] ?? \"\"),\n tier: optionalString(item[\"tier\"]),\n }));\n }\n}\n\n/** Your KAELUM Pay developer API keys. */\nexport class DeveloperKeys {\n constructor(\n private readonly transport: McpTransport,\n private readonly secretKey: string,\n ) {}\n\n /** List the developer API keys on your account. */\n async list(): Promise<DeveloperKey[]> {\n const raw = await this.transport.call(\"kaelum_get_developer_keys\", {\n developer_secret_key: this.secretKey,\n });\n const items = pickArray(raw, [\"keys\", \"data\", \"items\", \"results\"]);\n return items.map((item) => ({\n id: String(item[\"id\"] ?? item[\"key_id\"] ?? \"\"),\n publishableKey: optionalString(item[\"publishableKey\"] ?? item[\"publishable_key\"]),\n status: optionalString(item[\"status\"]),\n createdAt: optionalString(item[\"createdAt\"] ?? item[\"created_at\"]),\n }));\n }\n}\n\n/** Health of the K.A.T.E. (Kaelum Audivo Triovus Engine). */\nexport class Kate {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the current K.A.T.E. engine status. */\n async status(): Promise<KateStatus> {\n const raw = await this.transport.call(\"kaelum_get_kate_status\", {});\n return {\n status: String(raw[\"overall_status\"] ?? raw[\"status\"] ?? \"OPERATIONAL\"),\n activeAgents: optionalNumber(\n raw[\"active_agent_count\"] ?? raw[\"agents_active\"] ?? raw[\"activeAgents\"],\n ),\n lastHeartbeat: optionalString(\n raw[\"last_assessment\"] ?? raw[\"lastHeartbeat\"] ?? raw[\"last_heartbeat\"],\n ),\n };\n }\n}\n\nfunction pickArray(\n raw: Record<string, unknown>,\n keys: string[],\n): Array<Record<string, unknown>> {\n if (Array.isArray(raw)) return raw as Array<Record<string, unknown>>;\n for (const key of keys) {\n const value = raw[key];\n if (Array.isArray(value)) return value as Array<Record<string, unknown>>;\n }\n return [];\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Webhook verification.\n *\n * KAELUM Pay signs every webhook delivery with HMAC-SHA256, using the\n * signing secret shown when you register a webhook endpoint. Always verify\n * the signature before acting on a webhook: an unverified request is an\n * untrusted request.\n *\n * Pass the *raw, unparsed* request body to {@link Webhooks.constructEvent}.\n * Parsing the body to JSON first and then re-serialising it will change\n * the bytes and break verification.\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { KaelumSignatureVerificationError } from \"./errors.js\";\nimport type { WebhookEvent } from \"./types.js\";\n\n/** Options for {@link Webhooks.constructEvent}. */\nexport interface ConstructEventOptions {\n /**\n * Maximum age of a webhook, in seconds, when the signature header\n * carries a timestamp. Deliveries older than this are rejected as a\n * defence against replay. Set to 0 to disable the check. Defaults to 300.\n */\n toleranceSeconds?: number;\n}\n\n/** Verify and parse incoming KAELUM Pay webhooks. */\nexport class Webhooks {\n /**\n * Verify a webhook signature and return the parsed event.\n *\n * @param rawBody - The raw request body, exactly as received.\n * @param signatureHeader - The value of the `Kaelum-Signature` header.\n * @param signingSecret - Your webhook signing secret (`whsec_...`).\n * @throws {@link KaelumSignatureVerificationError} when verification fails.\n *\n * @example\n * ```ts\n * app.post(\"/webhooks/kaelum\", express.raw({ type: \"*\\/*\" }), (req, res) => {\n * try {\n * const event = kaelum.webhooks.constructEvent(\n * req.body,\n * req.headers[\"kaelum-signature\"] as string,\n * process.env.KAELUM_WEBHOOK_SECRET!,\n * );\n * if (event.type === \"payment.succeeded\") fulfilOrder(event.data);\n * res.sendStatus(200);\n * } catch {\n * res.sendStatus(400);\n * }\n * });\n * ```\n */\n constructEvent(\n rawBody: string | Buffer,\n signatureHeader: string | undefined,\n signingSecret: string,\n options: ConstructEventOptions = {},\n ): WebhookEvent {\n if (!this.verify(rawBody, signatureHeader, signingSecret, options)) {\n throw new KaelumSignatureVerificationError(\n \"Webhook signature verification failed. The request was not accepted.\",\n );\n }\n const payload = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n throw new KaelumSignatureVerificationError(\n \"Webhook body could not be parsed as JSON.\",\n );\n }\n const obj = (parsed ?? {}) as Record<string, unknown>;\n return {\n id: String(obj[\"id\"] ?? obj[\"event_id\"] ?? \"\"),\n type: String(obj[\"type\"] ?? obj[\"event\"] ?? \"\"),\n createdAt: optionalString(obj[\"createdAt\"] ?? obj[\"created_at\"] ?? obj[\"created\"]),\n data: (obj[\"data\"] ?? obj[\"payload\"] ?? obj) as Record<string, unknown>,\n };\n }\n\n /**\n * Verify a webhook signature without parsing the body.\n * Returns `true` when the signature is valid, `false` otherwise.\n * Never throws.\n */\n verify(\n rawBody: string | Buffer,\n signatureHeader: string | undefined,\n signingSecret: string,\n options: ConstructEventOptions = {},\n ): boolean {\n if (!signatureHeader || !signingSecret) return false;\n\n const payload = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n const parts = parseSignatureHeader(signatureHeader);\n\n // Optional replay protection when the header carries a timestamp.\n const tolerance = options.toleranceSeconds ?? 300;\n if (parts.timestamp !== undefined && tolerance > 0) {\n const ageSeconds = Math.abs(Date.now() / 1000 - parts.timestamp);\n if (ageSeconds > tolerance) return false;\n }\n\n // When a timestamp is present, it is part of the signed payload.\n const signedPayload =\n parts.timestamp !== undefined ? `${parts.timestamp}.${payload}` : payload;\n const expected = createHmac(\"sha256\", signingSecret)\n .update(signedPayload, \"utf8\")\n .digest(\"hex\");\n\n return parts.signatures.some((candidate) => safeEqual(candidate, expected));\n }\n}\n\ninterface ParsedSignature {\n timestamp?: number;\n signatures: string[];\n}\n\n/**\n * Parse a signature header. Supports three common encodings:\n * - a bare hex digest: `a1b2c3...`\n * - a prefixed digest: `sha256=a1b2c3...`\n * - a timestamped, comma-separated form: `t=1700000000,v1=a1b2c3...`\n */\nfunction parseSignatureHeader(header: string): ParsedSignature {\n const value = header.trim();\n const signatures: string[] = [];\n let timestamp: number | undefined;\n\n if (value.includes(\"=\") && value.includes(\",\")) {\n for (const segment of value.split(\",\")) {\n const [key, raw] = segment.split(\"=\").map((s) => s.trim());\n if (!key || !raw) continue;\n if (key === \"t\") {\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) timestamp = parsed;\n } else if (key.startsWith(\"v\")) {\n signatures.push(raw.toLowerCase());\n }\n }\n } else if (value.toLowerCase().startsWith(\"sha256=\")) {\n signatures.push(value.slice(7).toLowerCase());\n } else {\n signatures.push(value.toLowerCase());\n }\n\n return { timestamp, signatures };\n}\n\n/** Constant-time string comparison over hex digests. */\nfunction safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n try {\n return timingSafeEqual(Buffer.from(a, \"utf8\"), Buffer.from(b, \"utf8\"));\n } catch {\n return false;\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n","/**\n * The KAELUM Pay client.\n *\n * `KaelumPay` is the single entry point for the server-side SDK. Construct\n * it once with your developer secret key and reuse it across requests.\n */\n\nimport { McpTransport } from \"./transport.js\";\nimport { KaelumInvalidRequestError } from \"./errors.js\";\nimport { Paylinks } from \"./resources/paylinks.js\";\nimport { Auth, Payments } from \"./resources/payments.js\";\nimport { Balances, DeveloperKeys, Kate, Klm, Merchants } from \"./resources/data.js\";\nimport { Webhooks } from \"./webhooks.js\";\nimport type { KaelumPayOptions } from \"./types.js\";\n\n/**\n * Accept KLM, the Ai-governed closed-loop digital commerce currency, as a\n * payment option on any website or app.\n *\n * @example\n * ```ts\n * import { KaelumPay } from \"@kaelum/pay\";\n *\n * const kaelum = new KaelumPay({ secretKey: process.env.KAELUM_SECRET_KEY! });\n *\n * const link = await kaelum.paylinks.create({\n * amountGbp: 24.00,\n * description: \"One month subscription\",\n * });\n * console.log(link.url);\n * ```\n */\nexport class KaelumPay {\n /** Create and list hosted pay links. */\n public readonly paylinks: Paylinks;\n /** Authenticate accounts for the server-to-server payment API. */\n public readonly auth: Auth;\n /** Initiate, confirm, cancel, and check KLM payments. */\n public readonly payments: Payments;\n /** Retrieve the current KLM price. */\n public readonly klm: Klm;\n /** Retrieve KAELUM account balances. */\n public readonly balances: Balances;\n /** Browse the merchant and creator directory. */\n public readonly merchants: Merchants;\n /** List your developer API keys. */\n public readonly developerKeys: DeveloperKeys;\n /** Check K.A.T.E. engine health. */\n public readonly kate: Kate;\n /** Verify and parse incoming webhooks. */\n public readonly webhooks: Webhooks;\n\n constructor(options: KaelumPayOptions) {\n if (!options || typeof options.secretKey !== \"string\" || !options.secretKey.trim()) {\n throw new KaelumInvalidRequestError(\n \"A KAELUM Pay `secretKey` is required. Generate one at https://kaelum.app/developer/portal.\",\n );\n }\n if (!options.secretKey.startsWith(\"sk_\")) {\n throw new KaelumInvalidRequestError(\n \"The `secretKey` looks invalid. It should start with `sk_live_`. \" +\n \"Do not pass a publishable key (`pk_live_`) here.\",\n );\n }\n\n const secretKey = options.secretKey;\n const transport = new McpTransport({\n baseUrl: options.baseUrl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n });\n\n this.paylinks = new Paylinks(transport, secretKey);\n this.auth = new Auth(transport);\n this.payments = new Payments(transport);\n this.klm = new Klm(transport);\n this.balances = new Balances(transport);\n this.merchants = new Merchants(transport);\n this.developerKeys = new DeveloperKeys(transport, secretKey);\n this.kate = new Kate(transport);\n this.webhooks = new Webhooks();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/transport.ts","../src/resources/paylinks.ts","../src/resources/payments.ts","../src/resources/data.ts","../src/webhooks.ts","../src/client.ts"],"names":["optionalString","optionalNumber","pickArray","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error types raised by the KAELUM Pay SDK.\n *\n * Every error thrown by the SDK extends {@link KaelumError}, so a single\n * `catch (err) { if (err instanceof KaelumError) ... }` covers them all.\n */\n\n/** Base class for all errors raised by the KAELUM Pay SDK. */\nexport class KaelumError extends Error {\n /** Machine-readable error code. */\n public readonly code: string;\n\n constructor(message: string, code = \"kaelum_error\") {\n super(message);\n this.name = \"KaelumError\";\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Raised when the KAELUM Pay API returns an error response, or when an\n * MCP tool call completes with an error result.\n */\nexport class KaelumApiError extends KaelumError {\n /** HTTP status code, when the error came from an HTTP response. */\n public readonly status?: number;\n /** The tool or endpoint that produced the error. */\n public readonly tool?: string;\n /** The raw error payload returned by the server, when available. */\n public readonly raw?: unknown;\n\n constructor(\n message: string,\n options: { status?: number; tool?: string; code?: string; raw?: unknown } = {},\n ) {\n super(message, options.code ?? \"api_error\");\n this.name = \"KaelumApiError\";\n this.status = options.status;\n this.tool = options.tool;\n this.raw = options.raw;\n }\n}\n\n/**\n * Raised when authentication fails: a missing, malformed, or rejected\n * secret key, session token, or user API key.\n */\nexport class KaelumAuthenticationError extends KaelumApiError {\n constructor(message: string, options: { status?: number; tool?: string; raw?: unknown } = {}) {\n super(message, { ...options, code: \"authentication_error\" });\n this.name = \"KaelumAuthenticationError\";\n }\n}\n\n/**\n * Raised when the SDK cannot reach the KAELUM Pay API: a network failure,\n * a timeout, or an unparseable response.\n */\nexport class KaelumConnectionError extends KaelumError {\n /** The underlying cause, when one is available. */\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message, \"connection_error\");\n this.name = \"KaelumConnectionError\";\n this.cause = cause;\n }\n}\n\n/**\n * Raised by {@link Webhooks.constructEvent} when a webhook payload fails\n * signature verification. Treat this as a hostile request: never act on\n * the payload.\n */\nexport class KaelumSignatureVerificationError extends KaelumError {\n constructor(message: string) {\n super(message, \"signature_verification_failed\");\n this.name = \"KaelumSignatureVerificationError\";\n }\n}\n\n/** Raised when the SDK is given invalid arguments before any network call. */\nexport class KaelumInvalidRequestError extends KaelumError {\n constructor(message: string) {\n super(message, \"invalid_request\");\n this.name = \"KaelumInvalidRequestError\";\n }\n}\n","/**\n * The current version of the KAELUM Pay SDK.\n * Kept in sync with the `version` field in package.json.\n */\nexport const VERSION = \"0.1.0\";\n","/**\n * Transport layer for the KAELUM Pay SDK.\n *\n * The KAELUM Pay API is exposed as an MCP (Model Context Protocol) server\n * over JSON-RPC 2.0. This module is the only place in the SDK that speaks\n * the wire protocol: every resource method calls {@link McpTransport.call}\n * with a tool name and arguments, and receives a parsed result back.\n */\n\nimport {\n KaelumApiError,\n KaelumAuthenticationError,\n KaelumConnectionError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\n/** The production KAELUM MCP endpoint. */\nexport const DEFAULT_BASE_URL =\n \"https://kaelum-mcp.kaelumtechnologies.workers.dev/mcp\";\n\n/** Parsed result of an MCP tool call. */\nexport type McpResult = Record<string, unknown>;\n\ninterface TransportOptions {\n baseUrl?: string;\n timeoutMs?: number;\n maxRetries?: number;\n fetch?: typeof fetch;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number;\n result?: {\n content?: Array<{ type: string; text?: string }>;\n structuredContent?: unknown;\n isError?: boolean;\n };\n error?: { code: number; message: string; data?: unknown };\n}\n\n/** Speaks JSON-RPC 2.0 to the KAELUM MCP server. */\nexport class McpTransport {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: typeof fetch;\n private requestId = 0;\n\n constructor(options: TransportOptions = {}) {\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.maxRetries = options.maxRetries ?? 2;\n\n const resolvedFetch = options.fetch ?? globalThis.fetch;\n if (typeof resolvedFetch !== \"function\") {\n throw new KaelumConnectionError(\n \"No `fetch` implementation found. Use Node.js 18 or later, or pass a `fetch` option.\",\n );\n }\n this.fetchImpl = resolvedFetch;\n }\n\n /**\n * Call a KAELUM MCP tool by name and return its parsed result.\n *\n * @param tool - The MCP tool name, for example `kaelum_create_paylink`.\n * @param args - Arguments for the tool, in the server's snake_case form.\n */\n async call(tool: string, args: Record<string, unknown>): Promise<McpResult> {\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n id: ++this.requestId,\n method: \"tools/call\",\n params: { name: tool, arguments: args },\n });\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n return await this.send(tool, body);\n } catch (err) {\n lastError = err;\n // API and authentication errors are deterministic. Do not retry them.\n if (err instanceof KaelumApiError) throw err;\n if (attempt < this.maxRetries) {\n await delay(250 * 2 ** attempt);\n continue;\n }\n }\n }\n throw lastError instanceof Error\n ? new KaelumConnectionError(\n `Could not reach the KAELUM Pay API: ${lastError.message}`,\n lastError,\n )\n : new KaelumConnectionError(\"Could not reach the KAELUM Pay API.\");\n }\n\n private async send(tool: string, body: string): Promise<McpResult> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n \"User-Agent\": `kaelum-pay-node/${VERSION}`,\n },\n body,\n signal: controller.signal,\n });\n } catch (err) {\n throw new KaelumConnectionError(\n err instanceof Error && err.name === \"AbortError\"\n ? `Request timed out after ${this.timeoutMs}ms.`\n : \"Network request failed.\",\n err,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const text = await response.text();\n\n if (response.status === 401 || response.status === 403) {\n throw new KaelumAuthenticationError(\n \"The KAELUM Pay API rejected the request credentials.\",\n { status: response.status, tool, raw: text },\n );\n }\n if (!response.ok) {\n throw new KaelumApiError(\n `The KAELUM Pay API returned HTTP ${response.status}.`,\n { status: response.status, tool, raw: text },\n );\n }\n\n const rpc = parseJsonRpc(text);\n\n if (rpc.error) {\n throw new KaelumApiError(rpc.error.message || \"MCP call failed.\", {\n tool,\n code: `rpc_${rpc.error.code}`,\n raw: rpc.error.data ?? rpc.error,\n });\n }\n\n const result = rpc.result ?? {};\n const parsed = extractResult(result);\n return unwrapEnvelope(parsed, tool, result.isError === true);\n }\n}\n\n/**\n * KAELUM MCP tools return a standard envelope:\n * `{ success, data, meta, timestamp, api_version, platform }`.\n * This unwraps the envelope to the `data` payload, and turns an\n * unsuccessful response into a typed error.\n */\nfunction unwrapEnvelope(\n parsed: McpResult,\n tool: string,\n isError: boolean,\n): McpResult {\n const hasEnvelope =\n typeof parsed[\"success\"] === \"boolean\" && \"data\" in parsed;\n const failed = isError || parsed[\"success\"] === false;\n\n if (failed) {\n const message = errorMessage(parsed);\n if (/auth|unauthor|invalid key|forbidden|secret key/i.test(message)) {\n throw new KaelumAuthenticationError(message, { tool, raw: parsed });\n }\n throw new KaelumApiError(message, { tool, raw: parsed });\n }\n\n if (hasEnvelope) {\n const data = parsed[\"data\"];\n if (data && typeof data === \"object\") return data as McpResult;\n return { value: data };\n }\n return parsed;\n}\n\n/** Pull a human-readable message out of an error payload. */\nfunction errorMessage(parsed: McpResult): string {\n const candidate = parsed[\"error\"] ?? parsed[\"message\"];\n if (typeof candidate === \"string\" && candidate) return candidate;\n if (candidate && typeof candidate === \"object\") {\n const nested = (candidate as Record<string, unknown>)[\"message\"];\n if (typeof nested === \"string\" && nested) return nested;\n }\n return \"The KAELUM Pay tool returned an error.\";\n}\n\n/** Parse a JSON-RPC response, accepting both plain JSON and SSE framing. */\nfunction parseJsonRpc(text: string): JsonRpcResponse {\n const trimmed = text.trim();\n // Server-sent events framing: pull the JSON out of the last `data:` line.\n if (trimmed.startsWith(\"event:\") || trimmed.includes(\"\\ndata:\")) {\n const dataLines = trimmed\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trim());\n const payload = dataLines[dataLines.length - 1];\n if (payload) {\n return JSON.parse(payload) as JsonRpcResponse;\n }\n }\n try {\n return JSON.parse(trimmed) as JsonRpcResponse;\n } catch {\n throw new KaelumConnectionError(\n \"The KAELUM Pay API returned a response that could not be parsed.\",\n );\n }\n}\n\n/** Turn an MCP tool result into a plain object. */\nfunction extractResult(result: NonNullable<JsonRpcResponse[\"result\"]>): McpResult {\n if (result.structuredContent && typeof result.structuredContent === \"object\") {\n return result.structuredContent as McpResult;\n }\n const textBlock = result.content?.find((block) => block.type === \"text\");\n const raw = textBlock?.text ?? \"\";\n if (!raw) return {};\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as McpResult;\n return { value: parsed };\n } catch {\n // Not JSON: return the human-readable text under a `message` key.\n return { message: raw };\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Pay links: fixed-amount hosted checkout pages.\n *\n * A pay link is the simplest way to accept KLM. Create one server-side,\n * then either redirect the customer to {@link Paylink.url} or render the\n * embedded checkout widget against it. See `docs/checkout.md`.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type { Paylink, PaylinkCreateParams, PaylinkListParams } from \"../types.js\";\n\n/** Create and list KAELUM Pay links. */\nexport class Paylinks {\n constructor(\n private readonly transport: McpTransport,\n private readonly secretKey: string,\n ) {}\n\n /**\n * Create a fixed-amount pay link.\n *\n * The returned {@link Paylink.url} is a hosted checkout page. Redirect a\n * customer to it, or pass it to the embedded checkout widget. Customers\n * receive the standard 6%+ KLM spending discount automatically.\n *\n * @example\n * ```ts\n * const link = await kaelum.paylinks.create({\n * amountGbp: 49.99,\n * description: \"Order #1024\",\n * redirectUrl: \"https://shop.example.com/thank-you\",\n * webhookUrl: \"https://shop.example.com/webhooks/kaelum\",\n * });\n * // Send the customer to link.url\n * ```\n */\n async create(params: PaylinkCreateParams): Promise<Paylink> {\n if (!(params.amountGbp > 0)) {\n throw new KaelumInvalidRequestError(\"`amountGbp` must be greater than 0.\");\n }\n if (!params.description?.trim()) {\n throw new KaelumInvalidRequestError(\"`description` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_create_paylink\", {\n amount_gbp: params.amountGbp,\n description: params.description,\n developer_secret_key: this.secretKey,\n ...(params.redirectUrl ? { redirect_url: params.redirectUrl } : {}),\n ...(params.webhookUrl ? { webhook_url: params.webhookUrl } : {}),\n });\n\n return toPaylink(result);\n }\n\n /**\n * List your existing pay links, most recent first.\n *\n * @example\n * ```ts\n * const links = await kaelum.paylinks.list({ limit: 25 });\n * ```\n */\n async list(params: PaylinkListParams = {}): Promise<Paylink[]> {\n const result = await this.transport.call(\"kaelum_list_paylinks\", {\n developer_secret_key: this.secretKey,\n ...(params.limit ? { limit: params.limit } : {}),\n });\n\n const items = pickArray(result);\n return items.map(toPaylink);\n }\n}\n\n/** Normalise a raw MCP result into a {@link Paylink}. */\nexport function toPaylink(raw: Record<string, unknown>): Paylink {\n const get = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (raw[key] !== undefined && raw[key] !== null) return raw[key];\n }\n return undefined;\n };\n\n const embedToken = asOptionalString(get(\"embedToken\", \"embed_token\", \"token\"));\n const rawUrl = asOptionalString(get(\"url\", \"payment_url\", \"paymentUrl\", \"checkout_url\", \"embed_url\", \"link\"));\n \n return {\n id: String(get(\"id\", \"paylink_id\") ?? embedToken ?? \"\"),\n url: rawUrl ?? (embedToken ? `https://kaelum.app/pay/${embedToken}` : \"\"),\n embedToken,\n embedHtml: asOptionalString(get(\"embedHtml\", \"embed_html\", \"html\")),\n amountGbp: Number(get(\"amountGbp\", \"amount_gbp\", \"amount\") ?? 0),\n description: String(get(\"description\") ?? \"\"),\n status: asOptionalString(get(\"status\")) as Paylink[\"status\"],\n redirectUrl: asOptionalString(get(\"redirectUrl\", \"redirect_url\")),\n webhookUrl: asOptionalString(get(\"webhookUrl\", \"webhook_url\")),\n usageCount: asOptionalNumber(get(\"usageCount\", \"usage_count\", \"uses\")),\n createdAt: asOptionalString(get(\"createdAt\", \"created_at\", \"created\")),\n };\n}\n\nfunction pickArray(result: Record<string, unknown>): Array<Record<string, unknown>> {\n if (Array.isArray(result)) return result as Array<Record<string, unknown>>;\n for (const key of [\"paylinks\", \"data\", \"items\", \"results\"]) {\n const value = result[key];\n if (Array.isArray(value)) return value as Array<Record<string, unknown>>;\n }\n return [];\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction asOptionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Server-to-server KLM payments.\n *\n * This is the direct payment API. It moves KLM from a customer account to\n * a merchant or creator account. Use it when you are building an agent, a\n * point-of-sale flow, or any integration that holds a customer session.\n *\n * The flow is two-step and deliberate:\n * 1. {@link Payments.initiate} returns a PENDING transaction.\n * 2. After the customer confirms the details, {@link Payments.confirm}\n * executes the transfer. A confirmed transfer cannot be reversed.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type {\n AuthenticateParams,\n AuthSession,\n PaymentInitiateParams,\n PaymentTransaction,\n} from \"../types.js\";\n\n/** Authenticate a KAELUM account for the server-to-server payment API. */\nexport class Auth {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * Exchange an account number and personal API key for a session token.\n * The token is valid for roughly one hour.\n *\n * @example\n * ```ts\n * const session = await kaelum.auth.authenticate({\n * accountNumber: \"KA-100245\",\n * apiKey: process.env.KAELUM_USER_KEY!,\n * });\n * ```\n */\n async authenticate(params: AuthenticateParams): Promise<AuthSession> {\n if (!params.accountNumber?.trim()) {\n throw new KaelumInvalidRequestError(\"`accountNumber` is required.\");\n }\n if (!params.apiKey?.trim()) {\n throw new KaelumInvalidRequestError(\"`apiKey` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_authenticate\", {\n account_number: params.accountNumber,\n api_key: params.apiKey,\n });\n\n const token = result[\"sessionToken\"] ?? result[\"session_token\"] ?? result[\"token\"];\n if (typeof token !== \"string\" || !token) {\n throw new KaelumInvalidRequestError(\n \"Authentication did not return a session token.\",\n );\n }\n return {\n sessionToken: token,\n expiresAt: optionalString(result[\"expiresAt\"] ?? result[\"expires_at\"]),\n };\n }\n}\n\n/** Initiate, confirm, cancel, and check KLM payments. */\nexport class Payments {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * Initiate a KLM payment. Returns a PENDING transaction with full\n * details. Always present those details to the customer and require\n * explicit confirmation before calling {@link Payments.confirm}.\n */\n async initiate(params: PaymentInitiateParams): Promise<PaymentTransaction> {\n if (!(params.amountKlm >= 1)) {\n throw new KaelumInvalidRequestError(\"`amountKlm` must be at least 1.\");\n }\n if (!params.merchantId?.trim()) {\n throw new KaelumInvalidRequestError(\"`merchantId` is required.\");\n }\n if (!params.sessionToken?.trim()) {\n throw new KaelumInvalidRequestError(\"`sessionToken` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_payment_initiate\", {\n amount_klm: params.amountKlm,\n merchant_id: params.merchantId,\n session_token: params.sessionToken,\n ...(params.reference ? { reference: params.reference } : {}),\n });\n return toTransaction(result);\n }\n\n /**\n * Confirm and execute a previously initiated payment.\n * This transfers KLM and cannot be reversed.\n */\n async confirm(sessionToken: string, transactionId: string): Promise<PaymentTransaction> {\n requireToken(sessionToken);\n requireTransactionId(transactionId);\n const result = await this.transport.call(\"kaelum_payment_confirm\", {\n session_token: sessionToken,\n transaction_id: transactionId,\n });\n return toTransaction(result);\n }\n\n /** Cancel a payment that is still PENDING. */\n async cancel(sessionToken: string, transactionId: string): Promise<PaymentTransaction> {\n requireToken(sessionToken);\n requireTransactionId(transactionId);\n const result = await this.transport.call(\"kaelum_payment_cancel\", {\n session_token: sessionToken,\n transaction_id: transactionId,\n });\n return toTransaction(result);\n }\n\n /**\n * Check the current status of a transaction. Accepts either a session\n * token or a read-only API key.\n *\n * @example\n * ```ts\n * const tx = await kaelum.payments.status(\"txn_abc123\", {\n * sessionToken: session.sessionToken,\n * });\n * ```\n */\n async status(\n transactionId: string,\n auth: { sessionToken?: string; apiKey?: string },\n ): Promise<PaymentTransaction> {\n requireTransactionId(transactionId);\n if (!auth.sessionToken && !auth.apiKey) {\n throw new KaelumInvalidRequestError(\n \"Provide either a `sessionToken` or an `apiKey` to check status.\",\n );\n }\n const result = await this.transport.call(\"kaelum_payment_status\", {\n transaction_id: transactionId,\n ...(auth.sessionToken ? { session_token: auth.sessionToken } : {}),\n ...(auth.apiKey ? { api_key: auth.apiKey } : {}),\n });\n return toTransaction(result);\n }\n}\n\n/** Normalise a raw MCP result into a {@link PaymentTransaction}. */\nexport function toTransaction(raw: Record<string, unknown>): PaymentTransaction {\n const get = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (raw[key] !== undefined && raw[key] !== null) return raw[key];\n }\n return undefined;\n };\n return {\n transactionId: String(\n get(\"transactionId\", \"transaction_id\", \"id\", \"txn_id\") ?? \"\",\n ),\n status: String(get(\"status\") ?? \"PENDING\") as PaymentTransaction[\"status\"],\n amountKlm: Number(get(\"amountKlm\", \"amount_klm\", \"amount\") ?? 0),\n amountGbp: optionalNumber(get(\"amountGbp\", \"amount_gbp\")),\n merchantId: String(get(\"merchantId\", \"merchant_id\") ?? \"\"),\n reference: optionalString(get(\"reference\")),\n createdAt: optionalString(get(\"createdAt\", \"created_at\", \"created\")),\n };\n}\n\nfunction requireToken(token: string): void {\n if (!token?.trim()) {\n throw new KaelumInvalidRequestError(\"A session token is required.\");\n }\n}\n\nfunction requireTransactionId(id: string): void {\n if (!id?.trim()) {\n throw new KaelumInvalidRequestError(\"A transaction ID is required.\");\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Read-only KAELUM resources: KLM price, account balances, the merchant\n * directory, developer keys, and K.A.T.E. engine status.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type {\n AccountBalance,\n DeveloperKey,\n KateStatus,\n KlmPrice,\n Merchant,\n} from \"../types.js\";\n\n/** The current KLM price, governed by the K.A.T.E. engine. */\nexport class Klm {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the current KLM price. */\n async price(): Promise<KlmPrice> {\n const raw = await this.transport.call(\"kaelum_get_klm_price\", {});\n return {\n priceGbp: Number(\n raw[\"priceGbp\"] ?? raw[\"price_gbp\"] ?? raw[\"price\"] ?? raw[\"current_price_gbp\"] ?? 0,\n ),\n currency: optionalString(raw[\"currency\"]) ?? \"GBP\",\n asOf: optionalString(raw[\"asOf\"] ?? raw[\"as_of\"] ?? raw[\"timestamp\"]),\n };\n }\n}\n\n/** KAELUM account balances. */\nexport class Balances {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the balance summary for a KAELUM account. */\n async retrieve(userId: string): Promise<AccountBalance> {\n if (!userId?.trim()) {\n throw new KaelumInvalidRequestError(\"`userId` is required.\");\n }\n const raw = await this.transport.call(\"kaelum_get_user_balance\", {\n user_id: userId,\n });\n return {\n userId,\n balanceKlm: Number(raw[\"balanceKlm\"] ?? raw[\"balance_klm\"] ?? raw[\"balance\"] ?? 0),\n balanceGbp: optionalNumber(raw[\"balanceGbp\"] ?? raw[\"balance_gbp\"]),\n tier: optionalString(raw[\"tier\"] ?? raw[\"account_tier\"]),\n status: optionalString(raw[\"status\"] ?? raw[\"account_status\"]),\n };\n }\n}\n\n/** The KAELUM merchant and creator directory. */\nexport class Merchants {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * List merchants and creators that can receive KLM payments.\n *\n * @param query - Optional keyword to filter the directory.\n */\n async list(query?: string): Promise<Merchant[]> {\n const raw = await this.transport.call(\n \"kaelum_get_merchants\",\n query ? { query } : {},\n );\n const items = pickArray(raw, [\"merchants\", \"data\", \"items\", \"results\"]);\n return items.map((item) => ({\n id: String(item[\"id\"] ?? item[\"merchant_id\"] ?? item[\"account_id\"] ?? \"\"),\n name: String(item[\"name\"] ?? item[\"merchant_name\"] ?? \"\"),\n tier: optionalString(item[\"tier\"]),\n }));\n }\n}\n\n/** Your KAELUM Pay developer API keys. */\nexport class DeveloperKeys {\n constructor(\n private readonly transport: McpTransport,\n private readonly secretKey: string,\n ) {}\n\n /** List the developer API keys on your account. */\n async list(): Promise<DeveloperKey[]> {\n const raw = await this.transport.call(\"kaelum_get_developer_keys\", {\n developer_secret_key: this.secretKey,\n });\n const items = pickArray(raw, [\"keys\", \"data\", \"items\", \"results\"]);\n return items.map((item) => ({\n id: String(item[\"id\"] ?? item[\"key_id\"] ?? \"\"),\n publishableKey: optionalString(item[\"publishableKey\"] ?? item[\"publishable_key\"]),\n status: optionalString(item[\"status\"]),\n createdAt: optionalString(item[\"createdAt\"] ?? item[\"created_at\"]),\n }));\n }\n}\n\n/** Health of the K.A.T.E. (Kaelum Audivo Triovus Engine). */\nexport class Kate {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the current K.A.T.E. engine status. */\n async status(): Promise<KateStatus> {\n const raw = await this.transport.call(\"kaelum_get_kate_status\", {});\n return {\n status: String(raw[\"overall_status\"] ?? raw[\"status\"] ?? \"OPERATIONAL\"),\n activeAgents: optionalNumber(\n raw[\"active_agent_count\"] ?? raw[\"agents_active\"] ?? raw[\"activeAgents\"],\n ),\n lastHeartbeat: optionalString(\n raw[\"last_assessment\"] ?? raw[\"lastHeartbeat\"] ?? raw[\"last_heartbeat\"],\n ),\n };\n }\n}\n\nfunction pickArray(\n raw: Record<string, unknown>,\n keys: string[],\n): Array<Record<string, unknown>> {\n if (Array.isArray(raw)) return raw as Array<Record<string, unknown>>;\n for (const key of keys) {\n const value = raw[key];\n if (Array.isArray(value)) return value as Array<Record<string, unknown>>;\n }\n return [];\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Webhook verification.\n *\n * KAELUM Pay signs every webhook delivery with HMAC-SHA256, using the\n * signing secret shown when you register a webhook endpoint. Always verify\n * the signature before acting on a webhook: an unverified request is an\n * untrusted request.\n *\n * Pass the *raw, unparsed* request body to {@link Webhooks.constructEvent}.\n * Parsing the body to JSON first and then re-serialising it will change\n * the bytes and break verification.\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { KaelumSignatureVerificationError } from \"./errors.js\";\nimport type { WebhookEvent } from \"./types.js\";\n\n/** Options for {@link Webhooks.constructEvent}. */\nexport interface ConstructEventOptions {\n /**\n * Maximum age of a webhook, in seconds, when the signature header\n * carries a timestamp. Deliveries older than this are rejected as a\n * defence against replay. Set to 0 to disable the check. Defaults to 300.\n */\n toleranceSeconds?: number;\n}\n\n/** Verify and parse incoming KAELUM Pay webhooks. */\nexport class Webhooks {\n /**\n * Verify a webhook signature and return the parsed event.\n *\n * @param rawBody - The raw request body, exactly as received.\n * @param signatureHeader - The value of the `Kaelum-Signature` header.\n * @param signingSecret - Your webhook signing secret (`whsec_...`).\n * @throws {@link KaelumSignatureVerificationError} when verification fails.\n *\n * @example\n * ```ts\n * app.post(\"/webhooks/kaelum\", express.raw({ type: \"*\\/*\" }), (req, res) => {\n * try {\n * const event = kaelum.webhooks.constructEvent(\n * req.body,\n * req.headers[\"kaelum-signature\"] as string,\n * process.env.KAELUM_WEBHOOK_SECRET!,\n * );\n * if (event.type === \"payment.succeeded\") fulfilOrder(event.data);\n * res.sendStatus(200);\n * } catch {\n * res.sendStatus(400);\n * }\n * });\n * ```\n */\n constructEvent(\n rawBody: string | Buffer,\n signatureHeader: string | undefined,\n signingSecret: string,\n options: ConstructEventOptions = {},\n ): WebhookEvent {\n if (!this.verify(rawBody, signatureHeader, signingSecret, options)) {\n throw new KaelumSignatureVerificationError(\n \"Webhook signature verification failed. The request was not accepted.\",\n );\n }\n const payload = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n throw new KaelumSignatureVerificationError(\n \"Webhook body could not be parsed as JSON.\",\n );\n }\n const obj = (parsed ?? {}) as Record<string, unknown>;\n return {\n id: String(obj[\"id\"] ?? obj[\"event_id\"] ?? \"\"),\n type: String(obj[\"type\"] ?? obj[\"event\"] ?? \"\"),\n createdAt: optionalString(obj[\"createdAt\"] ?? obj[\"created_at\"] ?? obj[\"created\"]),\n data: (obj[\"data\"] ?? obj[\"payload\"] ?? obj) as Record<string, unknown>,\n };\n }\n\n /**\n * Verify a webhook signature without parsing the body.\n * Returns `true` when the signature is valid, `false` otherwise.\n * Never throws.\n */\n verify(\n rawBody: string | Buffer,\n signatureHeader: string | undefined,\n signingSecret: string,\n options: ConstructEventOptions = {},\n ): boolean {\n if (!signatureHeader || !signingSecret) return false;\n\n const payload = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n const parts = parseSignatureHeader(signatureHeader);\n\n // Optional replay protection when the header carries a timestamp.\n const tolerance = options.toleranceSeconds ?? 300;\n if (parts.timestamp !== undefined && tolerance > 0) {\n const ageSeconds = Math.abs(Date.now() / 1000 - parts.timestamp);\n if (ageSeconds > tolerance) return false;\n }\n\n // When a timestamp is present, it is part of the signed payload.\n const signedPayload =\n parts.timestamp !== undefined ? `${parts.timestamp}.${payload}` : payload;\n const expected = createHmac(\"sha256\", signingSecret)\n .update(signedPayload, \"utf8\")\n .digest(\"hex\");\n\n return parts.signatures.some((candidate) => safeEqual(candidate, expected));\n }\n}\n\ninterface ParsedSignature {\n timestamp?: number;\n signatures: string[];\n}\n\n/**\n * Parse a signature header. Supports three common encodings:\n * - a bare hex digest: `a1b2c3...`\n * - a prefixed digest: `sha256=a1b2c3...`\n * - a timestamped, comma-separated form: `t=1700000000,v1=a1b2c3...`\n */\nfunction parseSignatureHeader(header: string): ParsedSignature {\n const value = header.trim();\n const signatures: string[] = [];\n let timestamp: number | undefined;\n\n if (value.includes(\"=\") && value.includes(\",\")) {\n for (const segment of value.split(\",\")) {\n const [key, raw] = segment.split(\"=\").map((s) => s.trim());\n if (!key || !raw) continue;\n if (key === \"t\") {\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) timestamp = parsed;\n } else if (key.startsWith(\"v\")) {\n signatures.push(raw.toLowerCase());\n }\n }\n } else if (value.toLowerCase().startsWith(\"sha256=\")) {\n signatures.push(value.slice(7).toLowerCase());\n } else {\n signatures.push(value.toLowerCase());\n }\n\n return { timestamp, signatures };\n}\n\n/** Constant-time string comparison over hex digests. */\nfunction safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n try {\n return timingSafeEqual(Buffer.from(a, \"utf8\"), Buffer.from(b, \"utf8\"));\n } catch {\n return false;\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n","/**\n * The KAELUM Pay client.\n *\n * `KaelumPay` is the single entry point for the server-side SDK. Construct\n * it once with your developer secret key and reuse it across requests.\n */\n\nimport { McpTransport } from \"./transport.js\";\nimport { KaelumInvalidRequestError } from \"./errors.js\";\nimport { Paylinks } from \"./resources/paylinks.js\";\nimport { Auth, Payments } from \"./resources/payments.js\";\nimport { Balances, DeveloperKeys, Kate, Klm, Merchants } from \"./resources/data.js\";\nimport { Webhooks } from \"./webhooks.js\";\nimport type { KaelumPayOptions } from \"./types.js\";\n\n/**\n * Accept KLM, the Ai-governed closed-loop digital commerce currency, as a\n * payment option on any website or app.\n *\n * @example\n * ```ts\n * import { KaelumPay } from \"@kaelum/pay\";\n *\n * const kaelum = new KaelumPay({ secretKey: process.env.KAELUM_SECRET_KEY! });\n *\n * const link = await kaelum.paylinks.create({\n * amountGbp: 24.00,\n * description: \"One month subscription\",\n * });\n * console.log(link.url);\n * ```\n */\nexport class KaelumPay {\n /** Create and list hosted pay links. */\n public readonly paylinks: Paylinks;\n /** Authenticate accounts for the server-to-server payment API. */\n public readonly auth: Auth;\n /** Initiate, confirm, cancel, and check KLM payments. */\n public readonly payments: Payments;\n /** Retrieve the current KLM price. */\n public readonly klm: Klm;\n /** Retrieve KAELUM account balances. */\n public readonly balances: Balances;\n /** Browse the merchant and creator directory. */\n public readonly merchants: Merchants;\n /** List your developer API keys. */\n public readonly developerKeys: DeveloperKeys;\n /** Check K.A.T.E. engine health. */\n public readonly kate: Kate;\n /** Verify and parse incoming webhooks. */\n public readonly webhooks: Webhooks;\n\n constructor(options: KaelumPayOptions) {\n if (!options || typeof options.secretKey !== \"string\" || !options.secretKey.trim()) {\n throw new KaelumInvalidRequestError(\n \"A KAELUM Pay `secretKey` is required. Generate one at https://kaelum.app/developer/portal.\",\n );\n }\n if (!options.secretKey.startsWith(\"sk_\")) {\n throw new KaelumInvalidRequestError(\n \"The `secretKey` looks invalid. It should start with `sk_live_`. \" +\n \"Do not pass a publishable key (`pk_live_`) here.\",\n );\n }\n\n const secretKey = options.secretKey;\n const transport = new McpTransport({\n baseUrl: options.baseUrl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n });\n\n this.paylinks = new Paylinks(transport, secretKey);\n this.auth = new Auth(transport);\n this.payments = new Payments(transport);\n this.klm = new Klm(transport);\n this.balances = new Balances(transport);\n this.merchants = new Merchants(transport);\n this.developerKeys = new DeveloperKeys(transport, secretKey);\n this.kate = new Kate(transport);\n this.webhooks = new Webhooks();\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -269,10 +269,12 @@ function toPaylink(raw) {
269
269
  }
270
270
  return void 0;
271
271
  };
272
+ const embedToken = asOptionalString(get("embedToken", "embed_token", "token"));
273
+ const rawUrl = asOptionalString(get("url", "payment_url", "paymentUrl", "checkout_url", "embed_url", "link"));
272
274
  return {
273
- id: String(get("id", "paylink_id", "embedToken", "embed_token") ?? ""),
274
- url: String(get("url", "payment_url", "paymentUrl", "checkout_url") ?? ""),
275
- embedToken: asOptionalString(get("embedToken", "embed_token", "token")),
275
+ id: String(get("id", "paylink_id") ?? embedToken ?? ""),
276
+ url: rawUrl ?? (embedToken ? `https://kaelum.app/pay/${embedToken}` : ""),
277
+ embedToken,
276
278
  embedHtml: asOptionalString(get("embedHtml", "embed_html", "html")),
277
279
  amountGbp: Number(get("amountGbp", "amount_gbp", "amount") ?? 0),
278
280
  description: String(get("description") ?? ""),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/transport.ts","../src/resources/paylinks.ts","../src/resources/payments.ts","../src/resources/data.ts","../src/webhooks.ts","../src/client.ts"],"names":["optionalString","optionalNumber","pickArray"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error types raised by the KAELUM Pay SDK.\n *\n * Every error thrown by the SDK extends {@link KaelumError}, so a single\n * `catch (err) { if (err instanceof KaelumError) ... }` covers them all.\n */\n\n/** Base class for all errors raised by the KAELUM Pay SDK. */\nexport class KaelumError extends Error {\n /** Machine-readable error code. */\n public readonly code: string;\n\n constructor(message: string, code = \"kaelum_error\") {\n super(message);\n this.name = \"KaelumError\";\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Raised when the KAELUM Pay API returns an error response, or when an\n * MCP tool call completes with an error result.\n */\nexport class KaelumApiError extends KaelumError {\n /** HTTP status code, when the error came from an HTTP response. */\n public readonly status?: number;\n /** The tool or endpoint that produced the error. */\n public readonly tool?: string;\n /** The raw error payload returned by the server, when available. */\n public readonly raw?: unknown;\n\n constructor(\n message: string,\n options: { status?: number; tool?: string; code?: string; raw?: unknown } = {},\n ) {\n super(message, options.code ?? \"api_error\");\n this.name = \"KaelumApiError\";\n this.status = options.status;\n this.tool = options.tool;\n this.raw = options.raw;\n }\n}\n\n/**\n * Raised when authentication fails: a missing, malformed, or rejected\n * secret key, session token, or user API key.\n */\nexport class KaelumAuthenticationError extends KaelumApiError {\n constructor(message: string, options: { status?: number; tool?: string; raw?: unknown } = {}) {\n super(message, { ...options, code: \"authentication_error\" });\n this.name = \"KaelumAuthenticationError\";\n }\n}\n\n/**\n * Raised when the SDK cannot reach the KAELUM Pay API: a network failure,\n * a timeout, or an unparseable response.\n */\nexport class KaelumConnectionError extends KaelumError {\n /** The underlying cause, when one is available. */\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message, \"connection_error\");\n this.name = \"KaelumConnectionError\";\n this.cause = cause;\n }\n}\n\n/**\n * Raised by {@link Webhooks.constructEvent} when a webhook payload fails\n * signature verification. Treat this as a hostile request: never act on\n * the payload.\n */\nexport class KaelumSignatureVerificationError extends KaelumError {\n constructor(message: string) {\n super(message, \"signature_verification_failed\");\n this.name = \"KaelumSignatureVerificationError\";\n }\n}\n\n/** Raised when the SDK is given invalid arguments before any network call. */\nexport class KaelumInvalidRequestError extends KaelumError {\n constructor(message: string) {\n super(message, \"invalid_request\");\n this.name = \"KaelumInvalidRequestError\";\n }\n}\n","/**\n * The current version of the KAELUM Pay SDK.\n * Kept in sync with the `version` field in package.json.\n */\nexport const VERSION = \"0.1.0\";\n","/**\n * Transport layer for the KAELUM Pay SDK.\n *\n * The KAELUM Pay API is exposed as an MCP (Model Context Protocol) server\n * over JSON-RPC 2.0. This module is the only place in the SDK that speaks\n * the wire protocol: every resource method calls {@link McpTransport.call}\n * with a tool name and arguments, and receives a parsed result back.\n */\n\nimport {\n KaelumApiError,\n KaelumAuthenticationError,\n KaelumConnectionError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\n/** The production KAELUM MCP endpoint. */\nexport const DEFAULT_BASE_URL =\n \"https://kaelum-mcp.kaelumtechnologies.workers.dev/mcp\";\n\n/** Parsed result of an MCP tool call. */\nexport type McpResult = Record<string, unknown>;\n\ninterface TransportOptions {\n baseUrl?: string;\n timeoutMs?: number;\n maxRetries?: number;\n fetch?: typeof fetch;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number;\n result?: {\n content?: Array<{ type: string; text?: string }>;\n structuredContent?: unknown;\n isError?: boolean;\n };\n error?: { code: number; message: string; data?: unknown };\n}\n\n/** Speaks JSON-RPC 2.0 to the KAELUM MCP server. */\nexport class McpTransport {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: typeof fetch;\n private requestId = 0;\n\n constructor(options: TransportOptions = {}) {\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.maxRetries = options.maxRetries ?? 2;\n\n const resolvedFetch = options.fetch ?? globalThis.fetch;\n if (typeof resolvedFetch !== \"function\") {\n throw new KaelumConnectionError(\n \"No `fetch` implementation found. Use Node.js 18 or later, or pass a `fetch` option.\",\n );\n }\n this.fetchImpl = resolvedFetch;\n }\n\n /**\n * Call a KAELUM MCP tool by name and return its parsed result.\n *\n * @param tool - The MCP tool name, for example `kaelum_create_paylink`.\n * @param args - Arguments for the tool, in the server's snake_case form.\n */\n async call(tool: string, args: Record<string, unknown>): Promise<McpResult> {\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n id: ++this.requestId,\n method: \"tools/call\",\n params: { name: tool, arguments: args },\n });\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n return await this.send(tool, body);\n } catch (err) {\n lastError = err;\n // API and authentication errors are deterministic. Do not retry them.\n if (err instanceof KaelumApiError) throw err;\n if (attempt < this.maxRetries) {\n await delay(250 * 2 ** attempt);\n continue;\n }\n }\n }\n throw lastError instanceof Error\n ? new KaelumConnectionError(\n `Could not reach the KAELUM Pay API: ${lastError.message}`,\n lastError,\n )\n : new KaelumConnectionError(\"Could not reach the KAELUM Pay API.\");\n }\n\n private async send(tool: string, body: string): Promise<McpResult> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n \"User-Agent\": `kaelum-pay-node/${VERSION}`,\n },\n body,\n signal: controller.signal,\n });\n } catch (err) {\n throw new KaelumConnectionError(\n err instanceof Error && err.name === \"AbortError\"\n ? `Request timed out after ${this.timeoutMs}ms.`\n : \"Network request failed.\",\n err,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const text = await response.text();\n\n if (response.status === 401 || response.status === 403) {\n throw new KaelumAuthenticationError(\n \"The KAELUM Pay API rejected the request credentials.\",\n { status: response.status, tool, raw: text },\n );\n }\n if (!response.ok) {\n throw new KaelumApiError(\n `The KAELUM Pay API returned HTTP ${response.status}.`,\n { status: response.status, tool, raw: text },\n );\n }\n\n const rpc = parseJsonRpc(text);\n\n if (rpc.error) {\n throw new KaelumApiError(rpc.error.message || \"MCP call failed.\", {\n tool,\n code: `rpc_${rpc.error.code}`,\n raw: rpc.error.data ?? rpc.error,\n });\n }\n\n const result = rpc.result ?? {};\n const parsed = extractResult(result);\n return unwrapEnvelope(parsed, tool, result.isError === true);\n }\n}\n\n/**\n * KAELUM MCP tools return a standard envelope:\n * `{ success, data, meta, timestamp, api_version, platform }`.\n * This unwraps the envelope to the `data` payload, and turns an\n * unsuccessful response into a typed error.\n */\nfunction unwrapEnvelope(\n parsed: McpResult,\n tool: string,\n isError: boolean,\n): McpResult {\n const hasEnvelope =\n typeof parsed[\"success\"] === \"boolean\" && \"data\" in parsed;\n const failed = isError || parsed[\"success\"] === false;\n\n if (failed) {\n const message = errorMessage(parsed);\n if (/auth|unauthor|invalid key|forbidden|secret key/i.test(message)) {\n throw new KaelumAuthenticationError(message, { tool, raw: parsed });\n }\n throw new KaelumApiError(message, { tool, raw: parsed });\n }\n\n if (hasEnvelope) {\n const data = parsed[\"data\"];\n if (data && typeof data === \"object\") return data as McpResult;\n return { value: data };\n }\n return parsed;\n}\n\n/** Pull a human-readable message out of an error payload. */\nfunction errorMessage(parsed: McpResult): string {\n const candidate = parsed[\"error\"] ?? parsed[\"message\"];\n if (typeof candidate === \"string\" && candidate) return candidate;\n if (candidate && typeof candidate === \"object\") {\n const nested = (candidate as Record<string, unknown>)[\"message\"];\n if (typeof nested === \"string\" && nested) return nested;\n }\n return \"The KAELUM Pay tool returned an error.\";\n}\n\n/** Parse a JSON-RPC response, accepting both plain JSON and SSE framing. */\nfunction parseJsonRpc(text: string): JsonRpcResponse {\n const trimmed = text.trim();\n // Server-sent events framing: pull the JSON out of the last `data:` line.\n if (trimmed.startsWith(\"event:\") || trimmed.includes(\"\\ndata:\")) {\n const dataLines = trimmed\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trim());\n const payload = dataLines[dataLines.length - 1];\n if (payload) {\n return JSON.parse(payload) as JsonRpcResponse;\n }\n }\n try {\n return JSON.parse(trimmed) as JsonRpcResponse;\n } catch {\n throw new KaelumConnectionError(\n \"The KAELUM Pay API returned a response that could not be parsed.\",\n );\n }\n}\n\n/** Turn an MCP tool result into a plain object. */\nfunction extractResult(result: NonNullable<JsonRpcResponse[\"result\"]>): McpResult {\n if (result.structuredContent && typeof result.structuredContent === \"object\") {\n return result.structuredContent as McpResult;\n }\n const textBlock = result.content?.find((block) => block.type === \"text\");\n const raw = textBlock?.text ?? \"\";\n if (!raw) return {};\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as McpResult;\n return { value: parsed };\n } catch {\n // Not JSON: return the human-readable text under a `message` key.\n return { message: raw };\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Pay links: fixed-amount hosted checkout pages.\n *\n * A pay link is the simplest way to accept KLM. Create one server-side,\n * then either redirect the customer to {@link Paylink.url} or render the\n * embedded checkout widget against it. See `docs/checkout.md`.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type { Paylink, PaylinkCreateParams, PaylinkListParams } from \"../types.js\";\n\n/** Create and list KAELUM Pay links. */\nexport class Paylinks {\n constructor(\n private readonly transport: McpTransport,\n private readonly secretKey: string,\n ) {}\n\n /**\n * Create a fixed-amount pay link.\n *\n * The returned {@link Paylink.url} is a hosted checkout page. Redirect a\n * customer to it, or pass it to the embedded checkout widget. Customers\n * receive the standard 6%+ KLM spending discount automatically.\n *\n * @example\n * ```ts\n * const link = await kaelum.paylinks.create({\n * amountGbp: 49.99,\n * description: \"Order #1024\",\n * redirectUrl: \"https://shop.example.com/thank-you\",\n * webhookUrl: \"https://shop.example.com/webhooks/kaelum\",\n * });\n * // Send the customer to link.url\n * ```\n */\n async create(params: PaylinkCreateParams): Promise<Paylink> {\n if (!(params.amountGbp > 0)) {\n throw new KaelumInvalidRequestError(\"`amountGbp` must be greater than 0.\");\n }\n if (!params.description?.trim()) {\n throw new KaelumInvalidRequestError(\"`description` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_create_paylink\", {\n amount_gbp: params.amountGbp,\n description: params.description,\n developer_secret_key: this.secretKey,\n ...(params.redirectUrl ? { redirect_url: params.redirectUrl } : {}),\n ...(params.webhookUrl ? { webhook_url: params.webhookUrl } : {}),\n });\n\n return toPaylink(result);\n }\n\n /**\n * List your existing pay links, most recent first.\n *\n * @example\n * ```ts\n * const links = await kaelum.paylinks.list({ limit: 25 });\n * ```\n */\n async list(params: PaylinkListParams = {}): Promise<Paylink[]> {\n const result = await this.transport.call(\"kaelum_list_paylinks\", {\n developer_secret_key: this.secretKey,\n ...(params.limit ? { limit: params.limit } : {}),\n });\n\n const items = pickArray(result);\n return items.map(toPaylink);\n }\n}\n\n/** Normalise a raw MCP result into a {@link Paylink}. */\nexport function toPaylink(raw: Record<string, unknown>): Paylink {\n const get = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (raw[key] !== undefined && raw[key] !== null) return raw[key];\n }\n return undefined;\n };\n\n return {\n id: String(get(\"id\", \"paylink_id\", \"embedToken\", \"embed_token\") ?? \"\"),\n url: String(get(\"url\", \"payment_url\", \"paymentUrl\", \"checkout_url\") ?? \"\"),\n embedToken: asOptionalString(get(\"embedToken\", \"embed_token\", \"token\")),\n embedHtml: asOptionalString(get(\"embedHtml\", \"embed_html\", \"html\")),\n amountGbp: Number(get(\"amountGbp\", \"amount_gbp\", \"amount\") ?? 0),\n description: String(get(\"description\") ?? \"\"),\n status: asOptionalString(get(\"status\")) as Paylink[\"status\"],\n redirectUrl: asOptionalString(get(\"redirectUrl\", \"redirect_url\")),\n webhookUrl: asOptionalString(get(\"webhookUrl\", \"webhook_url\")),\n usageCount: asOptionalNumber(get(\"usageCount\", \"usage_count\", \"uses\")),\n createdAt: asOptionalString(get(\"createdAt\", \"created_at\", \"created\")),\n };\n}\n\nfunction pickArray(result: Record<string, unknown>): Array<Record<string, unknown>> {\n if (Array.isArray(result)) return result as Array<Record<string, unknown>>;\n for (const key of [\"paylinks\", \"data\", \"items\", \"results\"]) {\n const value = result[key];\n if (Array.isArray(value)) return value as Array<Record<string, unknown>>;\n }\n return [];\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction asOptionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Server-to-server KLM payments.\n *\n * This is the direct payment API. It moves KLM from a customer account to\n * a merchant or creator account. Use it when you are building an agent, a\n * point-of-sale flow, or any integration that holds a customer session.\n *\n * The flow is two-step and deliberate:\n * 1. {@link Payments.initiate} returns a PENDING transaction.\n * 2. After the customer confirms the details, {@link Payments.confirm}\n * executes the transfer. A confirmed transfer cannot be reversed.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type {\n AuthenticateParams,\n AuthSession,\n PaymentInitiateParams,\n PaymentTransaction,\n} from \"../types.js\";\n\n/** Authenticate a KAELUM account for the server-to-server payment API. */\nexport class Auth {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * Exchange an account number and personal API key for a session token.\n * The token is valid for roughly one hour.\n *\n * @example\n * ```ts\n * const session = await kaelum.auth.authenticate({\n * accountNumber: \"KA-100245\",\n * apiKey: process.env.KAELUM_USER_KEY!,\n * });\n * ```\n */\n async authenticate(params: AuthenticateParams): Promise<AuthSession> {\n if (!params.accountNumber?.trim()) {\n throw new KaelumInvalidRequestError(\"`accountNumber` is required.\");\n }\n if (!params.apiKey?.trim()) {\n throw new KaelumInvalidRequestError(\"`apiKey` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_authenticate\", {\n account_number: params.accountNumber,\n api_key: params.apiKey,\n });\n\n const token = result[\"sessionToken\"] ?? result[\"session_token\"] ?? result[\"token\"];\n if (typeof token !== \"string\" || !token) {\n throw new KaelumInvalidRequestError(\n \"Authentication did not return a session token.\",\n );\n }\n return {\n sessionToken: token,\n expiresAt: optionalString(result[\"expiresAt\"] ?? result[\"expires_at\"]),\n };\n }\n}\n\n/** Initiate, confirm, cancel, and check KLM payments. */\nexport class Payments {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * Initiate a KLM payment. Returns a PENDING transaction with full\n * details. Always present those details to the customer and require\n * explicit confirmation before calling {@link Payments.confirm}.\n */\n async initiate(params: PaymentInitiateParams): Promise<PaymentTransaction> {\n if (!(params.amountKlm >= 1)) {\n throw new KaelumInvalidRequestError(\"`amountKlm` must be at least 1.\");\n }\n if (!params.merchantId?.trim()) {\n throw new KaelumInvalidRequestError(\"`merchantId` is required.\");\n }\n if (!params.sessionToken?.trim()) {\n throw new KaelumInvalidRequestError(\"`sessionToken` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_payment_initiate\", {\n amount_klm: params.amountKlm,\n merchant_id: params.merchantId,\n session_token: params.sessionToken,\n ...(params.reference ? { reference: params.reference } : {}),\n });\n return toTransaction(result);\n }\n\n /**\n * Confirm and execute a previously initiated payment.\n * This transfers KLM and cannot be reversed.\n */\n async confirm(sessionToken: string, transactionId: string): Promise<PaymentTransaction> {\n requireToken(sessionToken);\n requireTransactionId(transactionId);\n const result = await this.transport.call(\"kaelum_payment_confirm\", {\n session_token: sessionToken,\n transaction_id: transactionId,\n });\n return toTransaction(result);\n }\n\n /** Cancel a payment that is still PENDING. */\n async cancel(sessionToken: string, transactionId: string): Promise<PaymentTransaction> {\n requireToken(sessionToken);\n requireTransactionId(transactionId);\n const result = await this.transport.call(\"kaelum_payment_cancel\", {\n session_token: sessionToken,\n transaction_id: transactionId,\n });\n return toTransaction(result);\n }\n\n /**\n * Check the current status of a transaction. Accepts either a session\n * token or a read-only API key.\n *\n * @example\n * ```ts\n * const tx = await kaelum.payments.status(\"txn_abc123\", {\n * sessionToken: session.sessionToken,\n * });\n * ```\n */\n async status(\n transactionId: string,\n auth: { sessionToken?: string; apiKey?: string },\n ): Promise<PaymentTransaction> {\n requireTransactionId(transactionId);\n if (!auth.sessionToken && !auth.apiKey) {\n throw new KaelumInvalidRequestError(\n \"Provide either a `sessionToken` or an `apiKey` to check status.\",\n );\n }\n const result = await this.transport.call(\"kaelum_payment_status\", {\n transaction_id: transactionId,\n ...(auth.sessionToken ? { session_token: auth.sessionToken } : {}),\n ...(auth.apiKey ? { api_key: auth.apiKey } : {}),\n });\n return toTransaction(result);\n }\n}\n\n/** Normalise a raw MCP result into a {@link PaymentTransaction}. */\nexport function toTransaction(raw: Record<string, unknown>): PaymentTransaction {\n const get = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (raw[key] !== undefined && raw[key] !== null) return raw[key];\n }\n return undefined;\n };\n return {\n transactionId: String(\n get(\"transactionId\", \"transaction_id\", \"id\", \"txn_id\") ?? \"\",\n ),\n status: String(get(\"status\") ?? \"PENDING\") as PaymentTransaction[\"status\"],\n amountKlm: Number(get(\"amountKlm\", \"amount_klm\", \"amount\") ?? 0),\n amountGbp: optionalNumber(get(\"amountGbp\", \"amount_gbp\")),\n merchantId: String(get(\"merchantId\", \"merchant_id\") ?? \"\"),\n reference: optionalString(get(\"reference\")),\n createdAt: optionalString(get(\"createdAt\", \"created_at\", \"created\")),\n };\n}\n\nfunction requireToken(token: string): void {\n if (!token?.trim()) {\n throw new KaelumInvalidRequestError(\"A session token is required.\");\n }\n}\n\nfunction requireTransactionId(id: string): void {\n if (!id?.trim()) {\n throw new KaelumInvalidRequestError(\"A transaction ID is required.\");\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Read-only KAELUM resources: KLM price, account balances, the merchant\n * directory, developer keys, and K.A.T.E. engine status.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type {\n AccountBalance,\n DeveloperKey,\n KateStatus,\n KlmPrice,\n Merchant,\n} from \"../types.js\";\n\n/** The current KLM price, governed by the K.A.T.E. engine. */\nexport class Klm {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the current KLM price. */\n async price(): Promise<KlmPrice> {\n const raw = await this.transport.call(\"kaelum_get_klm_price\", {});\n return {\n priceGbp: Number(\n raw[\"priceGbp\"] ?? raw[\"price_gbp\"] ?? raw[\"price\"] ?? raw[\"current_price_gbp\"] ?? 0,\n ),\n currency: optionalString(raw[\"currency\"]) ?? \"GBP\",\n asOf: optionalString(raw[\"asOf\"] ?? raw[\"as_of\"] ?? raw[\"timestamp\"]),\n };\n }\n}\n\n/** KAELUM account balances. */\nexport class Balances {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the balance summary for a KAELUM account. */\n async retrieve(userId: string): Promise<AccountBalance> {\n if (!userId?.trim()) {\n throw new KaelumInvalidRequestError(\"`userId` is required.\");\n }\n const raw = await this.transport.call(\"kaelum_get_user_balance\", {\n user_id: userId,\n });\n return {\n userId,\n balanceKlm: Number(raw[\"balanceKlm\"] ?? raw[\"balance_klm\"] ?? raw[\"balance\"] ?? 0),\n balanceGbp: optionalNumber(raw[\"balanceGbp\"] ?? raw[\"balance_gbp\"]),\n tier: optionalString(raw[\"tier\"] ?? raw[\"account_tier\"]),\n status: optionalString(raw[\"status\"] ?? raw[\"account_status\"]),\n };\n }\n}\n\n/** The KAELUM merchant and creator directory. */\nexport class Merchants {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * List merchants and creators that can receive KLM payments.\n *\n * @param query - Optional keyword to filter the directory.\n */\n async list(query?: string): Promise<Merchant[]> {\n const raw = await this.transport.call(\n \"kaelum_get_merchants\",\n query ? { query } : {},\n );\n const items = pickArray(raw, [\"merchants\", \"data\", \"items\", \"results\"]);\n return items.map((item) => ({\n id: String(item[\"id\"] ?? item[\"merchant_id\"] ?? item[\"account_id\"] ?? \"\"),\n name: String(item[\"name\"] ?? item[\"merchant_name\"] ?? \"\"),\n tier: optionalString(item[\"tier\"]),\n }));\n }\n}\n\n/** Your KAELUM Pay developer API keys. */\nexport class DeveloperKeys {\n constructor(\n private readonly transport: McpTransport,\n private readonly secretKey: string,\n ) {}\n\n /** List the developer API keys on your account. */\n async list(): Promise<DeveloperKey[]> {\n const raw = await this.transport.call(\"kaelum_get_developer_keys\", {\n developer_secret_key: this.secretKey,\n });\n const items = pickArray(raw, [\"keys\", \"data\", \"items\", \"results\"]);\n return items.map((item) => ({\n id: String(item[\"id\"] ?? item[\"key_id\"] ?? \"\"),\n publishableKey: optionalString(item[\"publishableKey\"] ?? item[\"publishable_key\"]),\n status: optionalString(item[\"status\"]),\n createdAt: optionalString(item[\"createdAt\"] ?? item[\"created_at\"]),\n }));\n }\n}\n\n/** Health of the K.A.T.E. (Kaelum Audivo Triovus Engine). */\nexport class Kate {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the current K.A.T.E. engine status. */\n async status(): Promise<KateStatus> {\n const raw = await this.transport.call(\"kaelum_get_kate_status\", {});\n return {\n status: String(raw[\"overall_status\"] ?? raw[\"status\"] ?? \"OPERATIONAL\"),\n activeAgents: optionalNumber(\n raw[\"active_agent_count\"] ?? raw[\"agents_active\"] ?? raw[\"activeAgents\"],\n ),\n lastHeartbeat: optionalString(\n raw[\"last_assessment\"] ?? raw[\"lastHeartbeat\"] ?? raw[\"last_heartbeat\"],\n ),\n };\n }\n}\n\nfunction pickArray(\n raw: Record<string, unknown>,\n keys: string[],\n): Array<Record<string, unknown>> {\n if (Array.isArray(raw)) return raw as Array<Record<string, unknown>>;\n for (const key of keys) {\n const value = raw[key];\n if (Array.isArray(value)) return value as Array<Record<string, unknown>>;\n }\n return [];\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Webhook verification.\n *\n * KAELUM Pay signs every webhook delivery with HMAC-SHA256, using the\n * signing secret shown when you register a webhook endpoint. Always verify\n * the signature before acting on a webhook: an unverified request is an\n * untrusted request.\n *\n * Pass the *raw, unparsed* request body to {@link Webhooks.constructEvent}.\n * Parsing the body to JSON first and then re-serialising it will change\n * the bytes and break verification.\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { KaelumSignatureVerificationError } from \"./errors.js\";\nimport type { WebhookEvent } from \"./types.js\";\n\n/** Options for {@link Webhooks.constructEvent}. */\nexport interface ConstructEventOptions {\n /**\n * Maximum age of a webhook, in seconds, when the signature header\n * carries a timestamp. Deliveries older than this are rejected as a\n * defence against replay. Set to 0 to disable the check. Defaults to 300.\n */\n toleranceSeconds?: number;\n}\n\n/** Verify and parse incoming KAELUM Pay webhooks. */\nexport class Webhooks {\n /**\n * Verify a webhook signature and return the parsed event.\n *\n * @param rawBody - The raw request body, exactly as received.\n * @param signatureHeader - The value of the `Kaelum-Signature` header.\n * @param signingSecret - Your webhook signing secret (`whsec_...`).\n * @throws {@link KaelumSignatureVerificationError} when verification fails.\n *\n * @example\n * ```ts\n * app.post(\"/webhooks/kaelum\", express.raw({ type: \"*\\/*\" }), (req, res) => {\n * try {\n * const event = kaelum.webhooks.constructEvent(\n * req.body,\n * req.headers[\"kaelum-signature\"] as string,\n * process.env.KAELUM_WEBHOOK_SECRET!,\n * );\n * if (event.type === \"payment.succeeded\") fulfilOrder(event.data);\n * res.sendStatus(200);\n * } catch {\n * res.sendStatus(400);\n * }\n * });\n * ```\n */\n constructEvent(\n rawBody: string | Buffer,\n signatureHeader: string | undefined,\n signingSecret: string,\n options: ConstructEventOptions = {},\n ): WebhookEvent {\n if (!this.verify(rawBody, signatureHeader, signingSecret, options)) {\n throw new KaelumSignatureVerificationError(\n \"Webhook signature verification failed. The request was not accepted.\",\n );\n }\n const payload = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n throw new KaelumSignatureVerificationError(\n \"Webhook body could not be parsed as JSON.\",\n );\n }\n const obj = (parsed ?? {}) as Record<string, unknown>;\n return {\n id: String(obj[\"id\"] ?? obj[\"event_id\"] ?? \"\"),\n type: String(obj[\"type\"] ?? obj[\"event\"] ?? \"\"),\n createdAt: optionalString(obj[\"createdAt\"] ?? obj[\"created_at\"] ?? obj[\"created\"]),\n data: (obj[\"data\"] ?? obj[\"payload\"] ?? obj) as Record<string, unknown>,\n };\n }\n\n /**\n * Verify a webhook signature without parsing the body.\n * Returns `true` when the signature is valid, `false` otherwise.\n * Never throws.\n */\n verify(\n rawBody: string | Buffer,\n signatureHeader: string | undefined,\n signingSecret: string,\n options: ConstructEventOptions = {},\n ): boolean {\n if (!signatureHeader || !signingSecret) return false;\n\n const payload = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n const parts = parseSignatureHeader(signatureHeader);\n\n // Optional replay protection when the header carries a timestamp.\n const tolerance = options.toleranceSeconds ?? 300;\n if (parts.timestamp !== undefined && tolerance > 0) {\n const ageSeconds = Math.abs(Date.now() / 1000 - parts.timestamp);\n if (ageSeconds > tolerance) return false;\n }\n\n // When a timestamp is present, it is part of the signed payload.\n const signedPayload =\n parts.timestamp !== undefined ? `${parts.timestamp}.${payload}` : payload;\n const expected = createHmac(\"sha256\", signingSecret)\n .update(signedPayload, \"utf8\")\n .digest(\"hex\");\n\n return parts.signatures.some((candidate) => safeEqual(candidate, expected));\n }\n}\n\ninterface ParsedSignature {\n timestamp?: number;\n signatures: string[];\n}\n\n/**\n * Parse a signature header. Supports three common encodings:\n * - a bare hex digest: `a1b2c3...`\n * - a prefixed digest: `sha256=a1b2c3...`\n * - a timestamped, comma-separated form: `t=1700000000,v1=a1b2c3...`\n */\nfunction parseSignatureHeader(header: string): ParsedSignature {\n const value = header.trim();\n const signatures: string[] = [];\n let timestamp: number | undefined;\n\n if (value.includes(\"=\") && value.includes(\",\")) {\n for (const segment of value.split(\",\")) {\n const [key, raw] = segment.split(\"=\").map((s) => s.trim());\n if (!key || !raw) continue;\n if (key === \"t\") {\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) timestamp = parsed;\n } else if (key.startsWith(\"v\")) {\n signatures.push(raw.toLowerCase());\n }\n }\n } else if (value.toLowerCase().startsWith(\"sha256=\")) {\n signatures.push(value.slice(7).toLowerCase());\n } else {\n signatures.push(value.toLowerCase());\n }\n\n return { timestamp, signatures };\n}\n\n/** Constant-time string comparison over hex digests. */\nfunction safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n try {\n return timingSafeEqual(Buffer.from(a, \"utf8\"), Buffer.from(b, \"utf8\"));\n } catch {\n return false;\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n","/**\n * The KAELUM Pay client.\n *\n * `KaelumPay` is the single entry point for the server-side SDK. Construct\n * it once with your developer secret key and reuse it across requests.\n */\n\nimport { McpTransport } from \"./transport.js\";\nimport { KaelumInvalidRequestError } from \"./errors.js\";\nimport { Paylinks } from \"./resources/paylinks.js\";\nimport { Auth, Payments } from \"./resources/payments.js\";\nimport { Balances, DeveloperKeys, Kate, Klm, Merchants } from \"./resources/data.js\";\nimport { Webhooks } from \"./webhooks.js\";\nimport type { KaelumPayOptions } from \"./types.js\";\n\n/**\n * Accept KLM, the Ai-governed closed-loop digital commerce currency, as a\n * payment option on any website or app.\n *\n * @example\n * ```ts\n * import { KaelumPay } from \"@kaelum/pay\";\n *\n * const kaelum = new KaelumPay({ secretKey: process.env.KAELUM_SECRET_KEY! });\n *\n * const link = await kaelum.paylinks.create({\n * amountGbp: 24.00,\n * description: \"One month subscription\",\n * });\n * console.log(link.url);\n * ```\n */\nexport class KaelumPay {\n /** Create and list hosted pay links. */\n public readonly paylinks: Paylinks;\n /** Authenticate accounts for the server-to-server payment API. */\n public readonly auth: Auth;\n /** Initiate, confirm, cancel, and check KLM payments. */\n public readonly payments: Payments;\n /** Retrieve the current KLM price. */\n public readonly klm: Klm;\n /** Retrieve KAELUM account balances. */\n public readonly balances: Balances;\n /** Browse the merchant and creator directory. */\n public readonly merchants: Merchants;\n /** List your developer API keys. */\n public readonly developerKeys: DeveloperKeys;\n /** Check K.A.T.E. engine health. */\n public readonly kate: Kate;\n /** Verify and parse incoming webhooks. */\n public readonly webhooks: Webhooks;\n\n constructor(options: KaelumPayOptions) {\n if (!options || typeof options.secretKey !== \"string\" || !options.secretKey.trim()) {\n throw new KaelumInvalidRequestError(\n \"A KAELUM Pay `secretKey` is required. Generate one at https://kaelum.app/developer/portal.\",\n );\n }\n if (!options.secretKey.startsWith(\"sk_\")) {\n throw new KaelumInvalidRequestError(\n \"The `secretKey` looks invalid. It should start with `sk_live_`. \" +\n \"Do not pass a publishable key (`pk_live_`) here.\",\n );\n }\n\n const secretKey = options.secretKey;\n const transport = new McpTransport({\n baseUrl: options.baseUrl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n });\n\n this.paylinks = new Paylinks(transport, secretKey);\n this.auth = new Auth(transport);\n this.payments = new Payments(transport);\n this.klm = new Klm(transport);\n this.balances = new Balances(transport);\n this.merchants = new Merchants(transport);\n this.developerKeys = new DeveloperKeys(transport, secretKey);\n this.kate = new Kate(transport);\n this.webhooks = new Webhooks();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/transport.ts","../src/resources/paylinks.ts","../src/resources/payments.ts","../src/resources/data.ts","../src/webhooks.ts","../src/client.ts"],"names":["optionalString","optionalNumber","pickArray"],"mappings":";;;AAQO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EAIrC,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAO,cAAA,EAAgB;AAClD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAMO,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EAQ9C,WAAA,CACE,OAAA,EACA,OAAA,GAA4E,EAAC,EAC7E;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,OAAA,CAAQ,IAAA,IAAQ,WAAW,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AAAA,EACrB;AACF;AAMO,IAAM,yBAAA,GAAN,cAAwC,cAAA,CAAe;AAAA,EAC5D,WAAA,CAAY,OAAA,EAAiB,OAAA,GAA6D,EAAC,EAAG;AAC5F,IAAA,KAAA,CAAM,SAAS,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,wBAAwB,CAAA;AAC3D,IAAA,IAAA,CAAK,IAAA,GAAO,2BAAA;AAAA,EACd;AACF;AAMO,IAAM,qBAAA,GAAN,cAAoC,WAAA,CAAY;AAAA,EAIrD,WAAA,CAAY,SAAiB,KAAA,EAAiB;AAC5C,IAAA,KAAA,CAAM,SAAS,kBAAkB,CAAA;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AAOO,IAAM,gCAAA,GAAN,cAA+C,WAAA,CAAY;AAAA,EAChE,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,SAAS,+BAA+B,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,kCAAA;AAAA,EACd;AACF;AAGO,IAAM,yBAAA,GAAN,cAAwC,WAAA,CAAY;AAAA,EACzD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,SAAS,iBAAiB,CAAA;AAChC,IAAA,IAAA,CAAK,IAAA,GAAO,2BAAA;AAAA,EACd;AACF;;;ACpFO,IAAM,OAAA,GAAU;;;ACahB,IAAM,gBAAA,GACX;AAwBK,IAAM,eAAN,MAAmB;AAAA,EAOxB,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAF5C,IAAA,IAAA,CAAQ,SAAA,GAAY,CAAA;AAGlB,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACtC,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AAExC,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAClD,IAAA,IAAI,OAAO,kBAAkB,UAAA,EAAY;AACvC,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,aAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAA,CAAK,IAAA,EAAc,IAAA,EAAmD;AAC1E,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,EAAE,IAAA,CAAK,SAAA;AAAA,MACX,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,EAAM,WAAW,IAAA;AAAK,KACvC,CAAA;AAED,IAAA,IAAI,SAAA;AACJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,MACnC,SAAS,GAAA,EAAK;AACZ,QAAA,SAAA,GAAY,GAAA;AAEZ,QAAA,IAAI,GAAA,YAAe,gBAAgB,MAAM,GAAA;AACzC,QAAA,IAAI,OAAA,GAAU,KAAK,UAAA,EAAY;AAC7B,UAAA,MAAM,KAAA,CAAM,GAAA,GAAM,CAAA,IAAK,OAAO,CAAA;AAC9B,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,SAAA,YAAqB,QACvB,IAAI,qBAAA;AAAA,MACF,CAAA,oCAAA,EAAuC,UAAU,OAAO,CAAA,CAAA;AAAA,MACxD;AAAA,KACF,GACA,IAAI,qBAAA,CAAsB,qCAAqC,CAAA;AAAA,EACrE;AAAA,EAEA,MAAc,IAAA,CAAK,IAAA,EAAc,IAAA,EAAkC;AACjE,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AAEjE,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS;AAAA,QAC5C,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,MAAA,EAAQ,qCAAA;AAAA,UACR,YAAA,EAAc,mBAAmB,OAAO,CAAA;AAAA,SAC1C;AAAA,QACA,IAAA;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,GAAA,YAAe,SAAS,GAAA,CAAI,IAAA,KAAS,eACjC,CAAA,wBAAA,EAA2B,IAAA,CAAK,SAAS,CAAA,GAAA,CAAA,GACzC,yBAAA;AAAA,QACJ;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,QAAA,CAAS,WAAW,GAAA,EAAK;AACtD,MAAA,MAAM,IAAI,yBAAA;AAAA,QACR,sDAAA;AAAA,QACA,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,KAAK,IAAA;AAAK,OAC7C;AAAA,IACF;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,cAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,SAAS,MAAM,CAAA,CAAA,CAAA;AAAA,QACnD,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,KAAK,IAAA;AAAK,OAC7C;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAE7B,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,MAAM,IAAI,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,WAAW,kBAAA,EAAoB;AAAA,QAChE,IAAA;AAAA,QACA,IAAA,EAAM,CAAA,IAAA,EAAO,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,QAC3B,GAAA,EAAK,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,GAAA,CAAI;AAAA,OAC5B,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,IAAU,EAAC;AAC9B,IAAA,MAAM,MAAA,GAAS,cAAc,MAAM,CAAA;AACnC,IAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA,EAC7D;AACF,CAAA;AAQA,SAAS,cAAA,CACP,MAAA,EACA,IAAA,EACA,OAAA,EACW;AACX,EAAA,MAAM,cACJ,OAAO,MAAA,CAAO,SAAS,CAAA,KAAM,aAAa,MAAA,IAAU,MAAA;AACtD,EAAA,MAAM,MAAA,GAAS,OAAA,IAAW,MAAA,CAAO,SAAS,CAAA,KAAM,KAAA;AAEhD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,OAAA,GAAU,aAAa,MAAM,CAAA;AACnC,IAAA,IAAI,iDAAA,CAAkD,IAAA,CAAK,OAAO,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,yBAAA,CAA0B,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAK,QAAQ,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,EAAK,QAAQ,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,IAAA,GAAO,OAAO,MAAM,CAAA;AAC1B,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AAC7C,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,aAAa,MAAA,EAA2B;AAC/C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAO,CAAA,IAAK,OAAO,SAAS,CAAA;AACrD,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,EAAW,OAAO,SAAA;AACvD,EAAA,IAAI,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC9C,IAAA,MAAM,MAAA,GAAU,UAAsC,SAAS,CAAA;AAC/D,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,EAAQ,OAAO,MAAA;AAAA,EACnD;AACA,EAAA,OAAO,wCAAA;AACT;AAGA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,EAAA,IAAI,QAAQ,UAAA,CAAW,QAAQ,KAAK,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/D,IAAA,MAAM,SAAA,GAAY,QACf,KAAA,CAAM,IAAI,EACV,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA,CACzC,IAAI,CAAC,IAAA,KAAS,KAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC9C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAGA,SAAS,cAAc,MAAA,EAA2D;AAChF,EAAA,IAAI,MAAA,CAAO,iBAAA,IAAqB,OAAO,MAAA,CAAO,sBAAsB,QAAA,EAAU;AAC5E,IAAA,OAAO,MAAA,CAAO,iBAAA;AAAA,EAChB;AACA,EAAA,MAAM,SAAA,GAAY,OAAO,OAAA,EAAS,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,MAAM,CAAA;AACvE,EAAA,MAAM,GAAA,GAAM,WAAW,IAAA,IAAQ,EAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACtC,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,MAAA;AACjD,IAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,EACzB,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,EAAE,SAAS,GAAA,EAAI;AAAA,EACxB;AACF;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACrOO,IAAM,WAAN,MAAe;AAAA,EACpB,WAAA,CACmB,WACA,SAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBH,MAAM,OAAO,MAAA,EAA+C;AAC1D,IAAA,IAAI,EAAE,MAAA,CAAO,SAAA,GAAY,CAAA,CAAA,EAAI;AAC3B,MAAA,MAAM,IAAI,0BAA0B,qCAAqC,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK,EAAG;AAC/B,MAAA,MAAM,IAAI,0BAA0B,4BAA4B,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,uBAAA,EAAyB;AAAA,MAChE,YAAY,MAAA,CAAO,SAAA;AAAA,MACnB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,sBAAsB,IAAA,CAAK,SAAA;AAAA,MAC3B,GAAI,OAAO,WAAA,GAAc,EAAE,cAAc,MAAA,CAAO,WAAA,KAAgB,EAAC;AAAA,MACjE,GAAI,OAAO,UAAA,GAAa,EAAE,aAAa,MAAA,CAAO,UAAA,KAAe;AAAC,KAC/D,CAAA;AAED,IAAA,OAAO,UAAU,MAAM,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IAAA,CAAK,MAAA,GAA4B,EAAC,EAAuB;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,sBAAA,EAAwB;AAAA,MAC/D,sBAAsB,IAAA,CAAK,SAAA;AAAA,MAC3B,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU;AAAC,KAC/C,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,UAAU,MAAM,CAAA;AAC9B,IAAA,OAAO,KAAA,CAAM,IAAI,SAAS,CAAA;AAAA,EAC5B;AACF,CAAA;AAGO,SAAS,UAAU,GAAA,EAAuC;AAC/D,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,KAA4B;AAC1C,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,GAAA,CAAI,GAAG,CAAA,KAAM,MAAA,IAAa,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA,EAAM,OAAO,GAAA,CAAI,GAAG,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,aAAa,gBAAA,CAAiB,GAAA,CAAI,YAAA,EAAc,aAAA,EAAe,OAAO,CAAC,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,iBAAiB,GAAA,CAAI,KAAA,EAAO,eAAe,YAAA,EAAc,cAAA,EAAgB,WAAA,EAAa,MAAM,CAAC,CAAA;AAE5G,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,GAAA,CAAI,MAAM,YAAY,CAAA,IAAK,cAAc,EAAE,CAAA;AAAA,IACtD,GAAA,EAAK,MAAA,KAAW,UAAA,GAAa,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAA,GAAK,EAAA,CAAA;AAAA,IACtE,UAAA;AAAA,IACA,WAAW,gBAAA,CAAiB,GAAA,CAAI,WAAA,EAAa,YAAA,EAAc,MAAM,CAAC,CAAA;AAAA,IAClE,WAAW,MAAA,CAAO,GAAA,CAAI,aAAa,YAAA,EAAc,QAAQ,KAAK,CAAC,CAAA;AAAA,IAC/D,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAa,KAAK,EAAE,CAAA;AAAA,IAC5C,MAAA,EAAQ,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,IACtC,WAAA,EAAa,gBAAA,CAAiB,GAAA,CAAI,aAAA,EAAe,cAAc,CAAC,CAAA;AAAA,IAChE,UAAA,EAAY,gBAAA,CAAiB,GAAA,CAAI,YAAA,EAAc,aAAa,CAAC,CAAA;AAAA,IAC7D,YAAY,gBAAA,CAAiB,GAAA,CAAI,YAAA,EAAc,aAAA,EAAe,MAAM,CAAC,CAAA;AAAA,IACrE,WAAW,gBAAA,CAAiB,GAAA,CAAI,WAAA,EAAa,YAAA,EAAc,SAAS,CAAC;AAAA,GACvE;AACF;AAEA,SAAS,UAAU,MAAA,EAAiE;AAClF,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,MAAA;AAClC,EAAA,KAAA,MAAW,OAAO,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA,EAAG;AAC1D,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AAAA,EACnC;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,iBAAiB,KAAA,EAAoC;AAC5D,EAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,MAAA,GAAY,OAAO,KAAK,CAAA;AACzE;AAEA,SAAS,iBAAiB,KAAA,EAAoC;AAC5D,EAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,MAAA,GAAY,OAAO,KAAK,CAAA;AACzE;;;AC9FO,IAAM,OAAN,MAAW;AAAA,EAChB,YAA6B,SAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcvD,MAAM,aAAa,MAAA,EAAkD;AACnE,IAAA,IAAI,CAAC,MAAA,CAAO,aAAA,EAAe,IAAA,EAAK,EAAG;AACjC,MAAA,MAAM,IAAI,0BAA0B,8BAA8B,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAK,EAAG;AAC1B,MAAA,MAAM,IAAI,0BAA0B,uBAAuB,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,qBAAA,EAAuB;AAAA,MAC9D,gBAAgB,MAAA,CAAO,aAAA;AAAA,MACvB,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,OAAO,cAAc,CAAA,IAAK,OAAO,eAAe,CAAA,IAAK,OAAO,OAAO,CAAA;AACjF,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,EAAO;AACvC,MAAA,MAAM,IAAI,yBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,KAAA;AAAA,MACd,WAAW,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,YAAY,CAAC;AAAA,KACvE;AAAA,EACF;AACF,CAAA;AAGO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvD,MAAM,SAAS,MAAA,EAA4D;AACzE,IAAA,IAAI,EAAE,MAAA,CAAO,SAAA,IAAa,CAAA,CAAA,EAAI;AAC5B,MAAA,MAAM,IAAI,0BAA0B,iCAAiC,CAAA;AAAA,IACvE;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,EAAY,IAAA,EAAK,EAAG;AAC9B,MAAA,MAAM,IAAI,0BAA0B,2BAA2B,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,YAAA,EAAc,IAAA,EAAK,EAAG;AAChC,MAAA,MAAM,IAAI,0BAA0B,6BAA6B,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,yBAAA,EAA2B;AAAA,MAClE,YAAY,MAAA,CAAO,SAAA;AAAA,MACnB,aAAa,MAAA,CAAO,UAAA;AAAA,MACpB,eAAe,MAAA,CAAO,YAAA;AAAA,MACtB,GAAI,OAAO,SAAA,GAAY,EAAE,WAAW,MAAA,CAAO,SAAA,KAAc;AAAC,KAC3D,CAAA;AACD,IAAA,OAAO,cAAc,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAQ,YAAA,EAAsB,aAAA,EAAoD;AACtF,IAAA,YAAA,CAAa,YAAY,CAAA;AACzB,IAAA,oBAAA,CAAqB,aAAa,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,wBAAA,EAA0B;AAAA,MACjE,aAAA,EAAe,YAAA;AAAA,MACf,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,cAAc,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,YAAA,EAAsB,aAAA,EAAoD;AACrF,IAAA,YAAA,CAAa,YAAY,CAAA;AACzB,IAAA,oBAAA,CAAqB,aAAa,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,uBAAA,EAAyB;AAAA,MAChE,aAAA,EAAe,YAAA;AAAA,MACf,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,cAAc,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,MAAA,CACJ,aAAA,EACA,IAAA,EAC6B;AAC7B,IAAA,oBAAA,CAAqB,aAAa,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,CAAC,KAAK,MAAA,EAAQ;AACtC,MAAA,MAAM,IAAI,yBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,uBAAA,EAAyB;AAAA,MAChE,cAAA,EAAgB,aAAA;AAAA,MAChB,GAAI,KAAK,YAAA,GAAe,EAAE,eAAe,IAAA,CAAK,YAAA,KAAiB,EAAC;AAAA,MAChE,GAAI,KAAK,MAAA,GAAS,EAAE,SAAS,IAAA,CAAK,MAAA,KAAW;AAAC,KAC/C,CAAA;AACD,IAAA,OAAO,cAAc,MAAM,CAAA;AAAA,EAC7B;AACF,CAAA;AAGO,SAAS,cAAc,GAAA,EAAkD;AAC9E,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,KAA4B;AAC1C,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,GAAA,CAAI,GAAG,CAAA,KAAM,MAAA,IAAa,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA,EAAM,OAAO,GAAA,CAAI,GAAG,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,MAAA;AAAA,MACb,GAAA,CAAI,eAAA,EAAiB,gBAAA,EAAkB,IAAA,EAAM,QAAQ,CAAA,IAAK;AAAA,KAC5D;AAAA,IACA,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAQ,KAAK,SAAS,CAAA;AAAA,IACzC,WAAW,MAAA,CAAO,GAAA,CAAI,aAAa,YAAA,EAAc,QAAQ,KAAK,CAAC,CAAA;AAAA,IAC/D,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,WAAA,EAAa,YAAY,CAAC,CAAA;AAAA,IACxD,YAAY,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,aAAa,KAAK,EAAE,CAAA;AAAA,IACzD,SAAA,EAAW,cAAA,CAAe,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,IAC1C,WAAW,cAAA,CAAe,GAAA,CAAI,WAAA,EAAa,YAAA,EAAc,SAAS,CAAC;AAAA,GACrE;AACF;AAEA,SAAS,aAAa,KAAA,EAAqB;AACzC,EAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AAClB,IAAA,MAAM,IAAI,0BAA0B,8BAA8B,CAAA;AAAA,EACpE;AACF;AAEA,SAAS,qBAAqB,EAAA,EAAkB;AAC9C,EAAA,IAAI,CAAC,EAAA,EAAI,IAAA,EAAK,EAAG;AACf,IAAA,MAAM,IAAI,0BAA0B,+BAA+B,CAAA;AAAA,EACrE;AACF;AAEA,SAAS,eAAe,KAAA,EAAoC;AAC1D,EAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,MAAA,GAAY,OAAO,KAAK,CAAA;AACzE;AAEA,SAAS,eAAe,KAAA,EAAoC;AAC1D,EAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,MAAA,GAAY,OAAO,KAAK,CAAA;AACzE;;;AC3KO,IAAM,MAAN,MAAU;AAAA,EACf,YAA6B,SAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA0B;AAAA;AAAA,EAGvD,MAAM,KAAA,GAA2B;AAC/B,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,UAAU,IAAA,CAAK,sBAAA,EAAwB,EAAE,CAAA;AAChE,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA;AAAA,QACR,GAAA,CAAI,UAAU,CAAA,IAAK,GAAA,CAAI,WAAW,CAAA,IAAK,GAAA,CAAI,OAAO,CAAA,IAAK,GAAA,CAAI,mBAAmB,CAAA,IAAK;AAAA,OACrF;AAAA,MACA,QAAA,EAAUA,eAAAA,CAAe,GAAA,CAAI,UAAU,CAAC,CAAA,IAAK,KAAA;AAAA,MAC7C,IAAA,EAAMA,eAAAA,CAAe,GAAA,CAAI,MAAM,CAAA,IAAK,IAAI,OAAO,CAAA,IAAK,GAAA,CAAI,WAAW,CAAC;AAAA,KACtE;AAAA,EACF;AACF,CAAA;AAGO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,SAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA0B;AAAA;AAAA,EAGvD,MAAM,SAAS,MAAA,EAAyC;AACtD,IAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,EAAK,EAAG;AACnB,MAAA,MAAM,IAAI,0BAA0B,uBAAuB,CAAA;AAAA,IAC7D;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,yBAAA,EAA2B;AAAA,MAC/D,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA,IAAK,GAAA,CAAI,aAAa,CAAA,IAAK,GAAA,CAAI,SAAS,CAAA,IAAK,CAAC,CAAA;AAAA,MACjF,YAAYC,eAAAA,CAAe,GAAA,CAAI,YAAY,CAAA,IAAK,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA,MAClE,MAAMD,eAAAA,CAAe,GAAA,CAAI,MAAM,CAAA,IAAK,GAAA,CAAI,cAAc,CAAC,CAAA;AAAA,MACvD,QAAQA,eAAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAA,CAAI,gBAAgB,CAAC;AAAA,KAC/D;AAAA,EACF;AACF,CAAA;AAGO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,SAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvD,MAAM,KAAK,KAAA,EAAqC;AAC9C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA;AAAA,MAC/B,sBAAA;AAAA,MACA,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI;AAAC,KACvB;AACA,IAAA,MAAM,KAAA,GAAQE,WAAU,GAAA,EAAK,CAAC,aAAa,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA;AACtE,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1B,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,aAAa,CAAA,IAAK,IAAA,CAAK,YAAY,CAAA,IAAK,EAAE,CAAA;AAAA,MACxE,IAAA,EAAM,OAAO,IAAA,CAAK,MAAM,KAAK,IAAA,CAAK,eAAe,KAAK,EAAE,CAAA;AAAA,MACxD,IAAA,EAAMF,eAAAA,CAAe,IAAA,CAAK,MAAM,CAAC;AAAA,KACnC,CAAE,CAAA;AAAA,EACJ;AACF,CAAA;AAGO,IAAM,gBAAN,MAAoB;AAAA,EACzB,WAAA,CACmB,WACA,SAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAChB;AAAA;AAAA,EAGH,MAAM,IAAA,GAAgC;AACpC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,2BAAA,EAA6B;AAAA,MACjE,sBAAsB,IAAA,CAAK;AAAA,KAC5B,CAAA;AACD,IAAA,MAAM,KAAA,GAAQE,WAAU,GAAA,EAAK,CAAC,QAAQ,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA;AACjE,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1B,EAAA,EAAI,OAAO,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,QAAQ,KAAK,EAAE,CAAA;AAAA,MAC7C,gBAAgBF,eAAAA,CAAe,IAAA,CAAK,gBAAgB,CAAA,IAAK,IAAA,CAAK,iBAAiB,CAAC,CAAA;AAAA,MAChF,MAAA,EAAQA,eAAAA,CAAe,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MACrC,WAAWA,eAAAA,CAAe,IAAA,CAAK,WAAW,CAAA,IAAK,IAAA,CAAK,YAAY,CAAC;AAAA,KACnE,CAAE,CAAA;AAAA,EACJ;AACF,CAAA;AAGO,IAAM,OAAN,MAAW;AAAA,EAChB,YAA6B,SAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA0B;AAAA;AAAA,EAGvD,MAAM,MAAA,GAA8B;AAClC,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,UAAU,IAAA,CAAK,wBAAA,EAA0B,EAAE,CAAA;AAClE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,OAAO,GAAA,CAAI,gBAAgB,KAAK,GAAA,CAAI,QAAQ,KAAK,aAAa,CAAA;AAAA,MACtE,YAAA,EAAcC,eAAAA;AAAA,QACZ,IAAI,oBAAoB,CAAA,IAAK,IAAI,eAAe,CAAA,IAAK,IAAI,cAAc;AAAA,OACzE;AAAA,MACA,aAAA,EAAeD,eAAAA;AAAA,QACb,IAAI,iBAAiB,CAAA,IAAK,IAAI,eAAe,CAAA,IAAK,IAAI,gBAAgB;AAAA;AACxE,KACF;AAAA,EACF;AACF,CAAA;AAEA,SAASE,UAAAA,CACP,KACA,IAAA,EACgC;AAChC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,GAAA;AAC/B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA;AAAA,EACnC;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAASF,gBAAe,KAAA,EAAoC;AAC1D,EAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,MAAA,GAAY,OAAO,KAAK,CAAA;AACzE;AAEA,SAASC,gBAAe,KAAA,EAAoC;AAC1D,EAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,MAAA,GAAY,OAAO,KAAK,CAAA;AACzE;AC5GO,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BpB,eACE,OAAA,EACA,eAAA,EACA,aAAA,EACA,OAAA,GAAiC,EAAC,EACpB;AACd,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAS,eAAA,EAAiB,aAAA,EAAe,OAAO,CAAA,EAAG;AAClE,MAAA,MAAM,IAAI,gCAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,UAAU,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,OAAA,CAAQ,SAAS,MAAM,CAAA;AAC/E,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,gCAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAO,UAAU,EAAC;AACxB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAO,GAAA,CAAI,IAAI,KAAK,GAAA,CAAI,UAAU,KAAK,EAAE,CAAA;AAAA,MAC7C,IAAA,EAAM,OAAO,GAAA,CAAI,MAAM,KAAK,GAAA,CAAI,OAAO,KAAK,EAAE,CAAA;AAAA,MAC9C,SAAA,EAAWD,eAAAA,CAAe,GAAA,CAAI,WAAW,CAAA,IAAK,IAAI,YAAY,CAAA,IAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,MACjF,MAAO,GAAA,CAAI,MAAM,CAAA,IAAK,GAAA,CAAI,SAAS,CAAA,IAAK;AAAA,KAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OACE,OAAA,EACA,eAAA,EACA,aAAA,EACA,OAAA,GAAiC,EAAC,EACzB;AACT,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,aAAA,EAAe,OAAO,KAAA;AAE/C,IAAA,MAAM,UAAU,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,OAAA,CAAQ,SAAS,MAAM,CAAA;AAC/E,IAAA,MAAM,KAAA,GAAQ,qBAAqB,eAAe,CAAA;AAGlD,IAAA,MAAM,SAAA,GAAY,QAAQ,gBAAA,IAAoB,GAAA;AAC9C,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,IAAa,SAAA,GAAY,CAAA,EAAG;AAClD,MAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,IAAA,CAAK,KAAI,GAAI,GAAA,GAAO,MAAM,SAAS,CAAA;AAC/D,MAAA,IAAI,UAAA,GAAa,WAAW,OAAO,KAAA;AAAA,IACrC;AAGA,IAAA,MAAM,aAAA,GACJ,MAAM,SAAA,KAAc,MAAA,GAAY,GAAG,KAAA,CAAM,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,OAAA;AACpE,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,QAAA,EAAU,aAAa,CAAA,CAChD,OAAO,aAAA,EAAe,MAAM,CAAA,CAC5B,MAAA,CAAO,KAAK,CAAA;AAEf,IAAA,OAAO,KAAA,CAAM,WAAW,IAAA,CAAK,CAAC,cAAc,SAAA,CAAU,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,EAC5E;AACF;AAaA,SAAS,qBAAqB,MAAA,EAAiC;AAC7D,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,EAAK;AAC1B,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI,MAAM,QAAA,CAAS,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,IAAA,KAAA,MAAW,OAAA,IAAW,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACtC,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AACzD,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,EAAK;AAClB,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,MAAM,MAAA,GAAS,OAAO,GAAG,CAAA;AACzB,QAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,GAAG,SAAA,GAAY,MAAA;AAAA,MACzC,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9B,QAAA,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF,WAAW,KAAA,CAAM,WAAA,EAAY,CAAE,UAAA,CAAW,SAAS,CAAA,EAAG;AACpD,IAAA,UAAA,CAAW,KAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,EAC9C,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,EAAE,WAAW,UAAA,EAAW;AACjC;AAGA,SAAS,SAAA,CAAU,GAAW,CAAA,EAAoB;AAChD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,IAAI;AACF,IAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,GAAG,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EACvE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAASA,gBAAe,KAAA,EAAoC;AAC1D,EAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,MAAA,GAAY,OAAO,KAAK,CAAA;AACzE;;;ACrIO,IAAM,YAAN,MAAgB;AAAA,EAoBrB,YAAY,OAAA,EAA2B;AACrC,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,CAAQ,SAAA,KAAc,YAAY,CAAC,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAK,EAAG;AAClF,MAAA,MAAM,IAAI,yBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,CAAU,UAAA,CAAW,KAAK,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,yBAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa;AAAA,MACjC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,SAAA,EAAW,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,GAAA,CAAI,SAAS,CAAA;AAC5B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,SAAS,CAAA;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,CAAc,SAAA,EAAW,SAAS,CAAA;AAC3D,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,EAAS;AAAA,EAC/B;AACF","file":"index.js","sourcesContent":["/**\n * Error types raised by the KAELUM Pay SDK.\n *\n * Every error thrown by the SDK extends {@link KaelumError}, so a single\n * `catch (err) { if (err instanceof KaelumError) ... }` covers them all.\n */\n\n/** Base class for all errors raised by the KAELUM Pay SDK. */\nexport class KaelumError extends Error {\n /** Machine-readable error code. */\n public readonly code: string;\n\n constructor(message: string, code = \"kaelum_error\") {\n super(message);\n this.name = \"KaelumError\";\n this.code = code;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Raised when the KAELUM Pay API returns an error response, or when an\n * MCP tool call completes with an error result.\n */\nexport class KaelumApiError extends KaelumError {\n /** HTTP status code, when the error came from an HTTP response. */\n public readonly status?: number;\n /** The tool or endpoint that produced the error. */\n public readonly tool?: string;\n /** The raw error payload returned by the server, when available. */\n public readonly raw?: unknown;\n\n constructor(\n message: string,\n options: { status?: number; tool?: string; code?: string; raw?: unknown } = {},\n ) {\n super(message, options.code ?? \"api_error\");\n this.name = \"KaelumApiError\";\n this.status = options.status;\n this.tool = options.tool;\n this.raw = options.raw;\n }\n}\n\n/**\n * Raised when authentication fails: a missing, malformed, or rejected\n * secret key, session token, or user API key.\n */\nexport class KaelumAuthenticationError extends KaelumApiError {\n constructor(message: string, options: { status?: number; tool?: string; raw?: unknown } = {}) {\n super(message, { ...options, code: \"authentication_error\" });\n this.name = \"KaelumAuthenticationError\";\n }\n}\n\n/**\n * Raised when the SDK cannot reach the KAELUM Pay API: a network failure,\n * a timeout, or an unparseable response.\n */\nexport class KaelumConnectionError extends KaelumError {\n /** The underlying cause, when one is available. */\n public readonly cause?: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message, \"connection_error\");\n this.name = \"KaelumConnectionError\";\n this.cause = cause;\n }\n}\n\n/**\n * Raised by {@link Webhooks.constructEvent} when a webhook payload fails\n * signature verification. Treat this as a hostile request: never act on\n * the payload.\n */\nexport class KaelumSignatureVerificationError extends KaelumError {\n constructor(message: string) {\n super(message, \"signature_verification_failed\");\n this.name = \"KaelumSignatureVerificationError\";\n }\n}\n\n/** Raised when the SDK is given invalid arguments before any network call. */\nexport class KaelumInvalidRequestError extends KaelumError {\n constructor(message: string) {\n super(message, \"invalid_request\");\n this.name = \"KaelumInvalidRequestError\";\n }\n}\n","/**\n * The current version of the KAELUM Pay SDK.\n * Kept in sync with the `version` field in package.json.\n */\nexport const VERSION = \"0.1.0\";\n","/**\n * Transport layer for the KAELUM Pay SDK.\n *\n * The KAELUM Pay API is exposed as an MCP (Model Context Protocol) server\n * over JSON-RPC 2.0. This module is the only place in the SDK that speaks\n * the wire protocol: every resource method calls {@link McpTransport.call}\n * with a tool name and arguments, and receives a parsed result back.\n */\n\nimport {\n KaelumApiError,\n KaelumAuthenticationError,\n KaelumConnectionError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\n/** The production KAELUM MCP endpoint. */\nexport const DEFAULT_BASE_URL =\n \"https://kaelum-mcp.kaelumtechnologies.workers.dev/mcp\";\n\n/** Parsed result of an MCP tool call. */\nexport type McpResult = Record<string, unknown>;\n\ninterface TransportOptions {\n baseUrl?: string;\n timeoutMs?: number;\n maxRetries?: number;\n fetch?: typeof fetch;\n}\n\ninterface JsonRpcResponse {\n jsonrpc: string;\n id: number;\n result?: {\n content?: Array<{ type: string; text?: string }>;\n structuredContent?: unknown;\n isError?: boolean;\n };\n error?: { code: number; message: string; data?: unknown };\n}\n\n/** Speaks JSON-RPC 2.0 to the KAELUM MCP server. */\nexport class McpTransport {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: typeof fetch;\n private requestId = 0;\n\n constructor(options: TransportOptions = {}) {\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.timeoutMs = options.timeoutMs ?? 30_000;\n this.maxRetries = options.maxRetries ?? 2;\n\n const resolvedFetch = options.fetch ?? globalThis.fetch;\n if (typeof resolvedFetch !== \"function\") {\n throw new KaelumConnectionError(\n \"No `fetch` implementation found. Use Node.js 18 or later, or pass a `fetch` option.\",\n );\n }\n this.fetchImpl = resolvedFetch;\n }\n\n /**\n * Call a KAELUM MCP tool by name and return its parsed result.\n *\n * @param tool - The MCP tool name, for example `kaelum_create_paylink`.\n * @param args - Arguments for the tool, in the server's snake_case form.\n */\n async call(tool: string, args: Record<string, unknown>): Promise<McpResult> {\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n id: ++this.requestId,\n method: \"tools/call\",\n params: { name: tool, arguments: args },\n });\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n try {\n return await this.send(tool, body);\n } catch (err) {\n lastError = err;\n // API and authentication errors are deterministic. Do not retry them.\n if (err instanceof KaelumApiError) throw err;\n if (attempt < this.maxRetries) {\n await delay(250 * 2 ** attempt);\n continue;\n }\n }\n }\n throw lastError instanceof Error\n ? new KaelumConnectionError(\n `Could not reach the KAELUM Pay API: ${lastError.message}`,\n lastError,\n )\n : new KaelumConnectionError(\"Could not reach the KAELUM Pay API.\");\n }\n\n private async send(tool: string, body: string): Promise<McpResult> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let response: Response;\n try {\n response = await this.fetchImpl(this.baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n \"User-Agent\": `kaelum-pay-node/${VERSION}`,\n },\n body,\n signal: controller.signal,\n });\n } catch (err) {\n throw new KaelumConnectionError(\n err instanceof Error && err.name === \"AbortError\"\n ? `Request timed out after ${this.timeoutMs}ms.`\n : \"Network request failed.\",\n err,\n );\n } finally {\n clearTimeout(timer);\n }\n\n const text = await response.text();\n\n if (response.status === 401 || response.status === 403) {\n throw new KaelumAuthenticationError(\n \"The KAELUM Pay API rejected the request credentials.\",\n { status: response.status, tool, raw: text },\n );\n }\n if (!response.ok) {\n throw new KaelumApiError(\n `The KAELUM Pay API returned HTTP ${response.status}.`,\n { status: response.status, tool, raw: text },\n );\n }\n\n const rpc = parseJsonRpc(text);\n\n if (rpc.error) {\n throw new KaelumApiError(rpc.error.message || \"MCP call failed.\", {\n tool,\n code: `rpc_${rpc.error.code}`,\n raw: rpc.error.data ?? rpc.error,\n });\n }\n\n const result = rpc.result ?? {};\n const parsed = extractResult(result);\n return unwrapEnvelope(parsed, tool, result.isError === true);\n }\n}\n\n/**\n * KAELUM MCP tools return a standard envelope:\n * `{ success, data, meta, timestamp, api_version, platform }`.\n * This unwraps the envelope to the `data` payload, and turns an\n * unsuccessful response into a typed error.\n */\nfunction unwrapEnvelope(\n parsed: McpResult,\n tool: string,\n isError: boolean,\n): McpResult {\n const hasEnvelope =\n typeof parsed[\"success\"] === \"boolean\" && \"data\" in parsed;\n const failed = isError || parsed[\"success\"] === false;\n\n if (failed) {\n const message = errorMessage(parsed);\n if (/auth|unauthor|invalid key|forbidden|secret key/i.test(message)) {\n throw new KaelumAuthenticationError(message, { tool, raw: parsed });\n }\n throw new KaelumApiError(message, { tool, raw: parsed });\n }\n\n if (hasEnvelope) {\n const data = parsed[\"data\"];\n if (data && typeof data === \"object\") return data as McpResult;\n return { value: data };\n }\n return parsed;\n}\n\n/** Pull a human-readable message out of an error payload. */\nfunction errorMessage(parsed: McpResult): string {\n const candidate = parsed[\"error\"] ?? parsed[\"message\"];\n if (typeof candidate === \"string\" && candidate) return candidate;\n if (candidate && typeof candidate === \"object\") {\n const nested = (candidate as Record<string, unknown>)[\"message\"];\n if (typeof nested === \"string\" && nested) return nested;\n }\n return \"The KAELUM Pay tool returned an error.\";\n}\n\n/** Parse a JSON-RPC response, accepting both plain JSON and SSE framing. */\nfunction parseJsonRpc(text: string): JsonRpcResponse {\n const trimmed = text.trim();\n // Server-sent events framing: pull the JSON out of the last `data:` line.\n if (trimmed.startsWith(\"event:\") || trimmed.includes(\"\\ndata:\")) {\n const dataLines = trimmed\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trim());\n const payload = dataLines[dataLines.length - 1];\n if (payload) {\n return JSON.parse(payload) as JsonRpcResponse;\n }\n }\n try {\n return JSON.parse(trimmed) as JsonRpcResponse;\n } catch {\n throw new KaelumConnectionError(\n \"The KAELUM Pay API returned a response that could not be parsed.\",\n );\n }\n}\n\n/** Turn an MCP tool result into a plain object. */\nfunction extractResult(result: NonNullable<JsonRpcResponse[\"result\"]>): McpResult {\n if (result.structuredContent && typeof result.structuredContent === \"object\") {\n return result.structuredContent as McpResult;\n }\n const textBlock = result.content?.find((block) => block.type === \"text\");\n const raw = textBlock?.text ?? \"\";\n if (!raw) return {};\n try {\n const parsed: unknown = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") return parsed as McpResult;\n return { value: parsed };\n } catch {\n // Not JSON: return the human-readable text under a `message` key.\n return { message: raw };\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Pay links: fixed-amount hosted checkout pages.\n *\n * A pay link is the simplest way to accept KLM. Create one server-side,\n * then either redirect the customer to {@link Paylink.url} or render the\n * embedded checkout widget against it. See `docs/checkout.md`.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type { Paylink, PaylinkCreateParams, PaylinkListParams } from \"../types.js\";\n\n/** Create and list KAELUM Pay links. */\nexport class Paylinks {\n constructor(\n private readonly transport: McpTransport,\n private readonly secretKey: string,\n ) {}\n\n /**\n * Create a fixed-amount pay link.\n *\n * The returned {@link Paylink.url} is a hosted checkout page. Redirect a\n * customer to it, or pass it to the embedded checkout widget. Customers\n * receive the standard 6%+ KLM spending discount automatically.\n *\n * @example\n * ```ts\n * const link = await kaelum.paylinks.create({\n * amountGbp: 49.99,\n * description: \"Order #1024\",\n * redirectUrl: \"https://shop.example.com/thank-you\",\n * webhookUrl: \"https://shop.example.com/webhooks/kaelum\",\n * });\n * // Send the customer to link.url\n * ```\n */\n async create(params: PaylinkCreateParams): Promise<Paylink> {\n if (!(params.amountGbp > 0)) {\n throw new KaelumInvalidRequestError(\"`amountGbp` must be greater than 0.\");\n }\n if (!params.description?.trim()) {\n throw new KaelumInvalidRequestError(\"`description` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_create_paylink\", {\n amount_gbp: params.amountGbp,\n description: params.description,\n developer_secret_key: this.secretKey,\n ...(params.redirectUrl ? { redirect_url: params.redirectUrl } : {}),\n ...(params.webhookUrl ? { webhook_url: params.webhookUrl } : {}),\n });\n\n return toPaylink(result);\n }\n\n /**\n * List your existing pay links, most recent first.\n *\n * @example\n * ```ts\n * const links = await kaelum.paylinks.list({ limit: 25 });\n * ```\n */\n async list(params: PaylinkListParams = {}): Promise<Paylink[]> {\n const result = await this.transport.call(\"kaelum_list_paylinks\", {\n developer_secret_key: this.secretKey,\n ...(params.limit ? { limit: params.limit } : {}),\n });\n\n const items = pickArray(result);\n return items.map(toPaylink);\n }\n}\n\n/** Normalise a raw MCP result into a {@link Paylink}. */\nexport function toPaylink(raw: Record<string, unknown>): Paylink {\n const get = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (raw[key] !== undefined && raw[key] !== null) return raw[key];\n }\n return undefined;\n };\n\n const embedToken = asOptionalString(get(\"embedToken\", \"embed_token\", \"token\"));\n const rawUrl = asOptionalString(get(\"url\", \"payment_url\", \"paymentUrl\", \"checkout_url\", \"embed_url\", \"link\"));\n \n return {\n id: String(get(\"id\", \"paylink_id\") ?? embedToken ?? \"\"),\n url: rawUrl ?? (embedToken ? `https://kaelum.app/pay/${embedToken}` : \"\"),\n embedToken,\n embedHtml: asOptionalString(get(\"embedHtml\", \"embed_html\", \"html\")),\n amountGbp: Number(get(\"amountGbp\", \"amount_gbp\", \"amount\") ?? 0),\n description: String(get(\"description\") ?? \"\"),\n status: asOptionalString(get(\"status\")) as Paylink[\"status\"],\n redirectUrl: asOptionalString(get(\"redirectUrl\", \"redirect_url\")),\n webhookUrl: asOptionalString(get(\"webhookUrl\", \"webhook_url\")),\n usageCount: asOptionalNumber(get(\"usageCount\", \"usage_count\", \"uses\")),\n createdAt: asOptionalString(get(\"createdAt\", \"created_at\", \"created\")),\n };\n}\n\nfunction pickArray(result: Record<string, unknown>): Array<Record<string, unknown>> {\n if (Array.isArray(result)) return result as Array<Record<string, unknown>>;\n for (const key of [\"paylinks\", \"data\", \"items\", \"results\"]) {\n const value = result[key];\n if (Array.isArray(value)) return value as Array<Record<string, unknown>>;\n }\n return [];\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction asOptionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Server-to-server KLM payments.\n *\n * This is the direct payment API. It moves KLM from a customer account to\n * a merchant or creator account. Use it when you are building an agent, a\n * point-of-sale flow, or any integration that holds a customer session.\n *\n * The flow is two-step and deliberate:\n * 1. {@link Payments.initiate} returns a PENDING transaction.\n * 2. After the customer confirms the details, {@link Payments.confirm}\n * executes the transfer. A confirmed transfer cannot be reversed.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type {\n AuthenticateParams,\n AuthSession,\n PaymentInitiateParams,\n PaymentTransaction,\n} from \"../types.js\";\n\n/** Authenticate a KAELUM account for the server-to-server payment API. */\nexport class Auth {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * Exchange an account number and personal API key for a session token.\n * The token is valid for roughly one hour.\n *\n * @example\n * ```ts\n * const session = await kaelum.auth.authenticate({\n * accountNumber: \"KA-100245\",\n * apiKey: process.env.KAELUM_USER_KEY!,\n * });\n * ```\n */\n async authenticate(params: AuthenticateParams): Promise<AuthSession> {\n if (!params.accountNumber?.trim()) {\n throw new KaelumInvalidRequestError(\"`accountNumber` is required.\");\n }\n if (!params.apiKey?.trim()) {\n throw new KaelumInvalidRequestError(\"`apiKey` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_authenticate\", {\n account_number: params.accountNumber,\n api_key: params.apiKey,\n });\n\n const token = result[\"sessionToken\"] ?? result[\"session_token\"] ?? result[\"token\"];\n if (typeof token !== \"string\" || !token) {\n throw new KaelumInvalidRequestError(\n \"Authentication did not return a session token.\",\n );\n }\n return {\n sessionToken: token,\n expiresAt: optionalString(result[\"expiresAt\"] ?? result[\"expires_at\"]),\n };\n }\n}\n\n/** Initiate, confirm, cancel, and check KLM payments. */\nexport class Payments {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * Initiate a KLM payment. Returns a PENDING transaction with full\n * details. Always present those details to the customer and require\n * explicit confirmation before calling {@link Payments.confirm}.\n */\n async initiate(params: PaymentInitiateParams): Promise<PaymentTransaction> {\n if (!(params.amountKlm >= 1)) {\n throw new KaelumInvalidRequestError(\"`amountKlm` must be at least 1.\");\n }\n if (!params.merchantId?.trim()) {\n throw new KaelumInvalidRequestError(\"`merchantId` is required.\");\n }\n if (!params.sessionToken?.trim()) {\n throw new KaelumInvalidRequestError(\"`sessionToken` is required.\");\n }\n\n const result = await this.transport.call(\"kaelum_payment_initiate\", {\n amount_klm: params.amountKlm,\n merchant_id: params.merchantId,\n session_token: params.sessionToken,\n ...(params.reference ? { reference: params.reference } : {}),\n });\n return toTransaction(result);\n }\n\n /**\n * Confirm and execute a previously initiated payment.\n * This transfers KLM and cannot be reversed.\n */\n async confirm(sessionToken: string, transactionId: string): Promise<PaymentTransaction> {\n requireToken(sessionToken);\n requireTransactionId(transactionId);\n const result = await this.transport.call(\"kaelum_payment_confirm\", {\n session_token: sessionToken,\n transaction_id: transactionId,\n });\n return toTransaction(result);\n }\n\n /** Cancel a payment that is still PENDING. */\n async cancel(sessionToken: string, transactionId: string): Promise<PaymentTransaction> {\n requireToken(sessionToken);\n requireTransactionId(transactionId);\n const result = await this.transport.call(\"kaelum_payment_cancel\", {\n session_token: sessionToken,\n transaction_id: transactionId,\n });\n return toTransaction(result);\n }\n\n /**\n * Check the current status of a transaction. Accepts either a session\n * token or a read-only API key.\n *\n * @example\n * ```ts\n * const tx = await kaelum.payments.status(\"txn_abc123\", {\n * sessionToken: session.sessionToken,\n * });\n * ```\n */\n async status(\n transactionId: string,\n auth: { sessionToken?: string; apiKey?: string },\n ): Promise<PaymentTransaction> {\n requireTransactionId(transactionId);\n if (!auth.sessionToken && !auth.apiKey) {\n throw new KaelumInvalidRequestError(\n \"Provide either a `sessionToken` or an `apiKey` to check status.\",\n );\n }\n const result = await this.transport.call(\"kaelum_payment_status\", {\n transaction_id: transactionId,\n ...(auth.sessionToken ? { session_token: auth.sessionToken } : {}),\n ...(auth.apiKey ? { api_key: auth.apiKey } : {}),\n });\n return toTransaction(result);\n }\n}\n\n/** Normalise a raw MCP result into a {@link PaymentTransaction}. */\nexport function toTransaction(raw: Record<string, unknown>): PaymentTransaction {\n const get = (...keys: string[]): unknown => {\n for (const key of keys) {\n if (raw[key] !== undefined && raw[key] !== null) return raw[key];\n }\n return undefined;\n };\n return {\n transactionId: String(\n get(\"transactionId\", \"transaction_id\", \"id\", \"txn_id\") ?? \"\",\n ),\n status: String(get(\"status\") ?? \"PENDING\") as PaymentTransaction[\"status\"],\n amountKlm: Number(get(\"amountKlm\", \"amount_klm\", \"amount\") ?? 0),\n amountGbp: optionalNumber(get(\"amountGbp\", \"amount_gbp\")),\n merchantId: String(get(\"merchantId\", \"merchant_id\") ?? \"\"),\n reference: optionalString(get(\"reference\")),\n createdAt: optionalString(get(\"createdAt\", \"created_at\", \"created\")),\n };\n}\n\nfunction requireToken(token: string): void {\n if (!token?.trim()) {\n throw new KaelumInvalidRequestError(\"A session token is required.\");\n }\n}\n\nfunction requireTransactionId(id: string): void {\n if (!id?.trim()) {\n throw new KaelumInvalidRequestError(\"A transaction ID is required.\");\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Read-only KAELUM resources: KLM price, account balances, the merchant\n * directory, developer keys, and K.A.T.E. engine status.\n */\n\nimport type { McpTransport } from \"../transport.js\";\nimport { KaelumInvalidRequestError } from \"../errors.js\";\nimport type {\n AccountBalance,\n DeveloperKey,\n KateStatus,\n KlmPrice,\n Merchant,\n} from \"../types.js\";\n\n/** The current KLM price, governed by the K.A.T.E. engine. */\nexport class Klm {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the current KLM price. */\n async price(): Promise<KlmPrice> {\n const raw = await this.transport.call(\"kaelum_get_klm_price\", {});\n return {\n priceGbp: Number(\n raw[\"priceGbp\"] ?? raw[\"price_gbp\"] ?? raw[\"price\"] ?? raw[\"current_price_gbp\"] ?? 0,\n ),\n currency: optionalString(raw[\"currency\"]) ?? \"GBP\",\n asOf: optionalString(raw[\"asOf\"] ?? raw[\"as_of\"] ?? raw[\"timestamp\"]),\n };\n }\n}\n\n/** KAELUM account balances. */\nexport class Balances {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the balance summary for a KAELUM account. */\n async retrieve(userId: string): Promise<AccountBalance> {\n if (!userId?.trim()) {\n throw new KaelumInvalidRequestError(\"`userId` is required.\");\n }\n const raw = await this.transport.call(\"kaelum_get_user_balance\", {\n user_id: userId,\n });\n return {\n userId,\n balanceKlm: Number(raw[\"balanceKlm\"] ?? raw[\"balance_klm\"] ?? raw[\"balance\"] ?? 0),\n balanceGbp: optionalNumber(raw[\"balanceGbp\"] ?? raw[\"balance_gbp\"]),\n tier: optionalString(raw[\"tier\"] ?? raw[\"account_tier\"]),\n status: optionalString(raw[\"status\"] ?? raw[\"account_status\"]),\n };\n }\n}\n\n/** The KAELUM merchant and creator directory. */\nexport class Merchants {\n constructor(private readonly transport: McpTransport) {}\n\n /**\n * List merchants and creators that can receive KLM payments.\n *\n * @param query - Optional keyword to filter the directory.\n */\n async list(query?: string): Promise<Merchant[]> {\n const raw = await this.transport.call(\n \"kaelum_get_merchants\",\n query ? { query } : {},\n );\n const items = pickArray(raw, [\"merchants\", \"data\", \"items\", \"results\"]);\n return items.map((item) => ({\n id: String(item[\"id\"] ?? item[\"merchant_id\"] ?? item[\"account_id\"] ?? \"\"),\n name: String(item[\"name\"] ?? item[\"merchant_name\"] ?? \"\"),\n tier: optionalString(item[\"tier\"]),\n }));\n }\n}\n\n/** Your KAELUM Pay developer API keys. */\nexport class DeveloperKeys {\n constructor(\n private readonly transport: McpTransport,\n private readonly secretKey: string,\n ) {}\n\n /** List the developer API keys on your account. */\n async list(): Promise<DeveloperKey[]> {\n const raw = await this.transport.call(\"kaelum_get_developer_keys\", {\n developer_secret_key: this.secretKey,\n });\n const items = pickArray(raw, [\"keys\", \"data\", \"items\", \"results\"]);\n return items.map((item) => ({\n id: String(item[\"id\"] ?? item[\"key_id\"] ?? \"\"),\n publishableKey: optionalString(item[\"publishableKey\"] ?? item[\"publishable_key\"]),\n status: optionalString(item[\"status\"]),\n createdAt: optionalString(item[\"createdAt\"] ?? item[\"created_at\"]),\n }));\n }\n}\n\n/** Health of the K.A.T.E. (Kaelum Audivo Triovus Engine). */\nexport class Kate {\n constructor(private readonly transport: McpTransport) {}\n\n /** Retrieve the current K.A.T.E. engine status. */\n async status(): Promise<KateStatus> {\n const raw = await this.transport.call(\"kaelum_get_kate_status\", {});\n return {\n status: String(raw[\"overall_status\"] ?? raw[\"status\"] ?? \"OPERATIONAL\"),\n activeAgents: optionalNumber(\n raw[\"active_agent_count\"] ?? raw[\"agents_active\"] ?? raw[\"activeAgents\"],\n ),\n lastHeartbeat: optionalString(\n raw[\"last_assessment\"] ?? raw[\"lastHeartbeat\"] ?? raw[\"last_heartbeat\"],\n ),\n };\n }\n}\n\nfunction pickArray(\n raw: Record<string, unknown>,\n keys: string[],\n): Array<Record<string, unknown>> {\n if (Array.isArray(raw)) return raw as Array<Record<string, unknown>>;\n for (const key of keys) {\n const value = raw[key];\n if (Array.isArray(value)) return value as Array<Record<string, unknown>>;\n }\n return [];\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return value === undefined || value === null ? undefined : Number(value);\n}\n","/**\n * Webhook verification.\n *\n * KAELUM Pay signs every webhook delivery with HMAC-SHA256, using the\n * signing secret shown when you register a webhook endpoint. Always verify\n * the signature before acting on a webhook: an unverified request is an\n * untrusted request.\n *\n * Pass the *raw, unparsed* request body to {@link Webhooks.constructEvent}.\n * Parsing the body to JSON first and then re-serialising it will change\n * the bytes and break verification.\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { KaelumSignatureVerificationError } from \"./errors.js\";\nimport type { WebhookEvent } from \"./types.js\";\n\n/** Options for {@link Webhooks.constructEvent}. */\nexport interface ConstructEventOptions {\n /**\n * Maximum age of a webhook, in seconds, when the signature header\n * carries a timestamp. Deliveries older than this are rejected as a\n * defence against replay. Set to 0 to disable the check. Defaults to 300.\n */\n toleranceSeconds?: number;\n}\n\n/** Verify and parse incoming KAELUM Pay webhooks. */\nexport class Webhooks {\n /**\n * Verify a webhook signature and return the parsed event.\n *\n * @param rawBody - The raw request body, exactly as received.\n * @param signatureHeader - The value of the `Kaelum-Signature` header.\n * @param signingSecret - Your webhook signing secret (`whsec_...`).\n * @throws {@link KaelumSignatureVerificationError} when verification fails.\n *\n * @example\n * ```ts\n * app.post(\"/webhooks/kaelum\", express.raw({ type: \"*\\/*\" }), (req, res) => {\n * try {\n * const event = kaelum.webhooks.constructEvent(\n * req.body,\n * req.headers[\"kaelum-signature\"] as string,\n * process.env.KAELUM_WEBHOOK_SECRET!,\n * );\n * if (event.type === \"payment.succeeded\") fulfilOrder(event.data);\n * res.sendStatus(200);\n * } catch {\n * res.sendStatus(400);\n * }\n * });\n * ```\n */\n constructEvent(\n rawBody: string | Buffer,\n signatureHeader: string | undefined,\n signingSecret: string,\n options: ConstructEventOptions = {},\n ): WebhookEvent {\n if (!this.verify(rawBody, signatureHeader, signingSecret, options)) {\n throw new KaelumSignatureVerificationError(\n \"Webhook signature verification failed. The request was not accepted.\",\n );\n }\n const payload = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(payload);\n } catch {\n throw new KaelumSignatureVerificationError(\n \"Webhook body could not be parsed as JSON.\",\n );\n }\n const obj = (parsed ?? {}) as Record<string, unknown>;\n return {\n id: String(obj[\"id\"] ?? obj[\"event_id\"] ?? \"\"),\n type: String(obj[\"type\"] ?? obj[\"event\"] ?? \"\"),\n createdAt: optionalString(obj[\"createdAt\"] ?? obj[\"created_at\"] ?? obj[\"created\"]),\n data: (obj[\"data\"] ?? obj[\"payload\"] ?? obj) as Record<string, unknown>,\n };\n }\n\n /**\n * Verify a webhook signature without parsing the body.\n * Returns `true` when the signature is valid, `false` otherwise.\n * Never throws.\n */\n verify(\n rawBody: string | Buffer,\n signatureHeader: string | undefined,\n signingSecret: string,\n options: ConstructEventOptions = {},\n ): boolean {\n if (!signatureHeader || !signingSecret) return false;\n\n const payload = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n const parts = parseSignatureHeader(signatureHeader);\n\n // Optional replay protection when the header carries a timestamp.\n const tolerance = options.toleranceSeconds ?? 300;\n if (parts.timestamp !== undefined && tolerance > 0) {\n const ageSeconds = Math.abs(Date.now() / 1000 - parts.timestamp);\n if (ageSeconds > tolerance) return false;\n }\n\n // When a timestamp is present, it is part of the signed payload.\n const signedPayload =\n parts.timestamp !== undefined ? `${parts.timestamp}.${payload}` : payload;\n const expected = createHmac(\"sha256\", signingSecret)\n .update(signedPayload, \"utf8\")\n .digest(\"hex\");\n\n return parts.signatures.some((candidate) => safeEqual(candidate, expected));\n }\n}\n\ninterface ParsedSignature {\n timestamp?: number;\n signatures: string[];\n}\n\n/**\n * Parse a signature header. Supports three common encodings:\n * - a bare hex digest: `a1b2c3...`\n * - a prefixed digest: `sha256=a1b2c3...`\n * - a timestamped, comma-separated form: `t=1700000000,v1=a1b2c3...`\n */\nfunction parseSignatureHeader(header: string): ParsedSignature {\n const value = header.trim();\n const signatures: string[] = [];\n let timestamp: number | undefined;\n\n if (value.includes(\"=\") && value.includes(\",\")) {\n for (const segment of value.split(\",\")) {\n const [key, raw] = segment.split(\"=\").map((s) => s.trim());\n if (!key || !raw) continue;\n if (key === \"t\") {\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) timestamp = parsed;\n } else if (key.startsWith(\"v\")) {\n signatures.push(raw.toLowerCase());\n }\n }\n } else if (value.toLowerCase().startsWith(\"sha256=\")) {\n signatures.push(value.slice(7).toLowerCase());\n } else {\n signatures.push(value.toLowerCase());\n }\n\n return { timestamp, signatures };\n}\n\n/** Constant-time string comparison over hex digests. */\nfunction safeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n try {\n return timingSafeEqual(Buffer.from(a, \"utf8\"), Buffer.from(b, \"utf8\"));\n } catch {\n return false;\n }\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined || value === null ? undefined : String(value);\n}\n","/**\n * The KAELUM Pay client.\n *\n * `KaelumPay` is the single entry point for the server-side SDK. Construct\n * it once with your developer secret key and reuse it across requests.\n */\n\nimport { McpTransport } from \"./transport.js\";\nimport { KaelumInvalidRequestError } from \"./errors.js\";\nimport { Paylinks } from \"./resources/paylinks.js\";\nimport { Auth, Payments } from \"./resources/payments.js\";\nimport { Balances, DeveloperKeys, Kate, Klm, Merchants } from \"./resources/data.js\";\nimport { Webhooks } from \"./webhooks.js\";\nimport type { KaelumPayOptions } from \"./types.js\";\n\n/**\n * Accept KLM, the Ai-governed closed-loop digital commerce currency, as a\n * payment option on any website or app.\n *\n * @example\n * ```ts\n * import { KaelumPay } from \"@kaelum/pay\";\n *\n * const kaelum = new KaelumPay({ secretKey: process.env.KAELUM_SECRET_KEY! });\n *\n * const link = await kaelum.paylinks.create({\n * amountGbp: 24.00,\n * description: \"One month subscription\",\n * });\n * console.log(link.url);\n * ```\n */\nexport class KaelumPay {\n /** Create and list hosted pay links. */\n public readonly paylinks: Paylinks;\n /** Authenticate accounts for the server-to-server payment API. */\n public readonly auth: Auth;\n /** Initiate, confirm, cancel, and check KLM payments. */\n public readonly payments: Payments;\n /** Retrieve the current KLM price. */\n public readonly klm: Klm;\n /** Retrieve KAELUM account balances. */\n public readonly balances: Balances;\n /** Browse the merchant and creator directory. */\n public readonly merchants: Merchants;\n /** List your developer API keys. */\n public readonly developerKeys: DeveloperKeys;\n /** Check K.A.T.E. engine health. */\n public readonly kate: Kate;\n /** Verify and parse incoming webhooks. */\n public readonly webhooks: Webhooks;\n\n constructor(options: KaelumPayOptions) {\n if (!options || typeof options.secretKey !== \"string\" || !options.secretKey.trim()) {\n throw new KaelumInvalidRequestError(\n \"A KAELUM Pay `secretKey` is required. Generate one at https://kaelum.app/developer/portal.\",\n );\n }\n if (!options.secretKey.startsWith(\"sk_\")) {\n throw new KaelumInvalidRequestError(\n \"The `secretKey` looks invalid. It should start with `sk_live_`. \" +\n \"Do not pass a publishable key (`pk_live_`) here.\",\n );\n }\n\n const secretKey = options.secretKey;\n const transport = new McpTransport({\n baseUrl: options.baseUrl,\n timeoutMs: options.timeoutMs,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n });\n\n this.paylinks = new Paylinks(transport, secretKey);\n this.auth = new Auth(transport);\n this.payments = new Payments(transport);\n this.klm = new Klm(transport);\n this.balances = new Balances(transport);\n this.merchants = new Merchants(transport);\n this.developerKeys = new DeveloperKeys(transport, secretKey);\n this.kate = new Kate(transport);\n this.webhooks = new Webhooks();\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaelum/pay",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Official KAELUM Pay SDK. Accept KLM, the Ai-governed closed-loop digital commerce currency, as a payment option on any website or app.",
5
5
  "license": "MIT",
6
6
  "author": "Kaelum Technologies Ltd <info@kaelumtechnologies.com>",