@relai-fi/x402 0.5.26 → 0.5.27
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/management.cjs.map +1 -1
- package/dist/management.d.cts +11 -0
- package/dist/management.d.ts +11 -0
- package/dist/management.js.map +1 -1
- package/package.json +1 -1
package/dist/management.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/management.ts"],"sourcesContent":["// src/management.ts\n// RelAI Management API client — create and manage monetised APIs programmatically.\n// Docs: https://relai.fi/documentation/management-api\n\nconst RELAI_API_BASE = 'https://api.relai.fi';\nconst BOOTSTRAP_URL = `${RELAI_API_BASE}/mcp/management/bootstrap/agent`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ManagementClientConfig {\n /** Service key (sk_live_...) for authenticating management API calls */\n serviceKey: string;\n /** Override base URL (default: https://api.relai.fi) */\n baseUrl?: string;\n}\n\nexport interface RelaiApi {\n apiId: string;\n name: string;\n description?: string;\n baseUrl: string;\n subdomain?: string | null;\n network: string;\n facilitator: string;\n x402Version: number;\n status: string;\n merchantWallet: string;\n websiteUrl?: string;\n logoUrl?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ApiEndpointInput {\n path: string;\n method: string;\n usdPrice: number;\n enabled?: boolean;\n}\n\nexport interface ApiEndpoint extends ApiEndpointInput {\n network: string;\n enabled: boolean;\n}\n\nexport interface CreateApiInput {\n name: string;\n baseUrl: string;\n merchantWallet: string;\n network: string;\n description?: string;\n websiteUrl?: string;\n logoUrl?: string;\n endpoints?: ApiEndpointInput[];\n}\n\nexport interface UpdateApiInput {\n name?: string;\n description?: string;\n baseUrl?: string;\n merchantWallet?: string;\n websiteUrl?: string;\n logoUrl?: string;\n}\n\nexport interface ApiStats {\n apiId: string;\n totalRequests: number;\n totalRevenue: number;\n currency: string;\n}\n\nexport interface ApiPayment {\n transaction: string;\n path: string;\n method: string;\n amount: number;\n currency: string;\n network: string;\n status: string;\n success: boolean;\n payer: string;\n createdAt: string;\n}\n\nexport interface ApiPaymentsResult {\n apiId: string;\n payments: ApiPayment[];\n nextCursor: string | null;\n}\n\nexport interface ApiLogItem {\n id: string;\n timestamp: string;\n method: string;\n path: string;\n status: string;\n cost: number;\n currency: string;\n duration: number;\n transaction: string;\n network: string;\n success: boolean;\n payer: string;\n}\n\nexport interface ApiLogsResult {\n items: ApiLogItem[];\n nextCursor: string | null;\n}\n\nexport interface AgentBootstrapResult {\n key: string;\n label: string;\n active: boolean;\n createdAt: string;\n}\n\n// ============================================================================\n// Agent bootstrap (autonomous key provisioning)\n// ============================================================================\n\n/**\n * Bootstrap a service key for a Solana agent.\n * Run once — store the returned key securely.\n *\n * @param keypair A Solana Keypair (from @solana/web3.js)\n * @param label Human-readable label for the key\n */\nexport async function bootstrapAgentKeySolana(\n keypair: { publicKey: { toBase58(): string }; secretKey: Uint8Array },\n label = 'agent',\n): Promise<AgentBootstrapResult> {\n const { sign } = await import('tweetnacl');\n\n const publicKey = keypair.publicKey.toBase58();\n\n // Step 1 — request challenge\n const challengeRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey }),\n });\n if (!challengeRes.ok) throw new Error(`Challenge request failed: ${challengeRes.status}`);\n const { message } = await challengeRes.json() as { message: string };\n\n // Step 2 — sign\n const msgBytes = new TextEncoder().encode(message);\n const sigBytes = sign.detached(msgBytes, keypair.secretKey);\n const signature = Buffer.from(sigBytes).toString('base64');\n\n // Step 3 — get service key\n const keyRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey, signature, message, label }),\n });\n if (!keyRes.ok) throw new Error(`Key provisioning failed: ${keyRes.status}`);\n return keyRes.json() as Promise<AgentBootstrapResult>;\n}\n\n/**\n * Bootstrap a service key for an EVM agent.\n * Run once — store the returned key securely.\n *\n * @param wallet An ethers.js Wallet or Signer with address + signMessage\n * @param label Human-readable label for the key\n */\nexport async function bootstrapAgentKeyEvm(\n wallet: { address: string; signMessage(message: string): Promise<string> },\n label = 'agent',\n): Promise<AgentBootstrapResult> {\n const publicKey = wallet.address;\n\n // Step 1 — request challenge\n const challengeRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey }),\n });\n if (!challengeRes.ok) throw new Error(`Challenge request failed: ${challengeRes.status}`);\n const { message } = await challengeRes.json() as { message: string };\n\n // Step 2+3 — sign and get key\n const signature = await wallet.signMessage(message);\n const keyRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey, signature, message, label }),\n });\n if (!keyRes.ok) throw new Error(`Key provisioning failed: ${keyRes.status}`);\n return keyRes.json() as Promise<AgentBootstrapResult>;\n}\n\n// ============================================================================\n// Management client\n// ============================================================================\n\nexport interface RelaiManagementClient {\n // APIs\n createApi(input: CreateApiInput): Promise<RelaiApi>;\n listApis(): Promise<RelaiApi[]>;\n getApi(apiId: string): Promise<RelaiApi>;\n updateApi(apiId: string, input: UpdateApiInput): Promise<RelaiApi>;\n deleteApi(apiId: string): Promise<{ success: boolean; apiId: string }>;\n\n // Pricing\n getPricing(apiId: string): Promise<{ apiId: string; endpoints: ApiEndpoint[] }>;\n setPricing(apiId: string, endpoints: ApiEndpointInput[]): Promise<{ success: boolean; apiId: string; updated: number }>;\n\n // Analytics\n getStats(apiId: string): Promise<ApiStats>;\n getPayments(apiId: string, options?: { limit?: number; from?: string; cursor?: string }): Promise<ApiPaymentsResult>;\n getLogs(apiId: string, options?: { limit?: number; from?: string; cursor?: string }): Promise<ApiLogsResult>;\n}\n\n/**\n * Create a RelAI Management API client.\n *\n * @example\n * ```typescript\n * import { createManagementClient } from '@relai-fi/x402/management';\n *\n * const mgmt = createManagementClient({ serviceKey: process.env.RELAI_SERVICE_KEY! });\n *\n * const api = await mgmt.createApi({\n * name: 'My ML API',\n * baseUrl: 'https://inference.example.com',\n * merchantWallet: '0xYourWallet',\n * network: 'base',\n * endpoints: [{ path: '/v1/predict', method: 'post', usdPrice: 0.05 }],\n * });\n * ```\n */\nexport function createManagementClient(config: ManagementClientConfig): RelaiManagementClient {\n const base = (config.baseUrl ?? RELAI_API_BASE).replace(/\\/$/, '');\n const headers = {\n 'X-Service-Key': config.serviceKey,\n 'Content-Type': 'application/json',\n };\n\n async function req<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`[relai-mgmt] ${method} ${path} → ${res.status}: ${text}`);\n }\n return res.json() as Promise<T>;\n }\n\n return {\n // ── APIs ──────────────────────────────────────────────────────────────\n\n createApi(input) {\n return req<RelaiApi>('POST', '/v1/apis', input);\n },\n\n async listApis() {\n const data = await req<{ apis: RelaiApi[] }>('GET', '/v1/apis');\n return data.apis;\n },\n\n getApi(apiId) {\n return req<RelaiApi>('GET', `/v1/apis/${apiId}`);\n },\n\n updateApi(apiId, input) {\n return req<RelaiApi>('PATCH', `/v1/apis/${apiId}`, input);\n },\n\n deleteApi(apiId) {\n return req<{ success: boolean; apiId: string }>('DELETE', `/v1/apis/${apiId}`);\n },\n\n // ── Pricing ──────────────────────────────────────────────────────────\n\n getPricing(apiId) {\n return req<{ apiId: string; endpoints: ApiEndpoint[] }>('GET', `/v1/apis/${apiId}/pricing`);\n },\n\n setPricing(apiId, endpoints) {\n return req<{ success: boolean; apiId: string; updated: number }>('PUT', `/v1/apis/${apiId}/pricing`, { endpoints });\n },\n\n // ── Analytics ────────────────────────────────────────────────────────\n\n getStats(apiId) {\n return req<ApiStats>('GET', `/v1/apis/${apiId}/stats`);\n },\n\n getPayments(apiId, options = {}) {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.from) params.set('from', options.from);\n if (options.cursor) params.set('cursor', options.cursor);\n const qs = params.toString() ? `?${params}` : '';\n return req<ApiPaymentsResult>('GET', `/v1/apis/${apiId}/payments${qs}`);\n },\n\n getLogs(apiId, options = {}) {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.from) params.set('from', options.from);\n if (options.cursor) params.set('cursor', options.cursor);\n const qs = params.toString() ? `?${params}` : '';\n return req<ApiLogsResult>('GET', `/v1/apis/${apiId}/logs${qs}`);\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/management.ts"],"sourcesContent":["// src/management.ts\n// RelAI Management API client — create and manage monetised APIs programmatically.\n// Docs: https://relai.fi/documentation/management-api\n\nconst RELAI_API_BASE = 'https://api.relai.fi';\nconst BOOTSTRAP_URL = `${RELAI_API_BASE}/mcp/management/bootstrap/agent`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ManagementClientConfig {\n /** Service key (sk_live_...) for authenticating management API calls */\n serviceKey: string;\n /** Override base URL (default: https://api.relai.fi) */\n baseUrl?: string;\n}\n\nexport interface RelaiApi {\n apiId: string;\n name: string;\n description?: string;\n baseUrl: string;\n subdomain?: string | null;\n network: string;\n facilitator: string;\n x402Version: number;\n status: string;\n merchantWallet: string;\n solanaWallet?: string | null;\n /** EVM wallet for cross-chain payments. Only relevant when network is Solana. */\n evmCrossChainWallet?: string | null;\n websiteUrl?: string;\n logoUrl?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ApiEndpointInput {\n path: string;\n method: string;\n usdPrice: number;\n enabled?: boolean;\n}\n\nexport interface ApiEndpoint extends ApiEndpointInput {\n network: string;\n enabled: boolean;\n}\n\nexport interface CreateApiInput {\n name: string;\n baseUrl: string;\n merchantWallet: string;\n /** Solana wallet for cross-chain payments. Only relevant when network is EVM. */\n solanaWallet?: string;\n /** EVM wallet for cross-chain payments. Only relevant when network is Solana. */\n evmCrossChainWallet?: string;\n network: string;\n description?: string;\n websiteUrl?: string;\n logoUrl?: string;\n endpoints?: ApiEndpointInput[];\n}\n\nexport interface UpdateApiInput {\n name?: string;\n description?: string;\n baseUrl?: string;\n merchantWallet?: string;\n /** Solana wallet for cross-chain payments. Set to null to remove. */\n solanaWallet?: string | null;\n /** EVM wallet for cross-chain payments. Set to null to remove. */\n evmCrossChainWallet?: string | null;\n websiteUrl?: string;\n logoUrl?: string;\n}\n\nexport interface ApiStats {\n apiId: string;\n totalRequests: number;\n totalRevenue: number;\n currency: string;\n}\n\nexport interface ApiPayment {\n transaction: string;\n path: string;\n method: string;\n amount: number;\n currency: string;\n network: string;\n status: string;\n success: boolean;\n payer: string;\n createdAt: string;\n}\n\nexport interface ApiPaymentsResult {\n apiId: string;\n payments: ApiPayment[];\n nextCursor: string | null;\n}\n\nexport interface ApiLogItem {\n id: string;\n timestamp: string;\n method: string;\n path: string;\n status: string;\n cost: number;\n currency: string;\n duration: number;\n transaction: string;\n network: string;\n success: boolean;\n payer: string;\n}\n\nexport interface ApiLogsResult {\n items: ApiLogItem[];\n nextCursor: string | null;\n}\n\nexport interface AgentBootstrapResult {\n key: string;\n label: string;\n active: boolean;\n createdAt: string;\n}\n\n// ============================================================================\n// Agent bootstrap (autonomous key provisioning)\n// ============================================================================\n\n/**\n * Bootstrap a service key for a Solana agent.\n * Run once — store the returned key securely.\n *\n * @param keypair A Solana Keypair (from @solana/web3.js)\n * @param label Human-readable label for the key\n */\nexport async function bootstrapAgentKeySolana(\n keypair: { publicKey: { toBase58(): string }; secretKey: Uint8Array },\n label = 'agent',\n): Promise<AgentBootstrapResult> {\n const { sign } = await import('tweetnacl');\n\n const publicKey = keypair.publicKey.toBase58();\n\n // Step 1 — request challenge\n const challengeRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey }),\n });\n if (!challengeRes.ok) throw new Error(`Challenge request failed: ${challengeRes.status}`);\n const { message } = await challengeRes.json() as { message: string };\n\n // Step 2 — sign\n const msgBytes = new TextEncoder().encode(message);\n const sigBytes = sign.detached(msgBytes, keypair.secretKey);\n const signature = Buffer.from(sigBytes).toString('base64');\n\n // Step 3 — get service key\n const keyRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey, signature, message, label }),\n });\n if (!keyRes.ok) throw new Error(`Key provisioning failed: ${keyRes.status}`);\n return keyRes.json() as Promise<AgentBootstrapResult>;\n}\n\n/**\n * Bootstrap a service key for an EVM agent.\n * Run once — store the returned key securely.\n *\n * @param wallet An ethers.js Wallet or Signer with address + signMessage\n * @param label Human-readable label for the key\n */\nexport async function bootstrapAgentKeyEvm(\n wallet: { address: string; signMessage(message: string): Promise<string> },\n label = 'agent',\n): Promise<AgentBootstrapResult> {\n const publicKey = wallet.address;\n\n // Step 1 — request challenge\n const challengeRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey }),\n });\n if (!challengeRes.ok) throw new Error(`Challenge request failed: ${challengeRes.status}`);\n const { message } = await challengeRes.json() as { message: string };\n\n // Step 2+3 — sign and get key\n const signature = await wallet.signMessage(message);\n const keyRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey, signature, message, label }),\n });\n if (!keyRes.ok) throw new Error(`Key provisioning failed: ${keyRes.status}`);\n return keyRes.json() as Promise<AgentBootstrapResult>;\n}\n\n// ============================================================================\n// Management client\n// ============================================================================\n\nexport interface RelaiManagementClient {\n // APIs\n createApi(input: CreateApiInput): Promise<RelaiApi>;\n listApis(): Promise<RelaiApi[]>;\n getApi(apiId: string): Promise<RelaiApi>;\n updateApi(apiId: string, input: UpdateApiInput): Promise<RelaiApi>;\n deleteApi(apiId: string): Promise<{ success: boolean; apiId: string }>;\n\n // Pricing\n getPricing(apiId: string): Promise<{ apiId: string; endpoints: ApiEndpoint[] }>;\n setPricing(apiId: string, endpoints: ApiEndpointInput[]): Promise<{ success: boolean; apiId: string; updated: number }>;\n\n // Analytics\n getStats(apiId: string): Promise<ApiStats>;\n getPayments(apiId: string, options?: { limit?: number; from?: string; cursor?: string }): Promise<ApiPaymentsResult>;\n getLogs(apiId: string, options?: { limit?: number; from?: string; cursor?: string }): Promise<ApiLogsResult>;\n}\n\n/**\n * Create a RelAI Management API client.\n *\n * @example\n * ```typescript\n * import { createManagementClient } from '@relai-fi/x402/management';\n *\n * const mgmt = createManagementClient({ serviceKey: process.env.RELAI_SERVICE_KEY! });\n *\n * const api = await mgmt.createApi({\n * name: 'My ML API',\n * baseUrl: 'https://inference.example.com',\n * merchantWallet: '0xYourWallet',\n * network: 'base',\n * endpoints: [{ path: '/v1/predict', method: 'post', usdPrice: 0.05 }],\n * });\n * ```\n */\nexport function createManagementClient(config: ManagementClientConfig): RelaiManagementClient {\n const base = (config.baseUrl ?? RELAI_API_BASE).replace(/\\/$/, '');\n const headers = {\n 'X-Service-Key': config.serviceKey,\n 'Content-Type': 'application/json',\n };\n\n async function req<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`[relai-mgmt] ${method} ${path} → ${res.status}: ${text}`);\n }\n return res.json() as Promise<T>;\n }\n\n return {\n // ── APIs ──────────────────────────────────────────────────────────────\n\n createApi(input) {\n return req<RelaiApi>('POST', '/v1/apis', input);\n },\n\n async listApis() {\n const data = await req<{ apis: RelaiApi[] }>('GET', '/v1/apis');\n return data.apis;\n },\n\n getApi(apiId) {\n return req<RelaiApi>('GET', `/v1/apis/${apiId}`);\n },\n\n updateApi(apiId, input) {\n return req<RelaiApi>('PATCH', `/v1/apis/${apiId}`, input);\n },\n\n deleteApi(apiId) {\n return req<{ success: boolean; apiId: string }>('DELETE', `/v1/apis/${apiId}`);\n },\n\n // ── Pricing ──────────────────────────────────────────────────────────\n\n getPricing(apiId) {\n return req<{ apiId: string; endpoints: ApiEndpoint[] }>('GET', `/v1/apis/${apiId}/pricing`);\n },\n\n setPricing(apiId, endpoints) {\n return req<{ success: boolean; apiId: string; updated: number }>('PUT', `/v1/apis/${apiId}/pricing`, { endpoints });\n },\n\n // ── Analytics ────────────────────────────────────────────────────────\n\n getStats(apiId) {\n return req<ApiStats>('GET', `/v1/apis/${apiId}/stats`);\n },\n\n getPayments(apiId, options = {}) {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.from) params.set('from', options.from);\n if (options.cursor) params.set('cursor', options.cursor);\n const qs = params.toString() ? `?${params}` : '';\n return req<ApiPaymentsResult>('GET', `/v1/apis/${apiId}/payments${qs}`);\n },\n\n getLogs(apiId, options = {}) {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.from) params.set('from', options.from);\n if (options.cursor) params.set('cursor', options.cursor);\n const qs = params.toString() ? `?${params}` : '';\n return req<ApiLogsResult>('GET', `/v1/apis/${apiId}/logs${qs}`);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,IAAM,iBAAiB;AACvB,IAAM,gBAAgB,GAAG,cAAc;AAyIvC,eAAsB,wBACpB,SACA,QAAQ,SACuB;AAC/B,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,WAAW;AAEzC,QAAM,YAAY,QAAQ,UAAU,SAAS;AAG7C,QAAM,eAAe,MAAM,MAAM,eAAe;AAAA,IAC9C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,EACpC,CAAC;AACD,MAAI,CAAC,aAAa,GAAI,OAAM,IAAI,MAAM,6BAA6B,aAAa,MAAM,EAAE;AACxF,QAAM,EAAE,QAAQ,IAAI,MAAM,aAAa,KAAK;AAG5C,QAAM,WAAW,IAAI,YAAY,EAAE,OAAO,OAAO;AACjD,QAAM,WAAW,KAAK,SAAS,UAAU,QAAQ,SAAS;AAC1D,QAAM,YAAY,OAAO,KAAK,QAAQ,EAAE,SAAS,QAAQ;AAGzD,QAAM,SAAS,MAAM,MAAM,eAAe;AAAA,IACxC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,WAAW,WAAW,SAAS,MAAM,CAAC;AAAA,EAC/D,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,OAAM,IAAI,MAAM,4BAA4B,OAAO,MAAM,EAAE;AAC3E,SAAO,OAAO,KAAK;AACrB;AASA,eAAsB,qBACpB,QACA,QAAQ,SACuB;AAC/B,QAAM,YAAY,OAAO;AAGzB,QAAM,eAAe,MAAM,MAAM,eAAe;AAAA,IAC9C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,EACpC,CAAC;AACD,MAAI,CAAC,aAAa,GAAI,OAAM,IAAI,MAAM,6BAA6B,aAAa,MAAM,EAAE;AACxF,QAAM,EAAE,QAAQ,IAAI,MAAM,aAAa,KAAK;AAG5C,QAAM,YAAY,MAAM,OAAO,YAAY,OAAO;AAClD,QAAM,SAAS,MAAM,MAAM,eAAe;AAAA,IACxC,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,WAAW,WAAW,SAAS,MAAM,CAAC;AAAA,EAC/D,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,OAAM,IAAI,MAAM,4BAA4B,OAAO,MAAM,EAAE;AAC3E,SAAO,OAAO,KAAK;AACrB;AA0CO,SAAS,uBAAuB,QAAuD;AAC5F,QAAM,QAAQ,OAAO,WAAW,gBAAgB,QAAQ,OAAO,EAAE;AACjE,QAAM,UAAU;AAAA,IACd,iBAAiB,OAAO;AAAA,IACxB,gBAAgB;AAAA,EAClB;AAEA,iBAAe,IAAO,QAAgB,MAAc,MAA4B;AAC9E,UAAM,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,IAAI;AAAA,MACxC;AAAA,MACA;AAAA,MACA,GAAI,SAAS,SAAY,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,IAC7D,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,YAAM,IAAI,MAAM,gBAAgB,MAAM,IAAI,IAAI,WAAM,IAAI,MAAM,KAAK,IAAI,EAAE;AAAA,IAC3E;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,SAAO;AAAA;AAAA,IAGL,UAAU,OAAO;AACf,aAAO,IAAc,QAAQ,YAAY,KAAK;AAAA,IAChD;AAAA,IAEA,MAAM,WAAW;AACf,YAAM,OAAO,MAAM,IAA0B,OAAO,UAAU;AAC9D,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,OAAO,OAAO;AACZ,aAAO,IAAc,OAAO,YAAY,KAAK,EAAE;AAAA,IACjD;AAAA,IAEA,UAAU,OAAO,OAAO;AACtB,aAAO,IAAc,SAAS,YAAY,KAAK,IAAI,KAAK;AAAA,IAC1D;AAAA,IAEA,UAAU,OAAO;AACf,aAAO,IAAyC,UAAU,YAAY,KAAK,EAAE;AAAA,IAC/E;AAAA;AAAA,IAIA,WAAW,OAAO;AAChB,aAAO,IAAiD,OAAO,YAAY,KAAK,UAAU;AAAA,IAC5F;AAAA,IAEA,WAAW,OAAO,WAAW;AAC3B,aAAO,IAA0D,OAAO,YAAY,KAAK,YAAY,EAAE,UAAU,CAAC;AAAA,IACpH;AAAA;AAAA,IAIA,SAAS,OAAO;AACd,aAAO,IAAc,OAAO,YAAY,KAAK,QAAQ;AAAA,IACvD;AAAA,IAEA,YAAY,OAAO,UAAU,CAAC,GAAG;AAC/B,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,QAAQ,MAAQ,QAAO,IAAI,SAAU,OAAO,QAAQ,KAAK,CAAC;AAC9D,UAAI,QAAQ,KAAQ,QAAO,IAAI,QAAU,QAAQ,IAAI;AACrD,UAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACvD,YAAM,KAAK,OAAO,SAAS,IAAI,IAAI,MAAM,KAAK;AAC9C,aAAO,IAAuB,OAAO,YAAY,KAAK,YAAY,EAAE,EAAE;AAAA,IACxE;AAAA,IAEA,QAAQ,OAAO,UAAU,CAAC,GAAG;AAC3B,YAAM,SAAS,IAAI,gBAAgB;AACnC,UAAI,QAAQ,MAAQ,QAAO,IAAI,SAAU,OAAO,QAAQ,KAAK,CAAC;AAC9D,UAAI,QAAQ,KAAQ,QAAO,IAAI,QAAU,QAAQ,IAAI;AACrD,UAAI,QAAQ,OAAQ,QAAO,IAAI,UAAU,QAAQ,MAAM;AACvD,YAAM,KAAK,OAAO,SAAS,IAAI,IAAI,MAAM,KAAK;AAC9C,aAAO,IAAmB,OAAO,YAAY,KAAK,QAAQ,EAAE,EAAE;AAAA,IAChE;AAAA,EACF;AACF;","names":[]}
|
package/dist/management.d.cts
CHANGED
|
@@ -15,6 +15,9 @@ interface RelaiApi {
|
|
|
15
15
|
x402Version: number;
|
|
16
16
|
status: string;
|
|
17
17
|
merchantWallet: string;
|
|
18
|
+
solanaWallet?: string | null;
|
|
19
|
+
/** EVM wallet for cross-chain payments. Only relevant when network is Solana. */
|
|
20
|
+
evmCrossChainWallet?: string | null;
|
|
18
21
|
websiteUrl?: string;
|
|
19
22
|
logoUrl?: string;
|
|
20
23
|
createdAt: string;
|
|
@@ -34,6 +37,10 @@ interface CreateApiInput {
|
|
|
34
37
|
name: string;
|
|
35
38
|
baseUrl: string;
|
|
36
39
|
merchantWallet: string;
|
|
40
|
+
/** Solana wallet for cross-chain payments. Only relevant when network is EVM. */
|
|
41
|
+
solanaWallet?: string;
|
|
42
|
+
/** EVM wallet for cross-chain payments. Only relevant when network is Solana. */
|
|
43
|
+
evmCrossChainWallet?: string;
|
|
37
44
|
network: string;
|
|
38
45
|
description?: string;
|
|
39
46
|
websiteUrl?: string;
|
|
@@ -45,6 +52,10 @@ interface UpdateApiInput {
|
|
|
45
52
|
description?: string;
|
|
46
53
|
baseUrl?: string;
|
|
47
54
|
merchantWallet?: string;
|
|
55
|
+
/** Solana wallet for cross-chain payments. Set to null to remove. */
|
|
56
|
+
solanaWallet?: string | null;
|
|
57
|
+
/** EVM wallet for cross-chain payments. Set to null to remove. */
|
|
58
|
+
evmCrossChainWallet?: string | null;
|
|
48
59
|
websiteUrl?: string;
|
|
49
60
|
logoUrl?: string;
|
|
50
61
|
}
|
package/dist/management.d.ts
CHANGED
|
@@ -15,6 +15,9 @@ interface RelaiApi {
|
|
|
15
15
|
x402Version: number;
|
|
16
16
|
status: string;
|
|
17
17
|
merchantWallet: string;
|
|
18
|
+
solanaWallet?: string | null;
|
|
19
|
+
/** EVM wallet for cross-chain payments. Only relevant when network is Solana. */
|
|
20
|
+
evmCrossChainWallet?: string | null;
|
|
18
21
|
websiteUrl?: string;
|
|
19
22
|
logoUrl?: string;
|
|
20
23
|
createdAt: string;
|
|
@@ -34,6 +37,10 @@ interface CreateApiInput {
|
|
|
34
37
|
name: string;
|
|
35
38
|
baseUrl: string;
|
|
36
39
|
merchantWallet: string;
|
|
40
|
+
/** Solana wallet for cross-chain payments. Only relevant when network is EVM. */
|
|
41
|
+
solanaWallet?: string;
|
|
42
|
+
/** EVM wallet for cross-chain payments. Only relevant when network is Solana. */
|
|
43
|
+
evmCrossChainWallet?: string;
|
|
37
44
|
network: string;
|
|
38
45
|
description?: string;
|
|
39
46
|
websiteUrl?: string;
|
|
@@ -45,6 +52,10 @@ interface UpdateApiInput {
|
|
|
45
52
|
description?: string;
|
|
46
53
|
baseUrl?: string;
|
|
47
54
|
merchantWallet?: string;
|
|
55
|
+
/** Solana wallet for cross-chain payments. Set to null to remove. */
|
|
56
|
+
solanaWallet?: string | null;
|
|
57
|
+
/** EVM wallet for cross-chain payments. Set to null to remove. */
|
|
58
|
+
evmCrossChainWallet?: string | null;
|
|
48
59
|
websiteUrl?: string;
|
|
49
60
|
logoUrl?: string;
|
|
50
61
|
}
|
package/dist/management.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/management.ts"],"sourcesContent":["// src/management.ts\n// RelAI Management API client — create and manage monetised APIs programmatically.\n// Docs: https://relai.fi/documentation/management-api\n\nconst RELAI_API_BASE = 'https://api.relai.fi';\nconst BOOTSTRAP_URL = `${RELAI_API_BASE}/mcp/management/bootstrap/agent`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ManagementClientConfig {\n /** Service key (sk_live_...) for authenticating management API calls */\n serviceKey: string;\n /** Override base URL (default: https://api.relai.fi) */\n baseUrl?: string;\n}\n\nexport interface RelaiApi {\n apiId: string;\n name: string;\n description?: string;\n baseUrl: string;\n subdomain?: string | null;\n network: string;\n facilitator: string;\n x402Version: number;\n status: string;\n merchantWallet: string;\n websiteUrl?: string;\n logoUrl?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ApiEndpointInput {\n path: string;\n method: string;\n usdPrice: number;\n enabled?: boolean;\n}\n\nexport interface ApiEndpoint extends ApiEndpointInput {\n network: string;\n enabled: boolean;\n}\n\nexport interface CreateApiInput {\n name: string;\n baseUrl: string;\n merchantWallet: string;\n network: string;\n description?: string;\n websiteUrl?: string;\n logoUrl?: string;\n endpoints?: ApiEndpointInput[];\n}\n\nexport interface UpdateApiInput {\n name?: string;\n description?: string;\n baseUrl?: string;\n merchantWallet?: string;\n websiteUrl?: string;\n logoUrl?: string;\n}\n\nexport interface ApiStats {\n apiId: string;\n totalRequests: number;\n totalRevenue: number;\n currency: string;\n}\n\nexport interface ApiPayment {\n transaction: string;\n path: string;\n method: string;\n amount: number;\n currency: string;\n network: string;\n status: string;\n success: boolean;\n payer: string;\n createdAt: string;\n}\n\nexport interface ApiPaymentsResult {\n apiId: string;\n payments: ApiPayment[];\n nextCursor: string | null;\n}\n\nexport interface ApiLogItem {\n id: string;\n timestamp: string;\n method: string;\n path: string;\n status: string;\n cost: number;\n currency: string;\n duration: number;\n transaction: string;\n network: string;\n success: boolean;\n payer: string;\n}\n\nexport interface ApiLogsResult {\n items: ApiLogItem[];\n nextCursor: string | null;\n}\n\nexport interface AgentBootstrapResult {\n key: string;\n label: string;\n active: boolean;\n createdAt: string;\n}\n\n// ============================================================================\n// Agent bootstrap (autonomous key provisioning)\n// ============================================================================\n\n/**\n * Bootstrap a service key for a Solana agent.\n * Run once — store the returned key securely.\n *\n * @param keypair A Solana Keypair (from @solana/web3.js)\n * @param label Human-readable label for the key\n */\nexport async function bootstrapAgentKeySolana(\n keypair: { publicKey: { toBase58(): string }; secretKey: Uint8Array },\n label = 'agent',\n): Promise<AgentBootstrapResult> {\n const { sign } = await import('tweetnacl');\n\n const publicKey = keypair.publicKey.toBase58();\n\n // Step 1 — request challenge\n const challengeRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey }),\n });\n if (!challengeRes.ok) throw new Error(`Challenge request failed: ${challengeRes.status}`);\n const { message } = await challengeRes.json() as { message: string };\n\n // Step 2 — sign\n const msgBytes = new TextEncoder().encode(message);\n const sigBytes = sign.detached(msgBytes, keypair.secretKey);\n const signature = Buffer.from(sigBytes).toString('base64');\n\n // Step 3 — get service key\n const keyRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey, signature, message, label }),\n });\n if (!keyRes.ok) throw new Error(`Key provisioning failed: ${keyRes.status}`);\n return keyRes.json() as Promise<AgentBootstrapResult>;\n}\n\n/**\n * Bootstrap a service key for an EVM agent.\n * Run once — store the returned key securely.\n *\n * @param wallet An ethers.js Wallet or Signer with address + signMessage\n * @param label Human-readable label for the key\n */\nexport async function bootstrapAgentKeyEvm(\n wallet: { address: string; signMessage(message: string): Promise<string> },\n label = 'agent',\n): Promise<AgentBootstrapResult> {\n const publicKey = wallet.address;\n\n // Step 1 — request challenge\n const challengeRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey }),\n });\n if (!challengeRes.ok) throw new Error(`Challenge request failed: ${challengeRes.status}`);\n const { message } = await challengeRes.json() as { message: string };\n\n // Step 2+3 — sign and get key\n const signature = await wallet.signMessage(message);\n const keyRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey, signature, message, label }),\n });\n if (!keyRes.ok) throw new Error(`Key provisioning failed: ${keyRes.status}`);\n return keyRes.json() as Promise<AgentBootstrapResult>;\n}\n\n// ============================================================================\n// Management client\n// ============================================================================\n\nexport interface RelaiManagementClient {\n // APIs\n createApi(input: CreateApiInput): Promise<RelaiApi>;\n listApis(): Promise<RelaiApi[]>;\n getApi(apiId: string): Promise<RelaiApi>;\n updateApi(apiId: string, input: UpdateApiInput): Promise<RelaiApi>;\n deleteApi(apiId: string): Promise<{ success: boolean; apiId: string }>;\n\n // Pricing\n getPricing(apiId: string): Promise<{ apiId: string; endpoints: ApiEndpoint[] }>;\n setPricing(apiId: string, endpoints: ApiEndpointInput[]): Promise<{ success: boolean; apiId: string; updated: number }>;\n\n // Analytics\n getStats(apiId: string): Promise<ApiStats>;\n getPayments(apiId: string, options?: { limit?: number; from?: string; cursor?: string }): Promise<ApiPaymentsResult>;\n getLogs(apiId: string, options?: { limit?: number; from?: string; cursor?: string }): Promise<ApiLogsResult>;\n}\n\n/**\n * Create a RelAI Management API client.\n *\n * @example\n * ```typescript\n * import { createManagementClient } from '@relai-fi/x402/management';\n *\n * const mgmt = createManagementClient({ serviceKey: process.env.RELAI_SERVICE_KEY! });\n *\n * const api = await mgmt.createApi({\n * name: 'My ML API',\n * baseUrl: 'https://inference.example.com',\n * merchantWallet: '0xYourWallet',\n * network: 'base',\n * endpoints: [{ path: '/v1/predict', method: 'post', usdPrice: 0.05 }],\n * });\n * ```\n */\nexport function createManagementClient(config: ManagementClientConfig): RelaiManagementClient {\n const base = (config.baseUrl ?? RELAI_API_BASE).replace(/\\/$/, '');\n const headers = {\n 'X-Service-Key': config.serviceKey,\n 'Content-Type': 'application/json',\n };\n\n async function req<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`[relai-mgmt] ${method} ${path} → ${res.status}: ${text}`);\n }\n return res.json() as Promise<T>;\n }\n\n return {\n // ── APIs ──────────────────────────────────────────────────────────────\n\n createApi(input) {\n return req<RelaiApi>('POST', '/v1/apis', input);\n },\n\n async listApis() {\n const data = await req<{ apis: RelaiApi[] }>('GET', '/v1/apis');\n return data.apis;\n },\n\n getApi(apiId) {\n return req<RelaiApi>('GET', `/v1/apis/${apiId}`);\n },\n\n updateApi(apiId, input) {\n return req<RelaiApi>('PATCH', `/v1/apis/${apiId}`, input);\n },\n\n deleteApi(apiId) {\n return req<{ success: boolean; apiId: string }>('DELETE', `/v1/apis/${apiId}`);\n },\n\n // ── Pricing ──────────────────────────────────────────────────────────\n\n getPricing(apiId) {\n return req<{ apiId: string; endpoints: ApiEndpoint[] }>('GET', `/v1/apis/${apiId}/pricing`);\n },\n\n setPricing(apiId, endpoints) {\n return req<{ success: boolean; apiId: string; updated: number }>('PUT', `/v1/apis/${apiId}/pricing`, { endpoints });\n },\n\n // ── Analytics ────────────────────────────────────────────────────────\n\n getStats(apiId) {\n return req<ApiStats>('GET', `/v1/apis/${apiId}/stats`);\n },\n\n getPayments(apiId, options = {}) {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.from) params.set('from', options.from);\n if (options.cursor) params.set('cursor', options.cursor);\n const qs = params.toString() ? `?${params}` : '';\n return req<ApiPaymentsResult>('GET', `/v1/apis/${apiId}/payments${qs}`);\n },\n\n getLogs(apiId, options = {}) {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.from) params.set('from', options.from);\n if (options.cursor) params.set('cursor', options.cursor);\n const qs = params.toString() ? `?${params}` : '';\n return req<ApiLogsResult>('GET', `/v1/apis/${apiId}/logs${qs}`);\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/management.ts"],"sourcesContent":["// src/management.ts\n// RelAI Management API client — create and manage monetised APIs programmatically.\n// Docs: https://relai.fi/documentation/management-api\n\nconst RELAI_API_BASE = 'https://api.relai.fi';\nconst BOOTSTRAP_URL = `${RELAI_API_BASE}/mcp/management/bootstrap/agent`;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ManagementClientConfig {\n /** Service key (sk_live_...) for authenticating management API calls */\n serviceKey: string;\n /** Override base URL (default: https://api.relai.fi) */\n baseUrl?: string;\n}\n\nexport interface RelaiApi {\n apiId: string;\n name: string;\n description?: string;\n baseUrl: string;\n subdomain?: string | null;\n network: string;\n facilitator: string;\n x402Version: number;\n status: string;\n merchantWallet: string;\n solanaWallet?: string | null;\n /** EVM wallet for cross-chain payments. Only relevant when network is Solana. */\n evmCrossChainWallet?: string | null;\n websiteUrl?: string;\n logoUrl?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ApiEndpointInput {\n path: string;\n method: string;\n usdPrice: number;\n enabled?: boolean;\n}\n\nexport interface ApiEndpoint extends ApiEndpointInput {\n network: string;\n enabled: boolean;\n}\n\nexport interface CreateApiInput {\n name: string;\n baseUrl: string;\n merchantWallet: string;\n /** Solana wallet for cross-chain payments. Only relevant when network is EVM. */\n solanaWallet?: string;\n /** EVM wallet for cross-chain payments. Only relevant when network is Solana. */\n evmCrossChainWallet?: string;\n network: string;\n description?: string;\n websiteUrl?: string;\n logoUrl?: string;\n endpoints?: ApiEndpointInput[];\n}\n\nexport interface UpdateApiInput {\n name?: string;\n description?: string;\n baseUrl?: string;\n merchantWallet?: string;\n /** Solana wallet for cross-chain payments. Set to null to remove. */\n solanaWallet?: string | null;\n /** EVM wallet for cross-chain payments. Set to null to remove. */\n evmCrossChainWallet?: string | null;\n websiteUrl?: string;\n logoUrl?: string;\n}\n\nexport interface ApiStats {\n apiId: string;\n totalRequests: number;\n totalRevenue: number;\n currency: string;\n}\n\nexport interface ApiPayment {\n transaction: string;\n path: string;\n method: string;\n amount: number;\n currency: string;\n network: string;\n status: string;\n success: boolean;\n payer: string;\n createdAt: string;\n}\n\nexport interface ApiPaymentsResult {\n apiId: string;\n payments: ApiPayment[];\n nextCursor: string | null;\n}\n\nexport interface ApiLogItem {\n id: string;\n timestamp: string;\n method: string;\n path: string;\n status: string;\n cost: number;\n currency: string;\n duration: number;\n transaction: string;\n network: string;\n success: boolean;\n payer: string;\n}\n\nexport interface ApiLogsResult {\n items: ApiLogItem[];\n nextCursor: string | null;\n}\n\nexport interface AgentBootstrapResult {\n key: string;\n label: string;\n active: boolean;\n createdAt: string;\n}\n\n// ============================================================================\n// Agent bootstrap (autonomous key provisioning)\n// ============================================================================\n\n/**\n * Bootstrap a service key for a Solana agent.\n * Run once — store the returned key securely.\n *\n * @param keypair A Solana Keypair (from @solana/web3.js)\n * @param label Human-readable label for the key\n */\nexport async function bootstrapAgentKeySolana(\n keypair: { publicKey: { toBase58(): string }; secretKey: Uint8Array },\n label = 'agent',\n): Promise<AgentBootstrapResult> {\n const { sign } = await import('tweetnacl');\n\n const publicKey = keypair.publicKey.toBase58();\n\n // Step 1 — request challenge\n const challengeRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey }),\n });\n if (!challengeRes.ok) throw new Error(`Challenge request failed: ${challengeRes.status}`);\n const { message } = await challengeRes.json() as { message: string };\n\n // Step 2 — sign\n const msgBytes = new TextEncoder().encode(message);\n const sigBytes = sign.detached(msgBytes, keypair.secretKey);\n const signature = Buffer.from(sigBytes).toString('base64');\n\n // Step 3 — get service key\n const keyRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey, signature, message, label }),\n });\n if (!keyRes.ok) throw new Error(`Key provisioning failed: ${keyRes.status}`);\n return keyRes.json() as Promise<AgentBootstrapResult>;\n}\n\n/**\n * Bootstrap a service key for an EVM agent.\n * Run once — store the returned key securely.\n *\n * @param wallet An ethers.js Wallet or Signer with address + signMessage\n * @param label Human-readable label for the key\n */\nexport async function bootstrapAgentKeyEvm(\n wallet: { address: string; signMessage(message: string): Promise<string> },\n label = 'agent',\n): Promise<AgentBootstrapResult> {\n const publicKey = wallet.address;\n\n // Step 1 — request challenge\n const challengeRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey }),\n });\n if (!challengeRes.ok) throw new Error(`Challenge request failed: ${challengeRes.status}`);\n const { message } = await challengeRes.json() as { message: string };\n\n // Step 2+3 — sign and get key\n const signature = await wallet.signMessage(message);\n const keyRes = await fetch(BOOTSTRAP_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ publicKey, signature, message, label }),\n });\n if (!keyRes.ok) throw new Error(`Key provisioning failed: ${keyRes.status}`);\n return keyRes.json() as Promise<AgentBootstrapResult>;\n}\n\n// ============================================================================\n// Management client\n// ============================================================================\n\nexport interface RelaiManagementClient {\n // APIs\n createApi(input: CreateApiInput): Promise<RelaiApi>;\n listApis(): Promise<RelaiApi[]>;\n getApi(apiId: string): Promise<RelaiApi>;\n updateApi(apiId: string, input: UpdateApiInput): Promise<RelaiApi>;\n deleteApi(apiId: string): Promise<{ success: boolean; apiId: string }>;\n\n // Pricing\n getPricing(apiId: string): Promise<{ apiId: string; endpoints: ApiEndpoint[] }>;\n setPricing(apiId: string, endpoints: ApiEndpointInput[]): Promise<{ success: boolean; apiId: string; updated: number }>;\n\n // Analytics\n getStats(apiId: string): Promise<ApiStats>;\n getPayments(apiId: string, options?: { limit?: number; from?: string; cursor?: string }): Promise<ApiPaymentsResult>;\n getLogs(apiId: string, options?: { limit?: number; from?: string; cursor?: string }): Promise<ApiLogsResult>;\n}\n\n/**\n * Create a RelAI Management API client.\n *\n * @example\n * ```typescript\n * import { createManagementClient } from '@relai-fi/x402/management';\n *\n * const mgmt = createManagementClient({ serviceKey: process.env.RELAI_SERVICE_KEY! });\n *\n * const api = await mgmt.createApi({\n * name: 'My ML API',\n * baseUrl: 'https://inference.example.com',\n * merchantWallet: '0xYourWallet',\n * network: 'base',\n * endpoints: [{ path: '/v1/predict', method: 'post', usdPrice: 0.05 }],\n * });\n * ```\n */\nexport function createManagementClient(config: ManagementClientConfig): RelaiManagementClient {\n const base = (config.baseUrl ?? RELAI_API_BASE).replace(/\\/$/, '');\n const headers = {\n 'X-Service-Key': config.serviceKey,\n 'Content-Type': 'application/json',\n };\n\n async function req<T>(method: string, path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${base}${path}`, {\n method,\n headers,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`[relai-mgmt] ${method} ${path} → ${res.status}: ${text}`);\n }\n return res.json() as Promise<T>;\n }\n\n return {\n // ── APIs ──────────────────────────────────────────────────────────────\n\n createApi(input) {\n return req<RelaiApi>('POST', '/v1/apis', input);\n },\n\n async listApis() {\n const data = await req<{ apis: RelaiApi[] }>('GET', '/v1/apis');\n return data.apis;\n },\n\n getApi(apiId) {\n return req<RelaiApi>('GET', `/v1/apis/${apiId}`);\n },\n\n updateApi(apiId, input) {\n return req<RelaiApi>('PATCH', `/v1/apis/${apiId}`, input);\n },\n\n deleteApi(apiId) {\n return req<{ success: boolean; apiId: string }>('DELETE', `/v1/apis/${apiId}`);\n },\n\n // ── Pricing ──────────────────────────────────────────────────────────\n\n getPricing(apiId) {\n return req<{ apiId: string; endpoints: ApiEndpoint[] }>('GET', `/v1/apis/${apiId}/pricing`);\n },\n\n setPricing(apiId, endpoints) {\n return req<{ success: boolean; apiId: string; updated: number }>('PUT', `/v1/apis/${apiId}/pricing`, { endpoints });\n },\n\n // ── Analytics ────────────────────────────────────────────────────────\n\n getStats(apiId) {\n return req<ApiStats>('GET', `/v1/apis/${apiId}/stats`);\n },\n\n getPayments(apiId, options = {}) {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.from) params.set('from', options.from);\n if (options.cursor) params.set('cursor', options.cursor);\n const qs = params.toString() ? `?${params}` : '';\n return req<ApiPaymentsResult>('GET', `/v1/apis/${apiId}/payments${qs}`);\n },\n\n getLogs(apiId, options = {}) {\n const params = new URLSearchParams();\n if (options.limit) params.set('limit', String(options.limit));\n if (options.from) params.set('from', options.from);\n if (options.cursor) params.set('cursor', options.cursor);\n const qs = params.toString() ? `?${params}` : '';\n return req<ApiLogsResult>('GET', `/v1/apis/${apiId}/logs${qs}`);\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relai-fi/x402",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.27",
|
|
4
4
|
"description": "Unified x402 payment SDK for Solana, Base, Avalanche, SKALE Base, SKALE BITE, Polygon, and Ethereum. Automatic 402 handling with zero gas fees.",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|