@aura-payments/sdk 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +5 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +22 -21
- package/dist/index.mjs +20 -19
- package/package.json +14 -2
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.d.mts
CHANGED
|
@@ -1093,7 +1093,11 @@ declare class Webhooks {
|
|
|
1093
1093
|
*/
|
|
1094
1094
|
private static computeHmacSignature;
|
|
1095
1095
|
/**
|
|
1096
|
-
* Constant-time
|
|
1096
|
+
* Constant-time comparison of two hex signatures.
|
|
1097
|
+
*
|
|
1098
|
+
* Length is compared first because `timingSafeEqual` throws on mismatched
|
|
1099
|
+
* buffers; that only reveals the length of an attacker-supplied signature,
|
|
1100
|
+
* never the contents of the expected one.
|
|
1097
1101
|
*/
|
|
1098
1102
|
private static secureCompare;
|
|
1099
1103
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1093,7 +1093,11 @@ declare class Webhooks {
|
|
|
1093
1093
|
*/
|
|
1094
1094
|
private static computeHmacSignature;
|
|
1095
1095
|
/**
|
|
1096
|
-
* Constant-time
|
|
1096
|
+
* Constant-time comparison of two hex signatures.
|
|
1097
|
+
*
|
|
1098
|
+
* Length is compared first because `timingSafeEqual` throws on mismatched
|
|
1099
|
+
* buffers; that only reveals the length of an attacker-supplied signature,
|
|
1100
|
+
* never the contents of the expected one.
|
|
1097
1101
|
*/
|
|
1098
1102
|
private static secureCompare;
|
|
1099
1103
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var crypto
|
|
3
|
+
var crypto = require('crypto');
|
|
4
4
|
|
|
5
5
|
// src/errors.ts
|
|
6
6
|
var AuraError = class _AuraError extends Error {
|
|
@@ -238,12 +238,17 @@ async function retryWithBackoff(fn, maxRetries = 3, shouldRetry = isRetryableErr
|
|
|
238
238
|
throw lastError;
|
|
239
239
|
}
|
|
240
240
|
async function withTimeout(promise, timeoutMs, timeoutMessage) {
|
|
241
|
+
let timer;
|
|
241
242
|
const timeoutPromise = new Promise((_, reject) => {
|
|
242
|
-
setTimeout(() => {
|
|
243
|
+
timer = setTimeout(() => {
|
|
243
244
|
reject(new AuraTimeoutError(timeoutMessage || `Request timeout after ${timeoutMs}ms`));
|
|
244
245
|
}, timeoutMs);
|
|
245
246
|
});
|
|
246
|
-
|
|
247
|
+
try {
|
|
248
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
249
|
+
} finally {
|
|
250
|
+
if (timer) clearTimeout(timer);
|
|
251
|
+
}
|
|
247
252
|
}
|
|
248
253
|
|
|
249
254
|
// src/resources/escrows.ts
|
|
@@ -543,7 +548,7 @@ var Mandates = class {
|
|
|
543
548
|
var MandateSignature = {
|
|
544
549
|
compute(input) {
|
|
545
550
|
const payload = `${input.mandateId}:${input.decision}:${input.decidedAt}`;
|
|
546
|
-
return crypto
|
|
551
|
+
return crypto.createHmac("sha256", input.secret).update(payload).digest("hex");
|
|
547
552
|
},
|
|
548
553
|
verify(input) {
|
|
549
554
|
const expected = MandateSignature.compute({
|
|
@@ -782,23 +787,22 @@ var Webhooks = class {
|
|
|
782
787
|
* Compute HMAC-SHA256 signature
|
|
783
788
|
*/
|
|
784
789
|
static computeHmacSignature(payload, secret) {
|
|
785
|
-
|
|
786
|
-
throw new Error("Web Crypto implementation needed for browser");
|
|
787
|
-
}
|
|
788
|
-
return crypto$1.createHmac("sha256", secret).update(payload).digest("hex");
|
|
790
|
+
return crypto.createHmac("sha256", secret).update(payload).digest("hex");
|
|
789
791
|
}
|
|
790
792
|
/**
|
|
791
|
-
* Constant-time
|
|
793
|
+
* Constant-time comparison of two hex signatures.
|
|
794
|
+
*
|
|
795
|
+
* Length is compared first because `timingSafeEqual` throws on mismatched
|
|
796
|
+
* buffers; that only reveals the length of an attacker-supplied signature,
|
|
797
|
+
* never the contents of the expected one.
|
|
792
798
|
*/
|
|
793
799
|
static secureCompare(a, b) {
|
|
794
|
-
|
|
800
|
+
const left = Buffer.from(a, "utf8");
|
|
801
|
+
const right = Buffer.from(b, "utf8");
|
|
802
|
+
if (left.length !== right.length) {
|
|
795
803
|
return false;
|
|
796
804
|
}
|
|
797
|
-
|
|
798
|
-
for (let i = 0; i < a.length; i++) {
|
|
799
|
-
result |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
800
|
-
}
|
|
801
|
-
return result === 0;
|
|
805
|
+
return crypto.timingSafeEqual(left, right);
|
|
802
806
|
}
|
|
803
807
|
};
|
|
804
808
|
|
|
@@ -862,7 +866,8 @@ var AuraClient = class _AuraClient {
|
|
|
862
866
|
* Make an authenticated request to the API with automatic retry logic
|
|
863
867
|
*/
|
|
864
868
|
async request(method, path, body, options) {
|
|
865
|
-
const
|
|
869
|
+
const idempotencyKey = options?.idempotencyKey ?? (this.autoIdempotency && (method === "POST" || method === "PUT") ? generateIdempotencyKey() : void 0);
|
|
870
|
+
const requestFn = () => this.executeRequest(method, path, body, { ...options, idempotencyKey });
|
|
866
871
|
if (options?.skipRetry || method === "GET") {
|
|
867
872
|
return requestFn();
|
|
868
873
|
}
|
|
@@ -876,12 +881,10 @@ var AuraClient = class _AuraClient {
|
|
|
876
881
|
const headers = {
|
|
877
882
|
"Content-Type": "application/json",
|
|
878
883
|
"Authorization": `Bearer ${this.apiKey}`,
|
|
879
|
-
"User-Agent": "@aura-payments/sdk/2.1.
|
|
884
|
+
"User-Agent": "@aura-payments/sdk/2.1.1"
|
|
880
885
|
};
|
|
881
886
|
if (options?.idempotencyKey) {
|
|
882
887
|
headers["Idempotency-Key"] = options.idempotencyKey;
|
|
883
|
-
} else if (this.autoIdempotency && (method === "POST" || method === "PUT")) {
|
|
884
|
-
headers["Idempotency-Key"] = generateIdempotencyKey();
|
|
885
888
|
}
|
|
886
889
|
try {
|
|
887
890
|
const response = await withTimeout(
|
|
@@ -1009,5 +1012,3 @@ exports.isAuraTimeoutError = isAuraTimeoutError;
|
|
|
1009
1012
|
exports.isRetryableError = isRetryableError;
|
|
1010
1013
|
exports.retryWithBackoff = retryWithBackoff;
|
|
1011
1014
|
exports.withTimeout = withTimeout;
|
|
1012
|
-
//# sourceMappingURL=index.js.map
|
|
1013
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createHmac } from 'crypto';
|
|
1
|
+
import { createHmac, timingSafeEqual } from 'crypto';
|
|
2
2
|
|
|
3
3
|
// src/errors.ts
|
|
4
4
|
var AuraError = class _AuraError extends Error {
|
|
@@ -236,12 +236,17 @@ async function retryWithBackoff(fn, maxRetries = 3, shouldRetry = isRetryableErr
|
|
|
236
236
|
throw lastError;
|
|
237
237
|
}
|
|
238
238
|
async function withTimeout(promise, timeoutMs, timeoutMessage) {
|
|
239
|
+
let timer;
|
|
239
240
|
const timeoutPromise = new Promise((_, reject) => {
|
|
240
|
-
setTimeout(() => {
|
|
241
|
+
timer = setTimeout(() => {
|
|
241
242
|
reject(new AuraTimeoutError(timeoutMessage || `Request timeout after ${timeoutMs}ms`));
|
|
242
243
|
}, timeoutMs);
|
|
243
244
|
});
|
|
244
|
-
|
|
245
|
+
try {
|
|
246
|
+
return await Promise.race([promise, timeoutPromise]);
|
|
247
|
+
} finally {
|
|
248
|
+
if (timer) clearTimeout(timer);
|
|
249
|
+
}
|
|
245
250
|
}
|
|
246
251
|
|
|
247
252
|
// src/resources/escrows.ts
|
|
@@ -780,23 +785,22 @@ var Webhooks = class {
|
|
|
780
785
|
* Compute HMAC-SHA256 signature
|
|
781
786
|
*/
|
|
782
787
|
static computeHmacSignature(payload, secret) {
|
|
783
|
-
if (typeof crypto !== "undefined" && crypto.subtle) {
|
|
784
|
-
throw new Error("Web Crypto implementation needed for browser");
|
|
785
|
-
}
|
|
786
788
|
return createHmac("sha256", secret).update(payload).digest("hex");
|
|
787
789
|
}
|
|
788
790
|
/**
|
|
789
|
-
* Constant-time
|
|
791
|
+
* Constant-time comparison of two hex signatures.
|
|
792
|
+
*
|
|
793
|
+
* Length is compared first because `timingSafeEqual` throws on mismatched
|
|
794
|
+
* buffers; that only reveals the length of an attacker-supplied signature,
|
|
795
|
+
* never the contents of the expected one.
|
|
790
796
|
*/
|
|
791
797
|
static secureCompare(a, b) {
|
|
792
|
-
|
|
798
|
+
const left = Buffer.from(a, "utf8");
|
|
799
|
+
const right = Buffer.from(b, "utf8");
|
|
800
|
+
if (left.length !== right.length) {
|
|
793
801
|
return false;
|
|
794
802
|
}
|
|
795
|
-
|
|
796
|
-
for (let i = 0; i < a.length; i++) {
|
|
797
|
-
result |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
798
|
-
}
|
|
799
|
-
return result === 0;
|
|
803
|
+
return timingSafeEqual(left, right);
|
|
800
804
|
}
|
|
801
805
|
};
|
|
802
806
|
|
|
@@ -860,7 +864,8 @@ var AuraClient = class _AuraClient {
|
|
|
860
864
|
* Make an authenticated request to the API with automatic retry logic
|
|
861
865
|
*/
|
|
862
866
|
async request(method, path, body, options) {
|
|
863
|
-
const
|
|
867
|
+
const idempotencyKey = options?.idempotencyKey ?? (this.autoIdempotency && (method === "POST" || method === "PUT") ? generateIdempotencyKey() : void 0);
|
|
868
|
+
const requestFn = () => this.executeRequest(method, path, body, { ...options, idempotencyKey });
|
|
864
869
|
if (options?.skipRetry || method === "GET") {
|
|
865
870
|
return requestFn();
|
|
866
871
|
}
|
|
@@ -874,12 +879,10 @@ var AuraClient = class _AuraClient {
|
|
|
874
879
|
const headers = {
|
|
875
880
|
"Content-Type": "application/json",
|
|
876
881
|
"Authorization": `Bearer ${this.apiKey}`,
|
|
877
|
-
"User-Agent": "@aura-payments/sdk/2.1.
|
|
882
|
+
"User-Agent": "@aura-payments/sdk/2.1.1"
|
|
878
883
|
};
|
|
879
884
|
if (options?.idempotencyKey) {
|
|
880
885
|
headers["Idempotency-Key"] = options.idempotencyKey;
|
|
881
|
-
} else if (this.autoIdempotency && (method === "POST" || method === "PUT")) {
|
|
882
|
-
headers["Idempotency-Key"] = generateIdempotencyKey();
|
|
883
886
|
}
|
|
884
887
|
try {
|
|
885
888
|
const response = await withTimeout(
|
|
@@ -981,5 +984,3 @@ var AuraClient = class _AuraClient {
|
|
|
981
984
|
};
|
|
982
985
|
|
|
983
986
|
export { Agents, AuraAPIError, AuraAuthenticationError, AuraClient, AuraError, AuraFaucetUnavailableError, AuraNetworkError, AuraNotFoundError, AuraRateLimitError, AuraTimeoutError, AuraValidationError, Escrows, MandateSignature, Mandates, Policies, Wallets, Webhooks, calculateBackoff, generateIdempotencyKey, isAuraAPIError, isAuraError, isAuraFaucetUnavailableError, isAuraNetworkError, isAuraTimeoutError, isRetryableError, retryWithBackoff, withTimeout };
|
|
984
|
-
//# sourceMappingURL=index.mjs.map
|
|
985
|
-
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aura-payments/sdk",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "TypeScript SDK for Aura Payments Platform",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -27,9 +27,21 @@
|
|
|
27
27
|
],
|
|
28
28
|
"author": "Aura Payments",
|
|
29
29
|
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/humancodex/ap.git",
|
|
33
|
+
"directory": "packages/sdk"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://getaura.sh",
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/humancodex/ap/issues"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=20.0.0"
|
|
41
|
+
},
|
|
30
42
|
"dependencies": {
|
|
31
43
|
"zod": "^3.25.76",
|
|
32
|
-
"@aura-payments/shared": "2.0.
|
|
44
|
+
"@aura-payments/shared": "2.0.1"
|
|
33
45
|
},
|
|
34
46
|
"devDependencies": {
|
|
35
47
|
"@types/jest": "^29.5.0",
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/resources/agents.ts","../src/utils.ts","../src/resources/escrows.ts","../src/resources/mandates.ts","../src/resources/policies.ts","../src/resources/wallets.ts","../src/resources/webhooks.ts","../src/client.ts"],"names":["sleep","createHmac"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Custom error classes for Aura Payments SDK\n */\n\nexport class AuraError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n public readonly statusCode?: number,\n public readonly details?: unknown\n ) {\n super(message)\n this.name = 'AuraError'\n Object.setPrototypeOf(this, AuraError.prototype)\n }\n}\n\nexport class AuraAPIError extends AuraError {\n constructor(\n message: string,\n statusCode: number,\n code?: string,\n details?: unknown\n ) {\n super(message, code, statusCode, details)\n this.name = 'AuraAPIError'\n Object.setPrototypeOf(this, AuraAPIError.prototype)\n }\n}\n\nexport class AuraNetworkError extends AuraError {\n constructor(message: string, public readonly cause?: Error) {\n super(message, 'NETWORK_ERROR')\n this.name = 'AuraNetworkError'\n Object.setPrototypeOf(this, AuraNetworkError.prototype)\n }\n}\n\nexport class AuraTimeoutError extends AuraError {\n constructor(message: string = 'Request timeout') {\n super(message, 'TIMEOUT')\n this.name = 'AuraTimeoutError'\n Object.setPrototypeOf(this, AuraTimeoutError.prototype)\n }\n}\n\nexport class AuraValidationError extends AuraError {\n constructor(message: string, details?: unknown) {\n super(message, 'VALIDATION_ERROR', 400, details)\n this.name = 'AuraValidationError'\n Object.setPrototypeOf(this, AuraValidationError.prototype)\n }\n}\n\nexport class AuraAuthenticationError extends AuraError {\n constructor(message: string = 'Authentication failed') {\n super(message, 'AUTHENTICATION_ERROR', 401)\n this.name = 'AuraAuthenticationError'\n Object.setPrototypeOf(this, AuraAuthenticationError.prototype)\n }\n}\n\nexport class AuraNotFoundError extends AuraError {\n constructor(resource: string) {\n super(`${resource} not found`, 'NOT_FOUND', 404)\n this.name = 'AuraNotFoundError'\n Object.setPrototypeOf(this, AuraNotFoundError.prototype)\n }\n}\n\nexport class AuraRateLimitError extends AuraError {\n constructor(\n message: string = 'Rate limit exceeded',\n public readonly retryAfter?: number\n ) {\n super(message, 'RATE_LIMIT_EXCEEDED', 429)\n this.name = 'AuraRateLimitError'\n Object.setPrototypeOf(this, AuraRateLimitError.prototype)\n }\n}\n\n/**\n * Thrown when the testnet faucet endpoint is not available on the target\n * deployment. The faucet (`POST /v1/wallets/:id/faucet`) is provided by the\n * platform (AURA-010); until it ships, `wallets.requestTestnetFunds()`\n * capability-probes and raises this typed error instead of a generic 404/501,\n * so callers can degrade gracefully (e.g. prompt for manual funding).\n */\nexport class AuraFaucetUnavailableError extends AuraError {\n constructor(\n message: string = 'Testnet faucet is not available on this deployment'\n ) {\n super(message, 'FAUCET_UNAVAILABLE', 501)\n this.name = 'AuraFaucetUnavailableError'\n Object.setPrototypeOf(this, AuraFaucetUnavailableError.prototype)\n }\n}\n\n/**\n * Type guards for error handling\n */\nexport function isAuraError(error: unknown): error is AuraError {\n return error instanceof AuraError\n}\n\nexport function isAuraFaucetUnavailableError(\n error: unknown\n): error is AuraFaucetUnavailableError {\n return error instanceof AuraFaucetUnavailableError\n}\n\nexport function isAuraAPIError(error: unknown): error is AuraAPIError {\n return error instanceof AuraAPIError\n}\n\nexport function isAuraNetworkError(error: unknown): error is AuraNetworkError {\n return error instanceof AuraNetworkError\n}\n\nexport function isAuraTimeoutError(error: unknown): error is AuraTimeoutError {\n return error instanceof AuraTimeoutError\n}\n\nexport function isRetryableError(error: unknown): boolean {\n if (!(error instanceof AuraError)) return false\n\n // Network errors are retryable\n if (error instanceof AuraNetworkError) return true\n\n // Timeout errors are retryable\n if (error instanceof AuraTimeoutError) return true\n\n // 429 rate limit errors are retryable\n if (error instanceof AuraRateLimitError) return true\n\n // 5xx server errors are retryable\n if (error.statusCode && error.statusCode >= 500) {\n return true\n }\n\n return false\n}\n","/**\n * Agents resource for the Aura Payments SDK.\n *\n * Wraps `/v1/agents/*` routes: create, list, get, update, freeze, unfreeze,\n * balance, evaluate. All methods are account-scoped via the API key — the\n * platform extracts `accountId` server-side; the SDK never sends it.\n */\n\nimport type { AuraClient } from '../client'\nimport type {\n Agent,\n AgentBalance,\n AgentStatusResponse,\n CreateAgentParams,\n CreateAgentResponse,\n EvaluatePolicyParams,\n EvaluatePolicyResponse,\n FreezeAgentParams,\n ListAgentsParams,\n ListAgentsResponse,\n UnfreezeAgentParams,\n UpdateAgentParams,\n} from '../types/agent'\n\nexport class Agents {\n constructor(private client: AuraClient) {}\n\n /**\n * Create a new AI agent with a dedicated wallet and (optional) initial\n * policy. The platform provisions a Circle wallet on the requested chain\n * during this call; expect a few seconds of latency for the on-chain part.\n */\n async create(\n params: CreateAgentParams,\n idempotencyKey?: string\n ): Promise<CreateAgentResponse> {\n return this.client['request']<CreateAgentResponse>(\n 'POST',\n '/v1/agents',\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * List agents for the authenticated account, paginated.\n */\n async list(params?: ListAgentsParams): Promise<ListAgentsResponse> {\n const query = new URLSearchParams()\n if (params?.status) query.set('status', params.status)\n if (params?.type) query.set('type', params.type)\n if (params?.limit !== undefined) query.set('limit', String(params.limit))\n if (params?.offset !== undefined) query.set('offset', String(params.offset))\n if (params?.orderBy) query.set('orderBy', params.orderBy)\n if (params?.orderDirection) query.set('orderDirection', params.orderDirection)\n\n const qs = query.toString()\n return this.client['request']<ListAgentsResponse>(\n 'GET',\n qs ? `/v1/agents?${qs}` : '/v1/agents'\n )\n }\n\n /**\n * Get a single agent by id.\n */\n async get(agentId: string): Promise<Agent> {\n return this.client['request']<Agent>('GET', `/v1/agents/${agentId}`)\n }\n\n /**\n * Patch an agent's metadata fields. Cannot be used to flip status — use\n * `freeze`/`unfreeze` for that so the mandate-cascade and activity events\n * fire correctly.\n */\n async update(\n agentId: string,\n params: UpdateAgentParams,\n idempotencyKey?: string\n ): Promise<Agent> {\n return this.client['request']<Agent>(\n 'PATCH',\n `/v1/agents/${agentId}`,\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Freeze (kill switch) — sets status to `paused` and cascade-rejects every\n * pending mandate the agent has in flight. Idempotent.\n */\n async freeze(\n params: FreezeAgentParams,\n idempotencyKey?: string\n ): Promise<AgentStatusResponse> {\n const { agentId, ...body } = params\n return this.client['request']<AgentStatusResponse>(\n 'POST',\n `/v1/agents/${agentId}/freeze`,\n body,\n { idempotencyKey }\n )\n }\n\n /**\n * Unfreeze — sets status back to `active`. Previously cascade-rejected\n * mandates are NOT restored; the agent re-creates them on its next loop.\n */\n async unfreeze(\n params: UnfreezeAgentParams,\n idempotencyKey?: string\n ): Promise<AgentStatusResponse> {\n const { agentId } = params\n return this.client['request']<AgentStatusResponse>(\n 'POST',\n `/v1/agents/${agentId}/unfreeze`,\n undefined,\n { idempotencyKey }\n )\n }\n\n /**\n * Get the agent's wallet balance (USDC, on-chain at request time).\n */\n async getBalance(agentId: string): Promise<AgentBalance> {\n return this.client['request']<AgentBalance>(\n 'GET',\n `/v1/agents/${agentId}/balance`\n )\n }\n\n /**\n * Run a hypothetical transaction through the policy engine without\n * executing it. Returns the engine's decision (`auto_approve`, `auto_deny`,\n * or `requires_human_approval`) along with the matched rules. When the\n * decision is `requires_human_approval`, the engine creates a mandate row\n * and returns its id so the caller can watch for the operator's decision.\n */\n async evaluate(\n params: EvaluatePolicyParams,\n idempotencyKey?: string\n ): Promise<EvaluatePolicyResponse> {\n const { agentId, ...body } = params\n return this.client['request']<EvaluatePolicyResponse>(\n 'POST',\n `/v1/agents/${agentId}/evaluate`,\n body,\n { idempotencyKey }\n )\n }\n}\n","/**\n * Utility functions for Aura Payments SDK\n */\n\nimport { AuraTimeoutError, isRetryableError } from './errors'\n\n/**\n * Generate a unique idempotency key\n * Format: timestamp-random\n */\nexport function generateIdempotencyKey(): string {\n const timestamp = Date.now()\n const random = Math.random().toString(36).substring(2, 15)\n return `${timestamp}-${random}`\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Calculate exponential backoff delay\n * @param attempt - The retry attempt number (0-based)\n * @param baseDelay - Base delay in milliseconds (default: 1000ms)\n * @param maxDelay - Maximum delay in milliseconds (default: 30000ms)\n * @returns Delay in milliseconds\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n maxDelay: number = 30000\n): number {\n // Exponential backoff: baseDelay * 2^attempt\n const exponentialDelay = baseDelay * Math.pow(2, attempt)\n\n // Add jitter (random 0-25%) to prevent thundering herd\n const jitter = exponentialDelay * Math.random() * 0.25\n\n // Cap at maxDelay\n return Math.min(exponentialDelay + jitter, maxDelay)\n}\n\n/**\n * Retry a function with exponential backoff\n * @param fn - The async function to retry\n * @param maxRetries - Maximum number of retry attempts\n * @param shouldRetry - Optional function to determine if error is retryable\n * @returns Promise with the function result\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n shouldRetry: (error: unknown) => boolean = isRetryableError\n): Promise<T> {\n let lastError: unknown\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n\n // If this is the last attempt, throw the error\n if (attempt === maxRetries) {\n throw error\n }\n\n // Check if the error is retryable\n if (!shouldRetry(error)) {\n throw error\n }\n\n // Calculate backoff delay\n const delay = calculateBackoff(attempt)\n\n // Wait before retrying\n await sleep(delay)\n }\n }\n\n // This should never be reached, but TypeScript requires it\n throw lastError\n}\n\n/**\n * Execute with timeout\n * @param promise - The promise to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param timeoutMessage - Optional timeout error message\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n timeoutMessage?: string\n): Promise<T> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new AuraTimeoutError(timeoutMessage || `Request timeout after ${timeoutMs}ms`))\n }, timeoutMs)\n })\n\n return Promise.race([promise, timeoutPromise])\n}\n","/**\n * Escrows resource for Aura Payments SDK\n */\n\nimport type { AuraClient } from '../client'\nimport { AuraValidationError } from '../errors'\nimport type {\n Escrow,\n CreateEscrowParams,\n CreateEscrowResponse,\n FundEscrowParams,\n ReleaseEscrowParams,\n RefundEscrowParams,\n ListEscrowsParams,\n ListEscrowsResponse,\n CreateDisputeParams,\n Dispute,\n ReceiveAndSplitParams,\n ReceiveAndSplitResult,\n} from '../types/escrow'\nimport { generateIdempotencyKey } from '../utils'\n\n/** An escrow is fundable once its contract is confirmed deployed. */\nfunction isEscrowDeployed(e: {\n state?: string\n blockchain?: { deployed?: boolean } | undefined\n}): boolean {\n if (e.blockchain?.deployed) return true\n return ['deployed', 'funded', 'locked', 'released'].includes(e.state ?? '')\n}\n\n/**\n * Funding is asynchronous on the platform: the fund endpoint returns 202 with a\n * pending transfer, and a Circle webhook later finalizes the escrow to\n * funded/locked. We must NOT release until the escrow reaches a settled,\n * releasable state.\n */\nfunction isEscrowFunded(e: { state?: string }): boolean {\n return ['funded', 'locked', 'released'].includes(e.state ?? '')\n}\n\n/** Parse a USDC string for a pre-flight comparison (NOT a settlement op). */\nfunction parseUsdc(value: string): number {\n const n = Number.parseFloat(value)\n return Number.isFinite(n) ? n : 0\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms))\n\nexport class Escrows {\n constructor(private client: AuraClient) {}\n\n /**\n * Create a new escrow\n */\n async create(params: CreateEscrowParams, idempotencyKey?: string): Promise<CreateEscrowResponse> {\n return this.client['request']<CreateEscrowResponse>(\n 'POST',\n '/v1/escrow/create',\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Get escrow by ID\n */\n async get(escrowId: string): Promise<Escrow> {\n return this.client['request']<Escrow>('GET', `/v1/escrow/${escrowId}`)\n }\n\n /**\n * List escrows with optional filters\n */\n async list(params?: ListEscrowsParams): Promise<ListEscrowsResponse> {\n const queryParams = new URLSearchParams()\n if (params?.search) queryParams.set('search', params.search)\n if (params?.state) queryParams.set('state', params.state)\n if (params?.sortBy) queryParams.set('sortBy', params.sortBy)\n if (params?.limit) queryParams.set('limit', params.limit.toString())\n if (params?.offset) queryParams.set('offset', params.offset.toString())\n\n const query = queryParams.toString()\n const path = query ? `/v1/escrow?${query}` : '/v1/escrow'\n\n return this.client['request']<ListEscrowsResponse>('GET', path)\n }\n\n /**\n * Fund an escrow\n */\n async fund(params: FundEscrowParams, idempotencyKey?: string): Promise<Escrow> {\n const { escrowId, ...body } = params\n return this.client['request']<Escrow>(\n 'POST',\n `/v1/escrow/${escrowId}/fund`,\n body,\n { idempotencyKey }\n )\n }\n\n /**\n * Release an escrow\n */\n async release(params: ReleaseEscrowParams, idempotencyKey?: string): Promise<Escrow> {\n const { escrowId, ...body } = params\n return this.client['request']<Escrow>(\n 'POST',\n `/v1/escrow/${escrowId}/release`,\n body,\n { idempotencyKey }\n )\n }\n\n /**\n * Refund an escrow\n */\n async refund(params: RefundEscrowParams, idempotencyKey?: string): Promise<Escrow> {\n return this.client['request']<Escrow>(\n 'POST',\n `/v1/escrow/refund`,\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Receive USDC and split it across recipients in a single call (board D4).\n *\n * Composes the existing, crash-safe escrow path:\n * create → poll-until-deployed → pre-flight balance → fund → poll-until-funded → release.\n *\n * Funds move from an Aura wallet owned by `payerOwnerId` (the agent itself or a\n * counterparty). The result's `stage` makes a partial run explicit:\n * - `created` — deployment didn't confirm within `waitForDeploymentMs`\n * - `deployed` — payer wallet lacks funds (see `fundingRequired`); no money moved\n * - `funded` — funded but not released (`autoRelease:false`, or funding didn't\n * settle within `waitForFundingMs` → `fundingPending: true`)\n * - `released` — split to recipients (happy path)\n *\n * Resume note: a partial run is resumed by acting on the returned\n * `escrow.escrowId` (call `fund`/`release` directly) — NOT by re-calling\n * `receiveAndSplit`, which re-`create`s and would hit a duplicate-orderId error.\n * Pass a stable `idempotencyKey` for retry-safe fund/release.\n *\n * Funding is asynchronous and the platform's fund/release endpoints return\n * operation metadata (not a full escrow), so this method re-`get`s the escrow\n * for authoritative state + splits rather than trusting those response bodies.\n *\n * @throws AuraValidationError if split percentages don't sum to 100 (pre-flight).\n */\n async receiveAndSplit(\n params: ReceiveAndSplitParams\n ): Promise<ReceiveAndSplitResult> {\n const {\n orderId,\n payerOwnerId,\n amount,\n splits,\n chain,\n actorId,\n autoRelease = true,\n waitForDeploymentMs = 60_000,\n waitForFundingMs = 60_000,\n pollIntervalMs = 2_000,\n idempotencyKey,\n } = params\n\n // Pre-flight: percentages must sum to exactly 100 (avoid a doomed create).\n const pctSum = splits.reduce((acc, s) => acc + s.percentage, 0)\n if (Math.round(pctSum * 100) !== 10_000) {\n throw new AuraValidationError(\n `Split percentages must sum to 100 (got ${pctSum}).`,\n { splits }\n )\n }\n\n // Derive stable idempotency keys from one run key so fund/release retries hit\n // the platform's replay cache instead of a fresh random key per attempt.\n // Callers wanting cross-invocation retry safety pass their own key.\n const runKey = idempotencyKey ?? generateIdempotencyKey()\n const pollMs = Math.max(pollIntervalMs, 250)\n\n // 1. Create the escrow (async deployment by default).\n const created = await this.create(\n { orderId, buyerOwnerId: payerOwnerId, amount, chain, splits },\n `${runKey}-create`\n )\n const escrowId = created.escrowId\n\n // 2. Wait (bounded) for on-chain deployment before funds can move.\n const deployed = await this.pollEscrowUntil(\n escrowId,\n isEscrowDeployed,\n waitForDeploymentMs,\n pollMs,\n created as unknown as Escrow\n )\n if (!isEscrowDeployed(deployed)) {\n return {\n stage: 'created',\n escrow: deployed,\n splits: deployed.splits,\n deploymentPending: true,\n }\n }\n\n // 3. Pre-flight payer-balance check: stop cleanly before moving money if\n // the payer wallet can't cover the amount (deterministic, not error-sniffing).\n const payerWalletId = deployed.buyerWalletId\n const balance = await this.client.wallets.getBalance(payerWalletId)\n if (parseUsdc(balance.balance.usdc) < parseUsdc(amount)) {\n return {\n stage: 'deployed',\n escrow: deployed,\n splits: deployed.splits,\n fundingRequired: {\n payerWalletId,\n payerAddress: deployed.buyerWallet.address,\n amount,\n available: balance.balance.usdc,\n },\n }\n }\n\n // 4. Fund from the payer wallet. Funding is ASYNC and the fund endpoint\n // returns operation metadata (not an escrow) — ignore its body and poll.\n await this.fund(\n { escrowId, buyerWalletId: payerWalletId, amount },\n `${runKey}-fund`\n )\n\n // 4b. Wait until the escrow settles to funded/locked before releasing.\n const funded = await this.pollEscrowUntil(\n escrowId,\n isEscrowFunded,\n waitForFundingMs,\n pollMs,\n deployed\n )\n if (!isEscrowFunded(funded)) {\n // Funds didn't settle in time — do NOT release. Resume via escrowId.\n return { stage: 'funded', escrow: funded, splits: funded.splits, fundingPending: true }\n }\n\n if (!autoRelease) {\n return { stage: 'funded', escrow: funded, splits: funded.splits }\n }\n\n // 5. Release. Server-side per-split transfers are crash-safe & idempotent;\n // release returns metadata too, so re-get for the authoritative escrow.\n await this.release(\n { escrowId, actorId: actorId ?? payerOwnerId, reason: 'receiveAndSplit auto-release' },\n `${runKey}-release`\n )\n const final = await this.get(escrowId)\n return { stage: 'released', escrow: final, splits: final.splits }\n }\n\n /**\n * Poll `get(escrowId)` until `predicate` holds or `budgetMs` elapses. Returns\n * the last-observed escrow; the caller re-checks the predicate to branch.\n * `seed` is the escrow already in hand, checked before any poll so a\n * synchronously-settled escrow returns without a network round-trip.\n */\n private async pollEscrowUntil(\n escrowId: string,\n predicate: (e: Escrow) => boolean,\n budgetMs: number,\n pollMs: number,\n seed: Escrow\n ): Promise<Escrow> {\n let escrow = seed\n if (predicate(escrow)) return escrow\n const deadline = Date.now() + budgetMs\n while (Date.now() < deadline) {\n await sleep(pollMs)\n escrow = await this.get(escrowId)\n if (predicate(escrow)) break\n }\n return escrow\n }\n\n /**\n * Create a dispute for an escrow\n */\n async createDispute(params: CreateDisputeParams, idempotencyKey?: string): Promise<Dispute> {\n return this.client['request']<Dispute>(\n 'POST',\n `/v1/escrow/${params.escrowId}/dispute`,\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Get dispute details\n */\n async getDispute(escrowId: string, disputeId: string): Promise<Dispute> {\n return this.client['request']<Dispute>(\n 'GET',\n `/v1/escrow/${escrowId}/dispute/${disputeId}`\n )\n }\n}\n","/**\n * Mandates resource for the Aura Payments SDK.\n *\n * Wraps `/v1/agent/mandates/*` routes (operator-facing inbox). Approve/reject\n * require an HMAC decision signature — see `MandateSignature` helper below\n * for computing it client-side.\n */\n\nimport { createHmac } from 'node:crypto'\n\nimport type { AuraClient } from '../client'\nimport type {\n ApproveMandateParams,\n ListMandatesParams,\n ListMandatesResponse,\n Mandate,\n RejectMandateParams,\n} from '../types/mandate'\n\nexport class Mandates {\n constructor(private client: AuraClient) {}\n\n /**\n * List mandates for the authenticated account. Defaults to `status=pending`\n * so this acts as the operator's inbox out of the box.\n */\n async list(params?: ListMandatesParams): Promise<ListMandatesResponse> {\n const query = new URLSearchParams()\n if (params?.status) query.set('status', params.status)\n if (params?.agentId) query.set('agentId', params.agentId)\n if (params?.limit !== undefined) query.set('limit', String(params.limit))\n if (params?.cursor) query.set('cursor', params.cursor)\n\n const qs = query.toString()\n return this.client['request']<ListMandatesResponse>(\n 'GET',\n qs ? `/v1/agent/mandates?${qs}` : '/v1/agent/mandates'\n )\n }\n\n /**\n * Convenience wrapper for the most common case: pending mandates in\n * urgency order (most-expiring first).\n */\n async listPending(\n extras?: Omit<ListMandatesParams, 'status'>\n ): Promise<ListMandatesResponse> {\n return this.list({ ...extras, status: 'pending' })\n }\n\n /**\n * Get a single mandate by id.\n */\n async get(mandateId: string): Promise<Mandate> {\n return this.client['request']<Mandate>(\n 'GET',\n `/v1/agent/mandates/${mandateId}`\n )\n }\n\n /**\n * Approve a pending mandate. Caller is responsible for computing\n * `decisionSignature` — use `MandateSignature.compute()` below.\n *\n * Idempotent: re-approving an already-`approved` mandate returns 200 with\n * the existing decision. Approving a `rejected`/`cancelled` mandate\n * returns 409.\n */\n async approve(\n params: ApproveMandateParams,\n idempotencyKey?: string\n ): Promise<Mandate> {\n const { mandateId, ...body } = params\n return this.client['request']<Mandate>(\n 'POST',\n `/v1/agent/mandates/${mandateId}/approve`,\n body,\n { idempotencyKey }\n )\n }\n\n /**\n * Reject a pending mandate. Same signature scheme as `approve`.\n */\n async reject(\n params: RejectMandateParams,\n idempotencyKey?: string\n ): Promise<Mandate> {\n const { mandateId, ...body } = params\n return this.client['request']<Mandate>(\n 'POST',\n `/v1/agent/mandates/${mandateId}/reject`,\n body,\n { idempotencyKey }\n )\n }\n}\n\n// ============================================================================\n// Decision signature helper\n// ============================================================================\n\n/**\n * Computes / verifies the HMAC-SHA256 signature the platform requires when\n * deciding a mandate. The signature commits to the mandate id, the decision\n * verb, and the timestamp so a stolen \"approve\" payload can't be replayed\n * against a different mandate.\n *\n * Usage:\n * ```ts\n * const decidedAt = new Date().toISOString()\n * const sig = MandateSignature.compute({\n * mandateId,\n * decision: 'approve',\n * decidedAt,\n * secret: process.env.MANDATE_HMAC_SECRET!,\n * })\n * await client.mandates.approve({\n * mandateId,\n * decisionMethod: 'manual',\n * decisionSignature: sig,\n * decidedAt,\n * })\n * ```\n *\n * The platform's verify lives at `lib/agents/mandate-signature.ts` and uses\n * the same `${id}:${decision}:${decidedAt}` payload format. Keep them\n * synchronized.\n */\nexport const MandateSignature = {\n compute(input: {\n mandateId: string\n decision: 'approve' | 'reject'\n decidedAt: string\n secret: string\n }): string {\n const payload = `${input.mandateId}:${input.decision}:${input.decidedAt}`\n return createHmac('sha256', input.secret).update(payload).digest('hex')\n },\n\n verify(input: {\n mandateId: string\n decision: 'approve' | 'reject'\n decidedAt: string\n secret: string\n signature: string\n }): boolean {\n const expected = MandateSignature.compute({\n mandateId: input.mandateId,\n decision: input.decision,\n decidedAt: input.decidedAt,\n secret: input.secret,\n })\n // Constant-time comparison\n if (expected.length !== input.signature.length) return false\n let diff = 0\n for (let i = 0; i < expected.length; i++) {\n diff |= expected.charCodeAt(i) ^ input.signature.charCodeAt(i)\n }\n return diff === 0\n },\n}\n","/**\n * Policies resource for the Aura Payments SDK.\n *\n * Wraps `/v1/agents/{agentId}/policies/*` routes for managing the persistent\n * rules that drive the policy engine. Note: approving an `agent.policy.proposed`\n * mandate also creates a new policy server-side — this resource is for direct\n * policy CRUD outside the mandate flow.\n */\n\nimport type { AuraClient } from '../client'\nimport type {\n AgentPolicy,\n CreatePolicyParams,\n ListPoliciesResponse,\n} from '../types/policy'\n\nexport class Policies {\n constructor(private client: AuraClient) {}\n\n /**\n * List all policies attached to an agent.\n */\n async list(agentId: string): Promise<ListPoliciesResponse> {\n return this.client['request']<ListPoliciesResponse>(\n 'GET',\n `/v1/agents/${agentId}/policies`\n )\n }\n\n /**\n * Get a single policy by id (scoped to the parent agent).\n */\n async get(agentId: string, policyId: string): Promise<AgentPolicy> {\n return this.client['request']<AgentPolicy>(\n 'GET',\n `/v1/agents/${agentId}/policies/${policyId}`\n )\n }\n\n /**\n * Create a new policy for an agent. The agent's policy engine will start\n * matching against this policy on the next evaluation.\n */\n async create(\n params: CreatePolicyParams,\n idempotencyKey?: string\n ): Promise<AgentPolicy> {\n const { agentId, ...body } = params\n return this.client['request']<AgentPolicy>(\n 'POST',\n `/v1/agents/${agentId}/policies`,\n body,\n { idempotencyKey }\n )\n }\n}\n","/**\n * Wallets resource for Aura Payments SDK\n */\n\nimport type { AuraClient } from '../client'\nimport { AuraAPIError, AuraFaucetUnavailableError } from '../errors'\nimport type {\n Wallet,\n WalletBalance,\n CreateWalletParams,\n ResolvedWallet,\n TransferParams,\n Transfer,\n ListWalletsParams,\n ListWalletsResponse,\n RequestTestnetFundsParams,\n RequestTestnetFundsResponse,\n} from '../types/wallet'\n\nexport class Wallets {\n constructor(private client: AuraClient) {}\n\n /**\n * Create a new wallet\n */\n async create(params: CreateWalletParams, idempotencyKey?: string): Promise<ResolvedWallet> {\n return this.client['request']<ResolvedWallet>(\n 'POST',\n '/v1/wallets',\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Get wallet by ID\n */\n async get(walletId: string): Promise<Wallet> {\n return this.client['request']<Wallet>('GET', `/v1/wallets/${walletId}`)\n }\n\n /**\n * List wallets with optional filters\n */\n async list(params?: ListWalletsParams): Promise<ListWalletsResponse> {\n const queryParams = new URLSearchParams()\n if (params?.entityId) queryParams.set('entityId', params.entityId)\n if (params?.chain) queryParams.set('chain', params.chain)\n if (params?.type) queryParams.set('type', params.type)\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.limit) queryParams.set('limit', params.limit.toString())\n\n const query = queryParams.toString()\n const path = query ? `/v1/wallets?${query}` : '/v1/wallets'\n\n return this.client['request']<ListWalletsResponse>('GET', path)\n }\n\n /**\n * Get wallet balance\n */\n async getBalance(walletId: string): Promise<WalletBalance> {\n return this.client['request']<WalletBalance>(\n 'GET',\n `/v1/wallets/${walletId}/balance`\n )\n }\n\n /**\n * Transfer funds from wallet\n */\n async transfer(params: TransferParams): Promise<Transfer> {\n const idempotencyKey = params.idempotencyKey || this.generateIdempotencyKey()\n\n return this.client['request']<Transfer>(\n 'POST',\n `/v1/wallets/${params.fromWalletId}/transfer`,\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Request testnet funds (USDC) for a wallet from the platform faucet.\n *\n * Testnet only. Backed by `POST /v1/wallets/:id/faucet`, provided by the\n * platform (AURA-010). Until that endpoint ships, this capability-probes and\n * raises {@link AuraFaucetUnavailableError} (rather than a generic 404/501)\n * so callers can degrade gracefully to manual funding.\n */\n async requestTestnetFunds(\n walletId: string,\n params?: RequestTestnetFundsParams\n ): Promise<RequestTestnetFundsResponse> {\n try {\n return await this.client['request']<RequestTestnetFundsResponse>(\n 'POST',\n `/v1/wallets/${walletId}/faucet`,\n params ?? {}\n )\n } catch (err) {\n // Capability probe: a 501 means the faucet endpoint isn't implemented on\n // this deployment. We do NOT treat 404 as \"faucet unavailable\" — a 404 is\n // ambiguous (missing route vs wallet-not-found), so masking it would hide a\n // bad walletId. The faucet endpoint MUST return 501 (not 404) while\n // unimplemented — see docs/plans/2026-06-11-aura-010-faucet-endpoint-handoff.md.\n if (err instanceof AuraAPIError && err.statusCode === 501) {\n throw new AuraFaucetUnavailableError(\n 'Testnet faucet is not enabled on this deployment yet ' +\n '(POST /v1/wallets/:id/faucet returned 501). Fund the wallet manually, ' +\n 'or ask the operator to enable the faucet endpoint.'\n )\n }\n throw err\n }\n }\n\n /**\n * Get transfer by ID\n */\n async getTransfer(walletId: string, transferId: string): Promise<Transfer> {\n return this.client['request']<Transfer>(\n 'GET',\n `/v1/wallets/${walletId}/transfers/${transferId}`\n )\n }\n\n /**\n * Generate a unique idempotency key\n */\n private generateIdempotencyKey(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`\n }\n}\n","/**\n * Webhooks resource and utilities for Aura Payments SDK\n */\n\nimport { createHmac } from 'node:crypto'\n\nimport type { AuraClient } from '../client'\nimport type {\n WebhookConfig,\n WebhookConfigWithSecret,\n ConfigureWebhookParams,\n WebhookEvent,\n ValidateWebhookSignatureOptions,\n WebhookValidationResult,\n} from '../types/webhook'\n\nexport class Webhooks {\n constructor(private client: AuraClient) {}\n\n /**\n * Configure webhook endpoint and events\n */\n async configure(params: ConfigureWebhookParams): Promise<WebhookConfigWithSecret> {\n return this.client['request']<WebhookConfigWithSecret>(\n 'POST',\n '/v1/webhooks/config',\n params\n )\n }\n\n /**\n * Get current webhook configuration\n */\n async getConfig(): Promise<WebhookConfig> {\n return this.client['request']<WebhookConfig>('GET', '/v1/webhooks/config')\n }\n\n /**\n * Delete webhook configuration\n */\n async delete(): Promise<{ deleted: true; message: string }> {\n return this.client['request']<{ deleted: true; message: string }>(\n 'DELETE',\n '/v1/webhooks/config'\n )\n }\n\n /**\n * Validate webhook signature\n * Use this in your webhook handler to verify authenticity\n */\n static validateSignature(options: ValidateWebhookSignatureOptions): WebhookValidationResult {\n try {\n const { payload, signature, secret, toleranceMs = 300_000 } = options\n\n // Convert payload to string if it's an object\n const payloadString = typeof payload === 'string' ? payload : JSON.stringify(payload)\n\n // Signature header format: \"t=timestamp,v1=hex\"\n const { timestamp, v1 } = this.parseSignatureHeader(signature)\n\n // Enforce tolerance window\n const ageMs = Math.abs(Date.now() - timestamp)\n if (ageMs > toleranceMs) {\n return { valid: false, error: 'Signature timestamp expired' }\n }\n\n // Compute HMAC signature over `${timestamp}.${payload}`\n const expectedSignature = this.computeHmacSignature(`${timestamp}.${payloadString}`, secret)\n\n // Constant-time comparison to prevent timing attacks\n const valid = this.secureCompare(v1, expectedSignature)\n\n if (!valid) {\n return {\n valid: false,\n error: 'Invalid signature',\n }\n }\n\n // Parse the event\n const event: WebhookEvent = typeof payload === 'string' ? JSON.parse(payload) : payload\n\n return {\n valid: true,\n event,\n }\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n }\n }\n }\n\n /**\n * Parse signature header: \"t=timestamp,v1=signature\"\n */\n private static parseSignatureHeader(signatureHeader: string): { timestamp: number; v1: string } {\n const parts = signatureHeader.split(',').map((p) => p.trim())\n const tPart = parts.find((p) => p.startsWith('t='))\n const v1Part = parts.find((p) => p.startsWith('v1='))\n\n if (!tPart || !v1Part) {\n throw new Error('Invalid signature header format (expected: t=...,v1=...)')\n }\n\n const timestamp = parseInt(tPart.slice(2), 10)\n const v1 = v1Part.slice(3)\n\n if (!Number.isFinite(timestamp) || timestamp <= 0) {\n throw new Error('Invalid signature timestamp')\n }\n if (!v1) {\n throw new Error('Invalid signature value')\n }\n\n return { timestamp, v1 }\n }\n\n /**\n * Compute HMAC-SHA256 signature\n */\n private static computeHmacSignature(payload: string, secret: string): string {\n // Note: In a real implementation, you'd use Node.js crypto or Web Crypto API\n // This is a placeholder that should be implemented based on the environment\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n // Browser environment - use Web Crypto API\n throw new Error('Web Crypto implementation needed for browser')\n }\n\n return createHmac('sha256', secret).update(payload).digest('hex')\n }\n\n /**\n * Constant-time string comparison\n */\n private static secureCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false\n }\n\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n\n return result === 0\n }\n}\n","/**\n * Aura Payments SDK Client\n * Main entry point for interacting with the Aura Payments Platform API\n */\n\nimport {\n AuraError,\n AuraAPIError,\n AuraNetworkError,\n AuraTimeoutError,\n AuraAuthenticationError,\n AuraNotFoundError,\n AuraRateLimitError,\n AuraValidationError,\n} from './errors'\nimport { Agents } from './resources/agents'\nimport { Escrows } from './resources/escrows'\nimport { Mandates } from './resources/mandates'\nimport { Policies } from './resources/policies'\nimport { Wallets } from './resources/wallets'\nimport { Webhooks } from './resources/webhooks'\nimport { retryWithBackoff, generateIdempotencyKey, withTimeout } from './utils'\n\nexport interface AuraClientConfig {\n /**\n * API key for authentication\n */\n apiKey: string\n\n /**\n * Base URL of the Aura Platform API.\n *\n * Accepts either a bare hostname (`https://getaura.sh`) or a hostname\n * including the `/api` path (`https://getaura.sh/api`). The SDK appends\n * `/api` automatically if it's missing, so resource paths like `/v1/escrow`\n * always resolve to `https://your-host/api/v1/escrow`.\n *\n * @default 'https://getaura.sh/api'\n */\n baseUrl?: string\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number\n\n /**\n * Maximum number of retry attempts for failed requests\n * @default 3\n */\n maxRetries?: number\n\n /**\n * Enable automatic idempotency key generation\n * @default true\n */\n autoIdempotency?: boolean\n}\n\ninterface RequestOptions {\n idempotencyKey?: string\n skipRetry?: boolean\n}\n\nexport class AuraClient {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly autoIdempotency: boolean\n\n // Resource instances\n public readonly escrows: Escrows\n public readonly wallets: Wallets\n public readonly webhooks: Webhooks\n // Agent-native resources (added in 2.1.0)\n public readonly agents: Agents\n public readonly policies: Policies\n public readonly mandates: Mandates\n\n constructor(config: AuraClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = AuraClient.normalizeBaseUrl(config.baseUrl)\n this.timeout = config.timeout || 30000\n this.maxRetries = config.maxRetries || 3\n this.autoIdempotency = config.autoIdempotency !== false // default true\n\n if (!this.apiKey) {\n throw new AuraError('API key is required', 'MISSING_API_KEY')\n }\n\n // Initialize resources\n this.escrows = new Escrows(this)\n this.wallets = new Wallets(this)\n this.webhooks = new Webhooks(this)\n this.agents = new Agents(this)\n this.policies = new Policies(this)\n this.mandates = new Mandates(this)\n }\n\n /**\n * Normalize the base URL so resource paths like `/v1/escrow` reach the\n * platform's `/api/v1/escrow` route regardless of how the caller framed\n * `baseUrl`. Trailing slashes are trimmed; missing `/api` is appended.\n *\n * @internal exported pattern for tests; do not call directly.\n */\n private static normalizeBaseUrl(input?: string): string {\n const raw = (input || 'https://getaura.sh/api').replace(/\\/+$/, '')\n // If the base already ends with `/api` (or contains it before query),\n // leave it alone. Otherwise append `/api` so `${base}/v1/...` resolves\n // to `https://host/api/v1/...`.\n if (/\\/api(\\/v\\d+)?$/.test(raw) || /\\/api$/.test(raw)) {\n return raw\n }\n return `${raw}/api`\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey\n }\n\n /**\n * Get the base URL\n */\n getBaseUrl(): string {\n return this.baseUrl\n }\n\n /**\n * Get the timeout value\n */\n getTimeout(): number {\n return this.timeout\n }\n\n /**\n * Get the max retries value\n */\n getMaxRetries(): number {\n return this.maxRetries\n }\n\n /**\n * Make an authenticated request to the API with automatic retry logic\n */\n protected async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n const requestFn = () => this.executeRequest<T>(method, path, body, options)\n\n // Skip retry for certain operations or if explicitly disabled\n if (options?.skipRetry || method === 'GET') {\n return requestFn()\n }\n\n // Use retry logic with exponential backoff\n return retryWithBackoff(requestFn, this.maxRetries)\n }\n\n /**\n * Execute a single HTTP request (internal)\n */\n private async executeRequest<T>(\n method: string,\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n 'User-Agent': '@aura-payments/sdk/2.1.0',\n }\n\n // Add idempotency key (auto-generate for POST/PUT if enabled)\n if (options?.idempotencyKey) {\n headers['Idempotency-Key'] = options.idempotencyKey\n } else if (this.autoIdempotency && (method === 'POST' || method === 'PUT')) {\n headers['Idempotency-Key'] = generateIdempotencyKey()\n }\n\n try {\n // Execute request with timeout\n const response = await withTimeout(\n fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n }),\n this.timeout\n )\n\n // Handle different status codes\n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n // Handle empty responses (204 No Content)\n if (response.status === 204) {\n return undefined as T\n }\n\n // Parse and return JSON response\n const data = await response.json()\n return this.normalizeResponse<T>(data)\n } catch (error) {\n // Convert network errors to AuraNetworkError\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new AuraNetworkError('Network request failed', error)\n }\n\n // Re-throw Aura errors as-is\n if (error instanceof AuraError) {\n throw error\n }\n\n // Wrap unknown errors\n throw new AuraError(\n error instanceof Error ? error.message : 'Unknown error occurred',\n 'UNKNOWN_ERROR'\n )\n }\n }\n\n /**\n * Normalize API responses across different wrapper formats.\n *\n * The platform API currently uses two common success wrappers:\n * - { success: true, data: T, ... }\n * - { data: T, meta: {...} } (and sometimes { data: T[], meta, pagination })\n *\n * SDK methods generally return the inner `data` payload, except for paginated\n * endpoints where pagination metadata is meaningful and preserved.\n */\n private normalizeResponse<T>(payload: unknown): T {\n if (!payload || typeof payload !== 'object') return payload as T\n\n const obj = payload as Record<string, unknown>\n\n // Wrapper: { success: true|false, data: ... }\n if ('success' in obj && 'data' in obj) {\n return obj.data as T\n }\n\n // Wrapper: { data: ..., meta: ... } or { data: ..., metadata: ... } (optionally with pagination)\n if ('data' in obj && ('meta' in obj || 'metadata' in obj)) {\n if ('pagination' in obj) {\n // Keep paginated wrapper (includes pagination + meta)\n return obj as T\n }\n // Unwrap non-paginated success wrapper to its data payload\n return obj.data as T\n }\n\n // Wrapper: { data: ... } (simple wrapper without meta)\n if ('data' in obj && Object.keys(obj).length <= 2) {\n return obj.data as T\n }\n\n // Unrecognized shape: return as-is\n return payload as T\n }\n\n /**\n * Handle HTTP error responses and throw appropriate errors\n */\n private async handleErrorResponse(response: Response): Promise<never> {\n const statusCode = response.status\n let errorData: { message?: string; code?: string; details?: unknown } = {}\n\n try {\n const data = await response.json()\n if (typeof data === 'object' && data !== null) {\n errorData = data as { message?: string; code?: string; details?: unknown }\n }\n } catch {\n // If response body is not JSON, use status text\n errorData = { message: response.statusText }\n }\n\n const message = errorData.message || `HTTP ${statusCode} error`\n const code = errorData.code\n const details = errorData.details\n\n // Map specific status codes to error types\n switch (statusCode) {\n case 400:\n throw new AuraValidationError(message, details)\n case 401:\n throw new AuraAuthenticationError(message)\n case 404:\n throw new AuraNotFoundError(message)\n case 429:\n {\n const retryAfter = response.headers.get('Retry-After')\n throw new AuraRateLimitError(message, retryAfter ? parseInt(retryAfter) : undefined)\n }\n case 408:\n throw new AuraTimeoutError(message)\n default:\n throw new AuraAPIError(message, statusCode, code, details)\n }\n }\n\n /**\n * Get the auto-idempotency setting\n */\n getAutoIdempotency(): boolean {\n return this.autoIdempotency\n }\n}\n"]}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/resources/agents.ts","../src/utils.ts","../src/resources/escrows.ts","../src/resources/mandates.ts","../src/resources/policies.ts","../src/resources/wallets.ts","../src/resources/webhooks.ts","../src/client.ts"],"names":["sleep","createHmac"],"mappings":";;;AAIO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,KAAA,CAAM;AAAA,EACnC,WAAA,CACE,OAAA,EACgB,IAAA,EACA,UAAA,EACA,OAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAJG,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,UAAA,CAAU,SAAS,CAAA;AAAA,EACjD;AACF;AAEO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,SAAA,CAAU;AAAA,EAC1C,WAAA,CACE,OAAA,EACA,UAAA,EACA,IAAA,EACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,aAAA,CAAa,SAAS,CAAA;AAAA,EACpD;AACF;AAEO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,SAAA,CAAU;AAAA,EAC9C,WAAA,CAAY,SAAiC,KAAA,EAAe;AAC1D,IAAA,KAAA,CAAM,SAAS,eAAe,CAAA;AADa,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAE3C,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,iBAAA,CAAiB,SAAS,CAAA;AAAA,EACxD;AACF;AAEO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,SAAA,CAAU;AAAA,EAC9C,WAAA,CAAY,UAAkB,iBAAA,EAAmB;AAC/C,IAAA,KAAA,CAAM,SAAS,SAAS,CAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,iBAAA,CAAiB,SAAS,CAAA;AAAA,EACxD;AACF;AAEO,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAA4B,SAAA,CAAU;AAAA,EACjD,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC9C,IAAA,KAAA,CAAM,OAAA,EAAS,kBAAA,EAAoB,GAAA,EAAK,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,oBAAA,CAAoB,SAAS,CAAA;AAAA,EAC3D;AACF;AAEO,IAAM,uBAAA,GAAN,MAAM,wBAAA,SAAgC,SAAA,CAAU;AAAA,EACrD,WAAA,CAAY,UAAkB,uBAAA,EAAyB;AACrD,IAAA,KAAA,CAAM,OAAA,EAAS,wBAAwB,GAAG,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,wBAAA,CAAwB,SAAS,CAAA;AAAA,EAC/D;AACF;AAEO,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,SAAA,CAAU;AAAA,EAC/C,YAAY,QAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,UAAA,CAAA,EAAc,WAAA,EAAa,GAAG,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,kBAAA,CAAkB,SAAS,CAAA;AAAA,EACzD;AACF;AAEO,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,SAAA,CAAU;AAAA,EAChD,WAAA,CACE,OAAA,GAAkB,qBAAA,EACF,UAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,uBAAuB,GAAG,CAAA;AAFzB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,mBAAA,CAAmB,SAAS,CAAA;AAAA,EAC1D;AACF;AASO,IAAM,0BAAA,GAAN,MAAM,2BAAA,SAAmC,SAAA,CAAU;AAAA,EACxD,WAAA,CACE,UAAkB,oDAAA,EAClB;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,sBAAsB,GAAG,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,2BAAA,CAA2B,SAAS,CAAA;AAAA,EAClE;AACF;AAKO,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,OAAO,KAAA,YAAiB,SAAA;AAC1B;AAEO,SAAS,6BACd,KAAA,EACqC;AACrC,EAAA,OAAO,KAAA,YAAiB,0BAAA;AAC1B;AAEO,SAAS,eAAe,KAAA,EAAuC;AACpE,EAAA,OAAO,KAAA,YAAiB,YAAA;AAC1B;AAEO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,OAAO,KAAA,YAAiB,gBAAA;AAC1B;AAEO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,OAAO,KAAA,YAAiB,gBAAA;AAC1B;AAEO,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,IAAI,EAAE,KAAA,YAAiB,SAAA,CAAA,EAAY,OAAO,KAAA;AAG1C,EAAA,IAAI,KAAA,YAAiB,kBAAkB,OAAO,IAAA;AAG9C,EAAA,IAAI,KAAA,YAAiB,kBAAkB,OAAO,IAAA;AAG9C,EAAA,IAAI,KAAA,YAAiB,oBAAoB,OAAO,IAAA;AAGhD,EAAA,IAAI,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA,IAAc,GAAA,EAAK;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;;;ACrHO,IAAM,SAAN,MAAa;AAAA,EAClB,YAAoB,MAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzC,MAAM,MAAA,CACJ,MAAA,EACA,cAAA,EAC8B;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,MAAA,EAAwD;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,QAAQ,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AACrD,IAAA,IAAI,QAAQ,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC/C,IAAA,IAAI,MAAA,EAAQ,UAAU,MAAA,EAAW,KAAA,CAAM,IAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACxE,IAAA,IAAI,MAAA,EAAQ,WAAW,MAAA,EAAW,KAAA,CAAM,IAAI,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC3E,IAAA,IAAI,QAAQ,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,OAAO,OAAO,CAAA;AACxD,IAAA,IAAI,QAAQ,cAAA,EAAgB,KAAA,CAAM,GAAA,CAAI,gBAAA,EAAkB,OAAO,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,EAAA,GAAK,CAAA,WAAA,EAAc,EAAE,CAAA,CAAA,GAAK;AAAA,KAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,OAAA,EAAiC;AACzC,IAAA,OAAO,KAAK,MAAA,CAAO,SAAS,EAAS,KAAA,EAAO,CAAA,WAAA,EAAc,OAAO,CAAA,CAAE,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CACJ,OAAA,EACA,MAAA,EACA,cAAA,EACgB;AAChB,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,OAAA;AAAA,MACA,cAAc,OAAO,CAAA,CAAA;AAAA,MACrB,MAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CACJ,MAAA,EACA,cAAA,EAC8B;AAC9B,IAAA,MAAM,EAAE,OAAA,EAAS,GAAG,IAAA,EAAK,GAAI,MAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,cAAc,OAAO,CAAA,OAAA,CAAA;AAAA,MACrB,IAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CACJ,MAAA,EACA,cAAA,EAC8B;AAC9B,IAAA,MAAM,EAAE,SAAQ,GAAI,MAAA;AACpB,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,cAAc,OAAO,CAAA,SAAA,CAAA;AAAA,MACrB,MAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAwC;AACvD,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,cAAc,OAAO,CAAA,QAAA;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAA,CACJ,MAAA,EACA,cAAA,EACiC;AACjC,IAAA,MAAM,EAAE,OAAA,EAAS,GAAG,IAAA,EAAK,GAAI,MAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,cAAc,OAAO,CAAA,SAAA,CAAA;AAAA,MACrB,IAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AACF;;;AC7IO,SAAS,sBAAA,GAAiC;AAC/C,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC/B;AAKO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AASO,SAAS,gBAAA,CACd,OAAA,EACA,SAAA,GAAoB,GAAA,EACpB,WAAmB,GAAA,EACX;AAER,EAAA,MAAM,gBAAA,GAAmB,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAGxD,EAAA,MAAM,MAAA,GAAS,gBAAA,GAAmB,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA;AAGlD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,gBAAA,GAAmB,MAAA,EAAQ,QAAQ,CAAA;AACrD;AASA,eAAsB,gBAAA,CACpB,EAAA,EACA,UAAA,GAAqB,CAAA,EACrB,cAA2C,gBAAA,EAC/B;AACZ,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAGZ,MAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACvB,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,KAAA,GAAQ,iBAAiB,OAAO,CAAA;AAGtC,MAAA,MAAM,MAAM,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA;AACR;AAQA,eAAsB,WAAA,CACpB,OAAA,EACA,SAAA,EACA,cAAA,EACY;AACZ,EAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,MAAA,CAAO,IAAI,gBAAA,CAAiB,cAAA,IAAkB,CAAA,sBAAA,EAAyB,SAAS,IAAI,CAAC,CAAA;AAAA,IACvF,GAAG,SAAS,CAAA;AAAA,EACd,CAAC,CAAA;AAED,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,EAAS,cAAc,CAAC,CAAA;AAC/C;;;AClFA,SAAS,iBAAiB,CAAA,EAGd;AACV,EAAA,IAAI,CAAA,CAAE,UAAA,EAAY,QAAA,EAAU,OAAO,IAAA;AACnC,EAAA,OAAO,CAAC,YAAY,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,KAAA,IAAS,EAAE,CAAA;AAC5E;AAQA,SAAS,eAAe,CAAA,EAAgC;AACtD,EAAA,OAAO,CAAC,UAAU,QAAA,EAAU,UAAU,EAAE,QAAA,CAAS,CAAA,CAAE,SAAS,EAAE,CAAA;AAChE;AAGA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACjC,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAClC;AAEA,IAAMA,MAAAA,GAAQ,CAAC,EAAA,KACb,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAE3C,IAAM,UAAN,MAAc;AAAA,EACnB,YAAoB,MAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA,EAKzC,MAAM,MAAA,CAAO,MAAA,EAA4B,cAAA,EAAwD;AAC/F,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,mBAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,QAAA,EAAmC;AAC3C,IAAA,OAAO,KAAK,MAAA,CAAO,SAAS,EAAU,KAAA,EAAO,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,MAAA,EAA0D;AACnE,IAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,IAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,IAAA,IAAI,QAAQ,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,OAAA,EAAS,OAAO,KAAK,CAAA;AACxD,IAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,IAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AACnE,IAAA,IAAI,MAAA,EAAQ,QAAQ,WAAA,CAAY,GAAA,CAAI,UAAU,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAEtE,IAAA,MAAM,KAAA,GAAQ,YAAY,QAAA,EAAS;AACnC,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,GAAK,YAAA;AAE7C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAuB,OAAO,IAAI,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,MAAA,EAA0B,cAAA,EAA0C;AAC7E,IAAA,MAAM,EAAE,QAAA,EAAU,GAAG,IAAA,EAAK,GAAI,MAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,cAAc,QAAQ,CAAA,KAAA,CAAA;AAAA,MACtB,IAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,MAAA,EAA6B,cAAA,EAA0C;AACnF,IAAA,MAAM,EAAE,QAAA,EAAU,GAAG,IAAA,EAAK,GAAI,MAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,cAAc,QAAQ,CAAA,QAAA,CAAA;AAAA,MACtB,IAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,MAAA,EAA4B,cAAA,EAA0C;AACjF,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,CAAA,iBAAA,CAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;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,EA2BA,MAAM,gBACJ,MAAA,EACgC;AAChC,IAAA,MAAM;AAAA,MACJ,OAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA,GAAc,IAAA;AAAA,MACd,mBAAA,GAAsB,GAAA;AAAA,MACtB,gBAAA,GAAmB,GAAA;AAAA,MACnB,cAAA,GAAiB,GAAA;AAAA,MACjB;AAAA,KACF,GAAI,MAAA;AAGJ,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA;AAC9D,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAG,MAAM,GAAA,EAAQ;AACvC,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,0CAA0C,MAAM,CAAA,EAAA,CAAA;AAAA,QAChD,EAAE,MAAA;AAAO,OACX;AAAA,IACF;AAKA,IAAA,MAAM,MAAA,GAAS,kBAAkB,sBAAA,EAAuB;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,GAAG,CAAA;AAG3C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA;AAAA,MACzB,EAAE,OAAA,EAAS,YAAA,EAAc,YAAA,EAAc,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,MAC7D,GAAG,MAAM,CAAA,OAAA;AAAA,KACX;AACA,IAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AAGzB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA;AAAA,MAC1B,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC/B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,SAAA;AAAA,QACP,MAAA,EAAQ,QAAA;AAAA,QACR,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,iBAAA,EAAmB;AAAA,OACrB;AAAA,IACF;AAIA,IAAA,MAAM,gBAAgB,QAAA,CAAS,aAAA;AAC/B,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,aAAa,CAAA;AAClE,IAAA,IAAI,UAAU,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,GAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AACvD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,MAAA,EAAQ,QAAA;AAAA,QACR,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,eAAA,EAAiB;AAAA,UACf,aAAA;AAAA,UACA,YAAA,EAAc,SAAS,WAAA,CAAY,OAAA;AAAA,UACnC,MAAA;AAAA,UACA,SAAA,EAAW,QAAQ,OAAA,CAAQ;AAAA;AAC7B,OACF;AAAA,IACF;AAIA,IAAA,MAAM,IAAA,CAAK,IAAA;AAAA,MACT,EAAE,QAAA,EAAU,aAAA,EAAe,aAAA,EAAe,MAAA,EAAO;AAAA,MACjD,GAAG,MAAM,CAAA,KAAA;AAAA,KACX;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA;AAAA,MACxB,QAAA;AAAA,MACA,cAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG;AAE3B,MAAA,OAAO,EAAE,OAAO,QAAA,EAAU,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,cAAA,EAAgB,IAAA,EAAK;AAAA,IACxF;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,QAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,IAClE;AAIA,IAAA,MAAM,IAAA,CAAK,OAAA;AAAA,MACT,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,IAAW,YAAA,EAAc,QAAQ,8BAAA,EAA+B;AAAA,MACrF,GAAG,MAAM,CAAA,QAAA;AAAA,KACX;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AACrC,IAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,QAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,eAAA,CACZ,QAAA,EACA,SAAA,EACA,QAAA,EACA,QACA,IAAA,EACiB;AACjB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG,OAAO,MAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,MAAMA,OAAM,MAAM,CAAA;AAClB,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAChC,MAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AAAA,IACzB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,MAAA,EAA6B,cAAA,EAA2C;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,CAAA,WAAA,EAAc,OAAO,QAAQ,CAAA,QAAA,CAAA;AAAA,MAC7B,MAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,QAAA,EAAkB,SAAA,EAAqC;AACtE,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,CAAA,WAAA,EAAc,QAAQ,CAAA,SAAA,EAAY,SAAS,CAAA;AAAA,KAC7C;AAAA,EACF;AACF;AC9RO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,MAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzC,MAAM,KAAK,MAAA,EAA4D;AACrE,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,QAAQ,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AACrD,IAAA,IAAI,QAAQ,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,OAAO,OAAO,CAAA;AACxD,IAAA,IAAI,MAAA,EAAQ,UAAU,MAAA,EAAW,KAAA,CAAM,IAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACxE,IAAA,IAAI,QAAQ,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAErD,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,EAAA,GAAK,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAA,GAAK;AAAA,KACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YACJ,MAAA,EAC+B;AAC/B,IAAA,OAAO,KAAK,IAAA,CAAK,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,SAAA,EAAqC;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,sBAAsB,SAAS,CAAA;AAAA,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAA,CACJ,MAAA,EACA,cAAA,EACkB;AAClB,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,MAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,sBAAsB,SAAS,CAAA,QAAA,CAAA;AAAA,MAC/B,IAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,MAAA,EACA,cAAA,EACkB;AAClB,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,IAAA,EAAK,GAAI,MAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,sBAAsB,SAAS,CAAA,OAAA,CAAA;AAAA,MAC/B,IAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AACF;AAiCO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,QAAQ,KAAA,EAKG;AACT,IAAA,MAAM,OAAA,GAAU,GAAG,KAAA,CAAM,SAAS,IAAI,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAA;AACvE,IAAA,OAAO,UAAA,CAAW,UAAU,KAAA,CAAM,MAAM,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EACxE,CAAA;AAAA,EAEA,OAAO,KAAA,EAMK;AACV,IAAA,MAAM,QAAA,GAAW,iBAAiB,OAAA,CAAQ;AAAA,MACxC,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,KAAA,CAAM,SAAA,CAAU,QAAQ,OAAO,KAAA;AACvD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,IAAA,IAAQ,SAAS,UAAA,CAAW,CAAC,IAAI,KAAA,CAAM,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,IAAA,KAAS,CAAA;AAAA,EAClB;AACF;;;ACjJO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,MAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA,EAKzC,MAAM,KAAK,OAAA,EAAgD;AACzD,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,cAAc,OAAO,CAAA,SAAA;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAI,OAAA,EAAiB,QAAA,EAAwC;AACjE,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,CAAA,WAAA,EAAc,OAAO,CAAA,UAAA,EAAa,QAAQ,CAAA;AAAA,KAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CACJ,MAAA,EACA,cAAA,EACsB;AACtB,IAAA,MAAM,EAAE,OAAA,EAAS,GAAG,IAAA,EAAK,GAAI,MAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,cAAc,OAAO,CAAA,SAAA,CAAA;AAAA,MACrB,IAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AACF;;;ACpCO,IAAM,UAAN,MAAc;AAAA,EACnB,YAAoB,MAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA,EAKzC,MAAM,MAAA,CAAO,MAAA,EAA4B,cAAA,EAAkD;AACzF,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,QAAA,EAAmC;AAC3C,IAAA,OAAO,KAAK,MAAA,CAAO,SAAS,EAAU,KAAA,EAAO,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAE,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,MAAA,EAA0D;AACnE,IAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,IAAA,IAAI,QAAQ,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AACjE,IAAA,IAAI,QAAQ,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,OAAA,EAAS,OAAO,KAAK,CAAA;AACxD,IAAA,IAAI,QAAQ,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AACrD,IAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAChE,IAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAEnE,IAAA,MAAM,KAAA,GAAQ,YAAY,QAAA,EAAS;AACnC,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,GAAK,aAAA;AAE9C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAuB,OAAO,IAAI,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAA,EAA0C;AACzD,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,eAAe,QAAQ,CAAA,QAAA;AAAA,KACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,MAAA,EAA2C;AACxD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,cAAA,IAAkB,IAAA,CAAK,sBAAA,EAAuB;AAE5E,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,CAAA,YAAA,EAAe,OAAO,YAAY,CAAA,SAAA,CAAA;AAAA,MAClC,MAAA;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,mBAAA,CACJ,QAAA,EACA,MAAA,EACsC;AACtC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,QAChC,MAAA;AAAA,QACA,eAAe,QAAQ,CAAA,OAAA,CAAA;AAAA,QACvB,UAAU;AAAC,OACb;AAAA,IACF,SAAS,GAAA,EAAK;AAMZ,MAAA,IAAI,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,UAAA,KAAe,GAAA,EAAK;AACzD,QAAA,MAAM,IAAI,0BAAA;AAAA,UACR;AAAA,SAGF;AAAA,MACF;AACA,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,QAAA,EAAkB,UAAA,EAAuC;AACzE,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,KAAA;AAAA,MACA,CAAA,YAAA,EAAe,QAAQ,CAAA,WAAA,EAAc,UAAU,CAAA;AAAA,KACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAA,GAAiC;AACvC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EACrE;AACF;ACrHO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,MAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA,EAKzC,MAAM,UAAU,MAAA,EAAkE;AAChF,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAAoC;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAiB,OAAO,qBAAqB,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAAsD;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,MAC1B,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,kBAAkB,OAAA,EAAmE;AAC1F,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,WAAA,GAAc,KAAQ,GAAI,OAAA;AAG9D,MAAA,MAAM,gBAAgB,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,IAAA,CAAK,UAAU,OAAO,CAAA;AAGpF,MAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAG,GAAI,IAAA,CAAK,qBAAqB,SAAS,CAAA;AAG7D,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AAC7C,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,6BAAA,EAA8B;AAAA,MAC9D;AAGA,MAAA,MAAM,iBAAA,GAAoB,KAAK,oBAAA,CAAqB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,aAAa,IAAI,MAAM,CAAA;AAG3F,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,EAAA,EAAI,iBAAiB,CAAA;AAEtD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAGA,MAAA,MAAM,QAAsB,OAAO,OAAA,KAAY,WAAW,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,GAAI,OAAA;AAEhF,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,qBAAqB,eAAA,EAA4D;AAC9F,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,IAAI,CAAC,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,KAAK,CAAC,CAAA;AAEpD,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACrB,MAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC7C,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAEzB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,aAAa,CAAA,EAAG;AACjD,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,EAAE,WAAW,EAAA,EAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,oBAAA,CAAqB,OAAA,EAAiB,MAAA,EAAwB;AAG3E,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAA,EAAQ;AAElD,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AAEA,IAAA,OAAOC,UAAAA,CAAW,UAAU,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,aAAA,CAAc,CAAA,EAAW,CAAA,EAAoB;AAC1D,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAA,IAAU,EAAE,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,MAAA,KAAW,CAAA;AAAA,EACpB;AACF;;;ACpFO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EAgBtB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA,CAAW,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAA;AACzD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AACvC,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,eAAA,KAAoB,KAAA;AAElD,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,SAAA,CAAU,qBAAA,EAAuB,iBAAiB,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAe,iBAAiB,KAAA,EAAwB;AACtD,IAAA,MAAM,GAAA,GAAA,CAAO,KAAA,IAAS,wBAAA,EAA0B,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAIlE,IAAA,IAAI,kBAAkB,IAAA,CAAK,GAAG,KAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,EAAG;AACrD,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,OAAO,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,OAAA,CACd,MAAA,EACA,IAAA,EACA,MACA,OAAA,EACY;AACZ,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,eAAkB,MAAA,EAAQ,IAAA,EAAM,MAAM,OAAO,CAAA;AAG1E,IAAA,IAAI,OAAA,EAAS,SAAA,IAAa,MAAA,KAAW,KAAA,EAAO;AAC1C,MAAA,OAAO,SAAA,EAAU;AAAA,IACnB;AAGA,IAAA,OAAO,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,CACZ,MAAA,EACA,IAAA,EACA,MACA,OAAA,EACY;AACZ,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,IAAI,CAAA,CAAA;AAClC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,MACtC,YAAA,EAAc;AAAA,KAChB;AAGA,IAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,MAAA,OAAA,CAAQ,iBAAiB,IAAI,OAAA,CAAQ,cAAA;AAAA,IACvC,WAAW,IAAA,CAAK,eAAA,KAAoB,MAAA,KAAW,MAAA,IAAU,WAAW,KAAA,CAAA,EAAQ;AAC1E,MAAA,OAAA,CAAQ,iBAAiB,IAAI,sBAAA,EAAuB;AAAA,IACtD;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,WAAW,MAAM,WAAA;AAAA,QACrB,MAAM,GAAA,EAAK;AAAA,UACT,MAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,SACrC,CAAA;AAAA,QACD,IAAA,CAAK;AAAA,OACP;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAAA,MACzC;AAGA,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,OAAO,KAAA,CAAA;AAAA,MACT;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,kBAAqB,IAAI,CAAA;AAAA,IACvC,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,iBAAiB,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACjE,QAAA,MAAM,IAAI,gBAAA,CAAiB,wBAAA,EAA0B,KAAK,CAAA;AAAA,MAC5D;AAGA,MAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,wBAAA;AAAA,QACzC;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,kBAAqB,OAAA,EAAqB;AAChD,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,UAAU,OAAO,OAAA;AAEpD,IAAA,MAAM,GAAA,GAAM,OAAA;AAGZ,IAAA,IAAI,SAAA,IAAa,GAAA,IAAO,MAAA,IAAU,GAAA,EAAK;AACrC,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,IACb;AAGA,IAAA,IAAI,MAAA,IAAU,GAAA,KAAQ,MAAA,IAAU,GAAA,IAAO,cAAc,GAAA,CAAA,EAAM;AACzD,MAAA,IAAI,gBAAgB,GAAA,EAAK;AAEvB,QAAA,OAAO,GAAA;AAAA,MACT;AAEA,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,IACb;AAGA,IAAA,IAAI,UAAU,GAAA,IAAO,MAAA,CAAO,KAAK,GAAG,CAAA,CAAE,UAAU,CAAA,EAAG;AACjD,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,IACb;AAGA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAoB,QAAA,EAAoC;AACpE,IAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAC5B,IAAA,IAAI,YAAoE,EAAC;AAEzE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,QAAA,SAAA,GAAY,IAAA;AAAA,MACd;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,SAAA,GAAY,EAAE,OAAA,EAAS,QAAA,CAAS,UAAA,EAAW;AAAA,IAC7C;AAEA,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,IAAW,CAAA,KAAA,EAAQ,UAAU,CAAA,MAAA,CAAA;AACvD,IAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,IAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAG1B,IAAA,QAAQ,UAAA;AAAY,MAClB,KAAK,GAAA;AACH,QAAA,MAAM,IAAI,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,MAChD,KAAK,GAAA;AACH,QAAA,MAAM,IAAI,wBAAwB,OAAO,CAAA;AAAA,MAC3C,KAAK,GAAA;AACH,QAAA,MAAM,IAAI,kBAAkB,OAAO,CAAA;AAAA,MACrC,KAAK,GAAA,EACL;AACE,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,QAAA,MAAM,IAAI,kBAAA,CAAmB,OAAA,EAAS,aAAa,QAAA,CAAS,UAAU,IAAI,MAAS,CAAA;AAAA,MACrF;AAAA,MACA,KAAK,GAAA;AACH,QAAA,MAAM,IAAI,iBAAiB,OAAO,CAAA;AAAA,MACpC;AACE,QAAA,MAAM,IAAI,YAAA,CAAa,OAAA,EAAS,UAAA,EAAY,MAAM,OAAO,CAAA;AAAA;AAC7D,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AACF","file":"index.mjs","sourcesContent":["/**\n * Custom error classes for Aura Payments SDK\n */\n\nexport class AuraError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n public readonly statusCode?: number,\n public readonly details?: unknown\n ) {\n super(message)\n this.name = 'AuraError'\n Object.setPrototypeOf(this, AuraError.prototype)\n }\n}\n\nexport class AuraAPIError extends AuraError {\n constructor(\n message: string,\n statusCode: number,\n code?: string,\n details?: unknown\n ) {\n super(message, code, statusCode, details)\n this.name = 'AuraAPIError'\n Object.setPrototypeOf(this, AuraAPIError.prototype)\n }\n}\n\nexport class AuraNetworkError extends AuraError {\n constructor(message: string, public readonly cause?: Error) {\n super(message, 'NETWORK_ERROR')\n this.name = 'AuraNetworkError'\n Object.setPrototypeOf(this, AuraNetworkError.prototype)\n }\n}\n\nexport class AuraTimeoutError extends AuraError {\n constructor(message: string = 'Request timeout') {\n super(message, 'TIMEOUT')\n this.name = 'AuraTimeoutError'\n Object.setPrototypeOf(this, AuraTimeoutError.prototype)\n }\n}\n\nexport class AuraValidationError extends AuraError {\n constructor(message: string, details?: unknown) {\n super(message, 'VALIDATION_ERROR', 400, details)\n this.name = 'AuraValidationError'\n Object.setPrototypeOf(this, AuraValidationError.prototype)\n }\n}\n\nexport class AuraAuthenticationError extends AuraError {\n constructor(message: string = 'Authentication failed') {\n super(message, 'AUTHENTICATION_ERROR', 401)\n this.name = 'AuraAuthenticationError'\n Object.setPrototypeOf(this, AuraAuthenticationError.prototype)\n }\n}\n\nexport class AuraNotFoundError extends AuraError {\n constructor(resource: string) {\n super(`${resource} not found`, 'NOT_FOUND', 404)\n this.name = 'AuraNotFoundError'\n Object.setPrototypeOf(this, AuraNotFoundError.prototype)\n }\n}\n\nexport class AuraRateLimitError extends AuraError {\n constructor(\n message: string = 'Rate limit exceeded',\n public readonly retryAfter?: number\n ) {\n super(message, 'RATE_LIMIT_EXCEEDED', 429)\n this.name = 'AuraRateLimitError'\n Object.setPrototypeOf(this, AuraRateLimitError.prototype)\n }\n}\n\n/**\n * Thrown when the testnet faucet endpoint is not available on the target\n * deployment. The faucet (`POST /v1/wallets/:id/faucet`) is provided by the\n * platform (AURA-010); until it ships, `wallets.requestTestnetFunds()`\n * capability-probes and raises this typed error instead of a generic 404/501,\n * so callers can degrade gracefully (e.g. prompt for manual funding).\n */\nexport class AuraFaucetUnavailableError extends AuraError {\n constructor(\n message: string = 'Testnet faucet is not available on this deployment'\n ) {\n super(message, 'FAUCET_UNAVAILABLE', 501)\n this.name = 'AuraFaucetUnavailableError'\n Object.setPrototypeOf(this, AuraFaucetUnavailableError.prototype)\n }\n}\n\n/**\n * Type guards for error handling\n */\nexport function isAuraError(error: unknown): error is AuraError {\n return error instanceof AuraError\n}\n\nexport function isAuraFaucetUnavailableError(\n error: unknown\n): error is AuraFaucetUnavailableError {\n return error instanceof AuraFaucetUnavailableError\n}\n\nexport function isAuraAPIError(error: unknown): error is AuraAPIError {\n return error instanceof AuraAPIError\n}\n\nexport function isAuraNetworkError(error: unknown): error is AuraNetworkError {\n return error instanceof AuraNetworkError\n}\n\nexport function isAuraTimeoutError(error: unknown): error is AuraTimeoutError {\n return error instanceof AuraTimeoutError\n}\n\nexport function isRetryableError(error: unknown): boolean {\n if (!(error instanceof AuraError)) return false\n\n // Network errors are retryable\n if (error instanceof AuraNetworkError) return true\n\n // Timeout errors are retryable\n if (error instanceof AuraTimeoutError) return true\n\n // 429 rate limit errors are retryable\n if (error instanceof AuraRateLimitError) return true\n\n // 5xx server errors are retryable\n if (error.statusCode && error.statusCode >= 500) {\n return true\n }\n\n return false\n}\n","/**\n * Agents resource for the Aura Payments SDK.\n *\n * Wraps `/v1/agents/*` routes: create, list, get, update, freeze, unfreeze,\n * balance, evaluate. All methods are account-scoped via the API key — the\n * platform extracts `accountId` server-side; the SDK never sends it.\n */\n\nimport type { AuraClient } from '../client'\nimport type {\n Agent,\n AgentBalance,\n AgentStatusResponse,\n CreateAgentParams,\n CreateAgentResponse,\n EvaluatePolicyParams,\n EvaluatePolicyResponse,\n FreezeAgentParams,\n ListAgentsParams,\n ListAgentsResponse,\n UnfreezeAgentParams,\n UpdateAgentParams,\n} from '../types/agent'\n\nexport class Agents {\n constructor(private client: AuraClient) {}\n\n /**\n * Create a new AI agent with a dedicated wallet and (optional) initial\n * policy. The platform provisions a Circle wallet on the requested chain\n * during this call; expect a few seconds of latency for the on-chain part.\n */\n async create(\n params: CreateAgentParams,\n idempotencyKey?: string\n ): Promise<CreateAgentResponse> {\n return this.client['request']<CreateAgentResponse>(\n 'POST',\n '/v1/agents',\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * List agents for the authenticated account, paginated.\n */\n async list(params?: ListAgentsParams): Promise<ListAgentsResponse> {\n const query = new URLSearchParams()\n if (params?.status) query.set('status', params.status)\n if (params?.type) query.set('type', params.type)\n if (params?.limit !== undefined) query.set('limit', String(params.limit))\n if (params?.offset !== undefined) query.set('offset', String(params.offset))\n if (params?.orderBy) query.set('orderBy', params.orderBy)\n if (params?.orderDirection) query.set('orderDirection', params.orderDirection)\n\n const qs = query.toString()\n return this.client['request']<ListAgentsResponse>(\n 'GET',\n qs ? `/v1/agents?${qs}` : '/v1/agents'\n )\n }\n\n /**\n * Get a single agent by id.\n */\n async get(agentId: string): Promise<Agent> {\n return this.client['request']<Agent>('GET', `/v1/agents/${agentId}`)\n }\n\n /**\n * Patch an agent's metadata fields. Cannot be used to flip status — use\n * `freeze`/`unfreeze` for that so the mandate-cascade and activity events\n * fire correctly.\n */\n async update(\n agentId: string,\n params: UpdateAgentParams,\n idempotencyKey?: string\n ): Promise<Agent> {\n return this.client['request']<Agent>(\n 'PATCH',\n `/v1/agents/${agentId}`,\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Freeze (kill switch) — sets status to `paused` and cascade-rejects every\n * pending mandate the agent has in flight. Idempotent.\n */\n async freeze(\n params: FreezeAgentParams,\n idempotencyKey?: string\n ): Promise<AgentStatusResponse> {\n const { agentId, ...body } = params\n return this.client['request']<AgentStatusResponse>(\n 'POST',\n `/v1/agents/${agentId}/freeze`,\n body,\n { idempotencyKey }\n )\n }\n\n /**\n * Unfreeze — sets status back to `active`. Previously cascade-rejected\n * mandates are NOT restored; the agent re-creates them on its next loop.\n */\n async unfreeze(\n params: UnfreezeAgentParams,\n idempotencyKey?: string\n ): Promise<AgentStatusResponse> {\n const { agentId } = params\n return this.client['request']<AgentStatusResponse>(\n 'POST',\n `/v1/agents/${agentId}/unfreeze`,\n undefined,\n { idempotencyKey }\n )\n }\n\n /**\n * Get the agent's wallet balance (USDC, on-chain at request time).\n */\n async getBalance(agentId: string): Promise<AgentBalance> {\n return this.client['request']<AgentBalance>(\n 'GET',\n `/v1/agents/${agentId}/balance`\n )\n }\n\n /**\n * Run a hypothetical transaction through the policy engine without\n * executing it. Returns the engine's decision (`auto_approve`, `auto_deny`,\n * or `requires_human_approval`) along with the matched rules. When the\n * decision is `requires_human_approval`, the engine creates a mandate row\n * and returns its id so the caller can watch for the operator's decision.\n */\n async evaluate(\n params: EvaluatePolicyParams,\n idempotencyKey?: string\n ): Promise<EvaluatePolicyResponse> {\n const { agentId, ...body } = params\n return this.client['request']<EvaluatePolicyResponse>(\n 'POST',\n `/v1/agents/${agentId}/evaluate`,\n body,\n { idempotencyKey }\n )\n }\n}\n","/**\n * Utility functions for Aura Payments SDK\n */\n\nimport { AuraTimeoutError, isRetryableError } from './errors'\n\n/**\n * Generate a unique idempotency key\n * Format: timestamp-random\n */\nexport function generateIdempotencyKey(): string {\n const timestamp = Date.now()\n const random = Math.random().toString(36).substring(2, 15)\n return `${timestamp}-${random}`\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Calculate exponential backoff delay\n * @param attempt - The retry attempt number (0-based)\n * @param baseDelay - Base delay in milliseconds (default: 1000ms)\n * @param maxDelay - Maximum delay in milliseconds (default: 30000ms)\n * @returns Delay in milliseconds\n */\nexport function calculateBackoff(\n attempt: number,\n baseDelay: number = 1000,\n maxDelay: number = 30000\n): number {\n // Exponential backoff: baseDelay * 2^attempt\n const exponentialDelay = baseDelay * Math.pow(2, attempt)\n\n // Add jitter (random 0-25%) to prevent thundering herd\n const jitter = exponentialDelay * Math.random() * 0.25\n\n // Cap at maxDelay\n return Math.min(exponentialDelay + jitter, maxDelay)\n}\n\n/**\n * Retry a function with exponential backoff\n * @param fn - The async function to retry\n * @param maxRetries - Maximum number of retry attempts\n * @param shouldRetry - Optional function to determine if error is retryable\n * @returns Promise with the function result\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n maxRetries: number = 3,\n shouldRetry: (error: unknown) => boolean = isRetryableError\n): Promise<T> {\n let lastError: unknown\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n\n // If this is the last attempt, throw the error\n if (attempt === maxRetries) {\n throw error\n }\n\n // Check if the error is retryable\n if (!shouldRetry(error)) {\n throw error\n }\n\n // Calculate backoff delay\n const delay = calculateBackoff(attempt)\n\n // Wait before retrying\n await sleep(delay)\n }\n }\n\n // This should never be reached, but TypeScript requires it\n throw lastError\n}\n\n/**\n * Execute with timeout\n * @param promise - The promise to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param timeoutMessage - Optional timeout error message\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n timeoutMessage?: string\n): Promise<T> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new AuraTimeoutError(timeoutMessage || `Request timeout after ${timeoutMs}ms`))\n }, timeoutMs)\n })\n\n return Promise.race([promise, timeoutPromise])\n}\n","/**\n * Escrows resource for Aura Payments SDK\n */\n\nimport type { AuraClient } from '../client'\nimport { AuraValidationError } from '../errors'\nimport type {\n Escrow,\n CreateEscrowParams,\n CreateEscrowResponse,\n FundEscrowParams,\n ReleaseEscrowParams,\n RefundEscrowParams,\n ListEscrowsParams,\n ListEscrowsResponse,\n CreateDisputeParams,\n Dispute,\n ReceiveAndSplitParams,\n ReceiveAndSplitResult,\n} from '../types/escrow'\nimport { generateIdempotencyKey } from '../utils'\n\n/** An escrow is fundable once its contract is confirmed deployed. */\nfunction isEscrowDeployed(e: {\n state?: string\n blockchain?: { deployed?: boolean } | undefined\n}): boolean {\n if (e.blockchain?.deployed) return true\n return ['deployed', 'funded', 'locked', 'released'].includes(e.state ?? '')\n}\n\n/**\n * Funding is asynchronous on the platform: the fund endpoint returns 202 with a\n * pending transfer, and a Circle webhook later finalizes the escrow to\n * funded/locked. We must NOT release until the escrow reaches a settled,\n * releasable state.\n */\nfunction isEscrowFunded(e: { state?: string }): boolean {\n return ['funded', 'locked', 'released'].includes(e.state ?? '')\n}\n\n/** Parse a USDC string for a pre-flight comparison (NOT a settlement op). */\nfunction parseUsdc(value: string): number {\n const n = Number.parseFloat(value)\n return Number.isFinite(n) ? n : 0\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, ms))\n\nexport class Escrows {\n constructor(private client: AuraClient) {}\n\n /**\n * Create a new escrow\n */\n async create(params: CreateEscrowParams, idempotencyKey?: string): Promise<CreateEscrowResponse> {\n return this.client['request']<CreateEscrowResponse>(\n 'POST',\n '/v1/escrow/create',\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Get escrow by ID\n */\n async get(escrowId: string): Promise<Escrow> {\n return this.client['request']<Escrow>('GET', `/v1/escrow/${escrowId}`)\n }\n\n /**\n * List escrows with optional filters\n */\n async list(params?: ListEscrowsParams): Promise<ListEscrowsResponse> {\n const queryParams = new URLSearchParams()\n if (params?.search) queryParams.set('search', params.search)\n if (params?.state) queryParams.set('state', params.state)\n if (params?.sortBy) queryParams.set('sortBy', params.sortBy)\n if (params?.limit) queryParams.set('limit', params.limit.toString())\n if (params?.offset) queryParams.set('offset', params.offset.toString())\n\n const query = queryParams.toString()\n const path = query ? `/v1/escrow?${query}` : '/v1/escrow'\n\n return this.client['request']<ListEscrowsResponse>('GET', path)\n }\n\n /**\n * Fund an escrow\n */\n async fund(params: FundEscrowParams, idempotencyKey?: string): Promise<Escrow> {\n const { escrowId, ...body } = params\n return this.client['request']<Escrow>(\n 'POST',\n `/v1/escrow/${escrowId}/fund`,\n body,\n { idempotencyKey }\n )\n }\n\n /**\n * Release an escrow\n */\n async release(params: ReleaseEscrowParams, idempotencyKey?: string): Promise<Escrow> {\n const { escrowId, ...body } = params\n return this.client['request']<Escrow>(\n 'POST',\n `/v1/escrow/${escrowId}/release`,\n body,\n { idempotencyKey }\n )\n }\n\n /**\n * Refund an escrow\n */\n async refund(params: RefundEscrowParams, idempotencyKey?: string): Promise<Escrow> {\n return this.client['request']<Escrow>(\n 'POST',\n `/v1/escrow/refund`,\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Receive USDC and split it across recipients in a single call (board D4).\n *\n * Composes the existing, crash-safe escrow path:\n * create → poll-until-deployed → pre-flight balance → fund → poll-until-funded → release.\n *\n * Funds move from an Aura wallet owned by `payerOwnerId` (the agent itself or a\n * counterparty). The result's `stage` makes a partial run explicit:\n * - `created` — deployment didn't confirm within `waitForDeploymentMs`\n * - `deployed` — payer wallet lacks funds (see `fundingRequired`); no money moved\n * - `funded` — funded but not released (`autoRelease:false`, or funding didn't\n * settle within `waitForFundingMs` → `fundingPending: true`)\n * - `released` — split to recipients (happy path)\n *\n * Resume note: a partial run is resumed by acting on the returned\n * `escrow.escrowId` (call `fund`/`release` directly) — NOT by re-calling\n * `receiveAndSplit`, which re-`create`s and would hit a duplicate-orderId error.\n * Pass a stable `idempotencyKey` for retry-safe fund/release.\n *\n * Funding is asynchronous and the platform's fund/release endpoints return\n * operation metadata (not a full escrow), so this method re-`get`s the escrow\n * for authoritative state + splits rather than trusting those response bodies.\n *\n * @throws AuraValidationError if split percentages don't sum to 100 (pre-flight).\n */\n async receiveAndSplit(\n params: ReceiveAndSplitParams\n ): Promise<ReceiveAndSplitResult> {\n const {\n orderId,\n payerOwnerId,\n amount,\n splits,\n chain,\n actorId,\n autoRelease = true,\n waitForDeploymentMs = 60_000,\n waitForFundingMs = 60_000,\n pollIntervalMs = 2_000,\n idempotencyKey,\n } = params\n\n // Pre-flight: percentages must sum to exactly 100 (avoid a doomed create).\n const pctSum = splits.reduce((acc, s) => acc + s.percentage, 0)\n if (Math.round(pctSum * 100) !== 10_000) {\n throw new AuraValidationError(\n `Split percentages must sum to 100 (got ${pctSum}).`,\n { splits }\n )\n }\n\n // Derive stable idempotency keys from one run key so fund/release retries hit\n // the platform's replay cache instead of a fresh random key per attempt.\n // Callers wanting cross-invocation retry safety pass their own key.\n const runKey = idempotencyKey ?? generateIdempotencyKey()\n const pollMs = Math.max(pollIntervalMs, 250)\n\n // 1. Create the escrow (async deployment by default).\n const created = await this.create(\n { orderId, buyerOwnerId: payerOwnerId, amount, chain, splits },\n `${runKey}-create`\n )\n const escrowId = created.escrowId\n\n // 2. Wait (bounded) for on-chain deployment before funds can move.\n const deployed = await this.pollEscrowUntil(\n escrowId,\n isEscrowDeployed,\n waitForDeploymentMs,\n pollMs,\n created as unknown as Escrow\n )\n if (!isEscrowDeployed(deployed)) {\n return {\n stage: 'created',\n escrow: deployed,\n splits: deployed.splits,\n deploymentPending: true,\n }\n }\n\n // 3. Pre-flight payer-balance check: stop cleanly before moving money if\n // the payer wallet can't cover the amount (deterministic, not error-sniffing).\n const payerWalletId = deployed.buyerWalletId\n const balance = await this.client.wallets.getBalance(payerWalletId)\n if (parseUsdc(balance.balance.usdc) < parseUsdc(amount)) {\n return {\n stage: 'deployed',\n escrow: deployed,\n splits: deployed.splits,\n fundingRequired: {\n payerWalletId,\n payerAddress: deployed.buyerWallet.address,\n amount,\n available: balance.balance.usdc,\n },\n }\n }\n\n // 4. Fund from the payer wallet. Funding is ASYNC and the fund endpoint\n // returns operation metadata (not an escrow) — ignore its body and poll.\n await this.fund(\n { escrowId, buyerWalletId: payerWalletId, amount },\n `${runKey}-fund`\n )\n\n // 4b. Wait until the escrow settles to funded/locked before releasing.\n const funded = await this.pollEscrowUntil(\n escrowId,\n isEscrowFunded,\n waitForFundingMs,\n pollMs,\n deployed\n )\n if (!isEscrowFunded(funded)) {\n // Funds didn't settle in time — do NOT release. Resume via escrowId.\n return { stage: 'funded', escrow: funded, splits: funded.splits, fundingPending: true }\n }\n\n if (!autoRelease) {\n return { stage: 'funded', escrow: funded, splits: funded.splits }\n }\n\n // 5. Release. Server-side per-split transfers are crash-safe & idempotent;\n // release returns metadata too, so re-get for the authoritative escrow.\n await this.release(\n { escrowId, actorId: actorId ?? payerOwnerId, reason: 'receiveAndSplit auto-release' },\n `${runKey}-release`\n )\n const final = await this.get(escrowId)\n return { stage: 'released', escrow: final, splits: final.splits }\n }\n\n /**\n * Poll `get(escrowId)` until `predicate` holds or `budgetMs` elapses. Returns\n * the last-observed escrow; the caller re-checks the predicate to branch.\n * `seed` is the escrow already in hand, checked before any poll so a\n * synchronously-settled escrow returns without a network round-trip.\n */\n private async pollEscrowUntil(\n escrowId: string,\n predicate: (e: Escrow) => boolean,\n budgetMs: number,\n pollMs: number,\n seed: Escrow\n ): Promise<Escrow> {\n let escrow = seed\n if (predicate(escrow)) return escrow\n const deadline = Date.now() + budgetMs\n while (Date.now() < deadline) {\n await sleep(pollMs)\n escrow = await this.get(escrowId)\n if (predicate(escrow)) break\n }\n return escrow\n }\n\n /**\n * Create a dispute for an escrow\n */\n async createDispute(params: CreateDisputeParams, idempotencyKey?: string): Promise<Dispute> {\n return this.client['request']<Dispute>(\n 'POST',\n `/v1/escrow/${params.escrowId}/dispute`,\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Get dispute details\n */\n async getDispute(escrowId: string, disputeId: string): Promise<Dispute> {\n return this.client['request']<Dispute>(\n 'GET',\n `/v1/escrow/${escrowId}/dispute/${disputeId}`\n )\n }\n}\n","/**\n * Mandates resource for the Aura Payments SDK.\n *\n * Wraps `/v1/agent/mandates/*` routes (operator-facing inbox). Approve/reject\n * require an HMAC decision signature — see `MandateSignature` helper below\n * for computing it client-side.\n */\n\nimport { createHmac } from 'node:crypto'\n\nimport type { AuraClient } from '../client'\nimport type {\n ApproveMandateParams,\n ListMandatesParams,\n ListMandatesResponse,\n Mandate,\n RejectMandateParams,\n} from '../types/mandate'\n\nexport class Mandates {\n constructor(private client: AuraClient) {}\n\n /**\n * List mandates for the authenticated account. Defaults to `status=pending`\n * so this acts as the operator's inbox out of the box.\n */\n async list(params?: ListMandatesParams): Promise<ListMandatesResponse> {\n const query = new URLSearchParams()\n if (params?.status) query.set('status', params.status)\n if (params?.agentId) query.set('agentId', params.agentId)\n if (params?.limit !== undefined) query.set('limit', String(params.limit))\n if (params?.cursor) query.set('cursor', params.cursor)\n\n const qs = query.toString()\n return this.client['request']<ListMandatesResponse>(\n 'GET',\n qs ? `/v1/agent/mandates?${qs}` : '/v1/agent/mandates'\n )\n }\n\n /**\n * Convenience wrapper for the most common case: pending mandates in\n * urgency order (most-expiring first).\n */\n async listPending(\n extras?: Omit<ListMandatesParams, 'status'>\n ): Promise<ListMandatesResponse> {\n return this.list({ ...extras, status: 'pending' })\n }\n\n /**\n * Get a single mandate by id.\n */\n async get(mandateId: string): Promise<Mandate> {\n return this.client['request']<Mandate>(\n 'GET',\n `/v1/agent/mandates/${mandateId}`\n )\n }\n\n /**\n * Approve a pending mandate. Caller is responsible for computing\n * `decisionSignature` — use `MandateSignature.compute()` below.\n *\n * Idempotent: re-approving an already-`approved` mandate returns 200 with\n * the existing decision. Approving a `rejected`/`cancelled` mandate\n * returns 409.\n */\n async approve(\n params: ApproveMandateParams,\n idempotencyKey?: string\n ): Promise<Mandate> {\n const { mandateId, ...body } = params\n return this.client['request']<Mandate>(\n 'POST',\n `/v1/agent/mandates/${mandateId}/approve`,\n body,\n { idempotencyKey }\n )\n }\n\n /**\n * Reject a pending mandate. Same signature scheme as `approve`.\n */\n async reject(\n params: RejectMandateParams,\n idempotencyKey?: string\n ): Promise<Mandate> {\n const { mandateId, ...body } = params\n return this.client['request']<Mandate>(\n 'POST',\n `/v1/agent/mandates/${mandateId}/reject`,\n body,\n { idempotencyKey }\n )\n }\n}\n\n// ============================================================================\n// Decision signature helper\n// ============================================================================\n\n/**\n * Computes / verifies the HMAC-SHA256 signature the platform requires when\n * deciding a mandate. The signature commits to the mandate id, the decision\n * verb, and the timestamp so a stolen \"approve\" payload can't be replayed\n * against a different mandate.\n *\n * Usage:\n * ```ts\n * const decidedAt = new Date().toISOString()\n * const sig = MandateSignature.compute({\n * mandateId,\n * decision: 'approve',\n * decidedAt,\n * secret: process.env.MANDATE_HMAC_SECRET!,\n * })\n * await client.mandates.approve({\n * mandateId,\n * decisionMethod: 'manual',\n * decisionSignature: sig,\n * decidedAt,\n * })\n * ```\n *\n * The platform's verify lives at `lib/agents/mandate-signature.ts` and uses\n * the same `${id}:${decision}:${decidedAt}` payload format. Keep them\n * synchronized.\n */\nexport const MandateSignature = {\n compute(input: {\n mandateId: string\n decision: 'approve' | 'reject'\n decidedAt: string\n secret: string\n }): string {\n const payload = `${input.mandateId}:${input.decision}:${input.decidedAt}`\n return createHmac('sha256', input.secret).update(payload).digest('hex')\n },\n\n verify(input: {\n mandateId: string\n decision: 'approve' | 'reject'\n decidedAt: string\n secret: string\n signature: string\n }): boolean {\n const expected = MandateSignature.compute({\n mandateId: input.mandateId,\n decision: input.decision,\n decidedAt: input.decidedAt,\n secret: input.secret,\n })\n // Constant-time comparison\n if (expected.length !== input.signature.length) return false\n let diff = 0\n for (let i = 0; i < expected.length; i++) {\n diff |= expected.charCodeAt(i) ^ input.signature.charCodeAt(i)\n }\n return diff === 0\n },\n}\n","/**\n * Policies resource for the Aura Payments SDK.\n *\n * Wraps `/v1/agents/{agentId}/policies/*` routes for managing the persistent\n * rules that drive the policy engine. Note: approving an `agent.policy.proposed`\n * mandate also creates a new policy server-side — this resource is for direct\n * policy CRUD outside the mandate flow.\n */\n\nimport type { AuraClient } from '../client'\nimport type {\n AgentPolicy,\n CreatePolicyParams,\n ListPoliciesResponse,\n} from '../types/policy'\n\nexport class Policies {\n constructor(private client: AuraClient) {}\n\n /**\n * List all policies attached to an agent.\n */\n async list(agentId: string): Promise<ListPoliciesResponse> {\n return this.client['request']<ListPoliciesResponse>(\n 'GET',\n `/v1/agents/${agentId}/policies`\n )\n }\n\n /**\n * Get a single policy by id (scoped to the parent agent).\n */\n async get(agentId: string, policyId: string): Promise<AgentPolicy> {\n return this.client['request']<AgentPolicy>(\n 'GET',\n `/v1/agents/${agentId}/policies/${policyId}`\n )\n }\n\n /**\n * Create a new policy for an agent. The agent's policy engine will start\n * matching against this policy on the next evaluation.\n */\n async create(\n params: CreatePolicyParams,\n idempotencyKey?: string\n ): Promise<AgentPolicy> {\n const { agentId, ...body } = params\n return this.client['request']<AgentPolicy>(\n 'POST',\n `/v1/agents/${agentId}/policies`,\n body,\n { idempotencyKey }\n )\n }\n}\n","/**\n * Wallets resource for Aura Payments SDK\n */\n\nimport type { AuraClient } from '../client'\nimport { AuraAPIError, AuraFaucetUnavailableError } from '../errors'\nimport type {\n Wallet,\n WalletBalance,\n CreateWalletParams,\n ResolvedWallet,\n TransferParams,\n Transfer,\n ListWalletsParams,\n ListWalletsResponse,\n RequestTestnetFundsParams,\n RequestTestnetFundsResponse,\n} from '../types/wallet'\n\nexport class Wallets {\n constructor(private client: AuraClient) {}\n\n /**\n * Create a new wallet\n */\n async create(params: CreateWalletParams, idempotencyKey?: string): Promise<ResolvedWallet> {\n return this.client['request']<ResolvedWallet>(\n 'POST',\n '/v1/wallets',\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Get wallet by ID\n */\n async get(walletId: string): Promise<Wallet> {\n return this.client['request']<Wallet>('GET', `/v1/wallets/${walletId}`)\n }\n\n /**\n * List wallets with optional filters\n */\n async list(params?: ListWalletsParams): Promise<ListWalletsResponse> {\n const queryParams = new URLSearchParams()\n if (params?.entityId) queryParams.set('entityId', params.entityId)\n if (params?.chain) queryParams.set('chain', params.chain)\n if (params?.type) queryParams.set('type', params.type)\n if (params?.page) queryParams.set('page', params.page.toString())\n if (params?.limit) queryParams.set('limit', params.limit.toString())\n\n const query = queryParams.toString()\n const path = query ? `/v1/wallets?${query}` : '/v1/wallets'\n\n return this.client['request']<ListWalletsResponse>('GET', path)\n }\n\n /**\n * Get wallet balance\n */\n async getBalance(walletId: string): Promise<WalletBalance> {\n return this.client['request']<WalletBalance>(\n 'GET',\n `/v1/wallets/${walletId}/balance`\n )\n }\n\n /**\n * Transfer funds from wallet\n */\n async transfer(params: TransferParams): Promise<Transfer> {\n const idempotencyKey = params.idempotencyKey || this.generateIdempotencyKey()\n\n return this.client['request']<Transfer>(\n 'POST',\n `/v1/wallets/${params.fromWalletId}/transfer`,\n params,\n { idempotencyKey }\n )\n }\n\n /**\n * Request testnet funds (USDC) for a wallet from the platform faucet.\n *\n * Testnet only. Backed by `POST /v1/wallets/:id/faucet`, provided by the\n * platform (AURA-010). Until that endpoint ships, this capability-probes and\n * raises {@link AuraFaucetUnavailableError} (rather than a generic 404/501)\n * so callers can degrade gracefully to manual funding.\n */\n async requestTestnetFunds(\n walletId: string,\n params?: RequestTestnetFundsParams\n ): Promise<RequestTestnetFundsResponse> {\n try {\n return await this.client['request']<RequestTestnetFundsResponse>(\n 'POST',\n `/v1/wallets/${walletId}/faucet`,\n params ?? {}\n )\n } catch (err) {\n // Capability probe: a 501 means the faucet endpoint isn't implemented on\n // this deployment. We do NOT treat 404 as \"faucet unavailable\" — a 404 is\n // ambiguous (missing route vs wallet-not-found), so masking it would hide a\n // bad walletId. The faucet endpoint MUST return 501 (not 404) while\n // unimplemented — see docs/plans/2026-06-11-aura-010-faucet-endpoint-handoff.md.\n if (err instanceof AuraAPIError && err.statusCode === 501) {\n throw new AuraFaucetUnavailableError(\n 'Testnet faucet is not enabled on this deployment yet ' +\n '(POST /v1/wallets/:id/faucet returned 501). Fund the wallet manually, ' +\n 'or ask the operator to enable the faucet endpoint.'\n )\n }\n throw err\n }\n }\n\n /**\n * Get transfer by ID\n */\n async getTransfer(walletId: string, transferId: string): Promise<Transfer> {\n return this.client['request']<Transfer>(\n 'GET',\n `/v1/wallets/${walletId}/transfers/${transferId}`\n )\n }\n\n /**\n * Generate a unique idempotency key\n */\n private generateIdempotencyKey(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`\n }\n}\n","/**\n * Webhooks resource and utilities for Aura Payments SDK\n */\n\nimport { createHmac } from 'node:crypto'\n\nimport type { AuraClient } from '../client'\nimport type {\n WebhookConfig,\n WebhookConfigWithSecret,\n ConfigureWebhookParams,\n WebhookEvent,\n ValidateWebhookSignatureOptions,\n WebhookValidationResult,\n} from '../types/webhook'\n\nexport class Webhooks {\n constructor(private client: AuraClient) {}\n\n /**\n * Configure webhook endpoint and events\n */\n async configure(params: ConfigureWebhookParams): Promise<WebhookConfigWithSecret> {\n return this.client['request']<WebhookConfigWithSecret>(\n 'POST',\n '/v1/webhooks/config',\n params\n )\n }\n\n /**\n * Get current webhook configuration\n */\n async getConfig(): Promise<WebhookConfig> {\n return this.client['request']<WebhookConfig>('GET', '/v1/webhooks/config')\n }\n\n /**\n * Delete webhook configuration\n */\n async delete(): Promise<{ deleted: true; message: string }> {\n return this.client['request']<{ deleted: true; message: string }>(\n 'DELETE',\n '/v1/webhooks/config'\n )\n }\n\n /**\n * Validate webhook signature\n * Use this in your webhook handler to verify authenticity\n */\n static validateSignature(options: ValidateWebhookSignatureOptions): WebhookValidationResult {\n try {\n const { payload, signature, secret, toleranceMs = 300_000 } = options\n\n // Convert payload to string if it's an object\n const payloadString = typeof payload === 'string' ? payload : JSON.stringify(payload)\n\n // Signature header format: \"t=timestamp,v1=hex\"\n const { timestamp, v1 } = this.parseSignatureHeader(signature)\n\n // Enforce tolerance window\n const ageMs = Math.abs(Date.now() - timestamp)\n if (ageMs > toleranceMs) {\n return { valid: false, error: 'Signature timestamp expired' }\n }\n\n // Compute HMAC signature over `${timestamp}.${payload}`\n const expectedSignature = this.computeHmacSignature(`${timestamp}.${payloadString}`, secret)\n\n // Constant-time comparison to prevent timing attacks\n const valid = this.secureCompare(v1, expectedSignature)\n\n if (!valid) {\n return {\n valid: false,\n error: 'Invalid signature',\n }\n }\n\n // Parse the event\n const event: WebhookEvent = typeof payload === 'string' ? JSON.parse(payload) : payload\n\n return {\n valid: true,\n event,\n }\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n }\n }\n }\n\n /**\n * Parse signature header: \"t=timestamp,v1=signature\"\n */\n private static parseSignatureHeader(signatureHeader: string): { timestamp: number; v1: string } {\n const parts = signatureHeader.split(',').map((p) => p.trim())\n const tPart = parts.find((p) => p.startsWith('t='))\n const v1Part = parts.find((p) => p.startsWith('v1='))\n\n if (!tPart || !v1Part) {\n throw new Error('Invalid signature header format (expected: t=...,v1=...)')\n }\n\n const timestamp = parseInt(tPart.slice(2), 10)\n const v1 = v1Part.slice(3)\n\n if (!Number.isFinite(timestamp) || timestamp <= 0) {\n throw new Error('Invalid signature timestamp')\n }\n if (!v1) {\n throw new Error('Invalid signature value')\n }\n\n return { timestamp, v1 }\n }\n\n /**\n * Compute HMAC-SHA256 signature\n */\n private static computeHmacSignature(payload: string, secret: string): string {\n // Note: In a real implementation, you'd use Node.js crypto or Web Crypto API\n // This is a placeholder that should be implemented based on the environment\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n // Browser environment - use Web Crypto API\n throw new Error('Web Crypto implementation needed for browser')\n }\n\n return createHmac('sha256', secret).update(payload).digest('hex')\n }\n\n /**\n * Constant-time string comparison\n */\n private static secureCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false\n }\n\n let result = 0\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n\n return result === 0\n }\n}\n","/**\n * Aura Payments SDK Client\n * Main entry point for interacting with the Aura Payments Platform API\n */\n\nimport {\n AuraError,\n AuraAPIError,\n AuraNetworkError,\n AuraTimeoutError,\n AuraAuthenticationError,\n AuraNotFoundError,\n AuraRateLimitError,\n AuraValidationError,\n} from './errors'\nimport { Agents } from './resources/agents'\nimport { Escrows } from './resources/escrows'\nimport { Mandates } from './resources/mandates'\nimport { Policies } from './resources/policies'\nimport { Wallets } from './resources/wallets'\nimport { Webhooks } from './resources/webhooks'\nimport { retryWithBackoff, generateIdempotencyKey, withTimeout } from './utils'\n\nexport interface AuraClientConfig {\n /**\n * API key for authentication\n */\n apiKey: string\n\n /**\n * Base URL of the Aura Platform API.\n *\n * Accepts either a bare hostname (`https://getaura.sh`) or a hostname\n * including the `/api` path (`https://getaura.sh/api`). The SDK appends\n * `/api` automatically if it's missing, so resource paths like `/v1/escrow`\n * always resolve to `https://your-host/api/v1/escrow`.\n *\n * @default 'https://getaura.sh/api'\n */\n baseUrl?: string\n\n /**\n * Request timeout in milliseconds\n * @default 30000\n */\n timeout?: number\n\n /**\n * Maximum number of retry attempts for failed requests\n * @default 3\n */\n maxRetries?: number\n\n /**\n * Enable automatic idempotency key generation\n * @default true\n */\n autoIdempotency?: boolean\n}\n\ninterface RequestOptions {\n idempotencyKey?: string\n skipRetry?: boolean\n}\n\nexport class AuraClient {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly maxRetries: number\n private readonly autoIdempotency: boolean\n\n // Resource instances\n public readonly escrows: Escrows\n public readonly wallets: Wallets\n public readonly webhooks: Webhooks\n // Agent-native resources (added in 2.1.0)\n public readonly agents: Agents\n public readonly policies: Policies\n public readonly mandates: Mandates\n\n constructor(config: AuraClientConfig) {\n this.apiKey = config.apiKey\n this.baseUrl = AuraClient.normalizeBaseUrl(config.baseUrl)\n this.timeout = config.timeout || 30000\n this.maxRetries = config.maxRetries || 3\n this.autoIdempotency = config.autoIdempotency !== false // default true\n\n if (!this.apiKey) {\n throw new AuraError('API key is required', 'MISSING_API_KEY')\n }\n\n // Initialize resources\n this.escrows = new Escrows(this)\n this.wallets = new Wallets(this)\n this.webhooks = new Webhooks(this)\n this.agents = new Agents(this)\n this.policies = new Policies(this)\n this.mandates = new Mandates(this)\n }\n\n /**\n * Normalize the base URL so resource paths like `/v1/escrow` reach the\n * platform's `/api/v1/escrow` route regardless of how the caller framed\n * `baseUrl`. Trailing slashes are trimmed; missing `/api` is appended.\n *\n * @internal exported pattern for tests; do not call directly.\n */\n private static normalizeBaseUrl(input?: string): string {\n const raw = (input || 'https://getaura.sh/api').replace(/\\/+$/, '')\n // If the base already ends with `/api` (or contains it before query),\n // leave it alone. Otherwise append `/api` so `${base}/v1/...` resolves\n // to `https://host/api/v1/...`.\n if (/\\/api(\\/v\\d+)?$/.test(raw) || /\\/api$/.test(raw)) {\n return raw\n }\n return `${raw}/api`\n }\n\n /**\n * Get the API key\n */\n getApiKey(): string {\n return this.apiKey\n }\n\n /**\n * Get the base URL\n */\n getBaseUrl(): string {\n return this.baseUrl\n }\n\n /**\n * Get the timeout value\n */\n getTimeout(): number {\n return this.timeout\n }\n\n /**\n * Get the max retries value\n */\n getMaxRetries(): number {\n return this.maxRetries\n }\n\n /**\n * Make an authenticated request to the API with automatic retry logic\n */\n protected async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n const requestFn = () => this.executeRequest<T>(method, path, body, options)\n\n // Skip retry for certain operations or if explicitly disabled\n if (options?.skipRetry || method === 'GET') {\n return requestFn()\n }\n\n // Use retry logic with exponential backoff\n return retryWithBackoff(requestFn, this.maxRetries)\n }\n\n /**\n * Execute a single HTTP request (internal)\n */\n private async executeRequest<T>(\n method: string,\n path: string,\n body?: unknown,\n options?: RequestOptions\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n 'User-Agent': '@aura-payments/sdk/2.1.0',\n }\n\n // Add idempotency key (auto-generate for POST/PUT if enabled)\n if (options?.idempotencyKey) {\n headers['Idempotency-Key'] = options.idempotencyKey\n } else if (this.autoIdempotency && (method === 'POST' || method === 'PUT')) {\n headers['Idempotency-Key'] = generateIdempotencyKey()\n }\n\n try {\n // Execute request with timeout\n const response = await withTimeout(\n fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n }),\n this.timeout\n )\n\n // Handle different status codes\n if (!response.ok) {\n await this.handleErrorResponse(response)\n }\n\n // Handle empty responses (204 No Content)\n if (response.status === 204) {\n return undefined as T\n }\n\n // Parse and return JSON response\n const data = await response.json()\n return this.normalizeResponse<T>(data)\n } catch (error) {\n // Convert network errors to AuraNetworkError\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new AuraNetworkError('Network request failed', error)\n }\n\n // Re-throw Aura errors as-is\n if (error instanceof AuraError) {\n throw error\n }\n\n // Wrap unknown errors\n throw new AuraError(\n error instanceof Error ? error.message : 'Unknown error occurred',\n 'UNKNOWN_ERROR'\n )\n }\n }\n\n /**\n * Normalize API responses across different wrapper formats.\n *\n * The platform API currently uses two common success wrappers:\n * - { success: true, data: T, ... }\n * - { data: T, meta: {...} } (and sometimes { data: T[], meta, pagination })\n *\n * SDK methods generally return the inner `data` payload, except for paginated\n * endpoints where pagination metadata is meaningful and preserved.\n */\n private normalizeResponse<T>(payload: unknown): T {\n if (!payload || typeof payload !== 'object') return payload as T\n\n const obj = payload as Record<string, unknown>\n\n // Wrapper: { success: true|false, data: ... }\n if ('success' in obj && 'data' in obj) {\n return obj.data as T\n }\n\n // Wrapper: { data: ..., meta: ... } or { data: ..., metadata: ... } (optionally with pagination)\n if ('data' in obj && ('meta' in obj || 'metadata' in obj)) {\n if ('pagination' in obj) {\n // Keep paginated wrapper (includes pagination + meta)\n return obj as T\n }\n // Unwrap non-paginated success wrapper to its data payload\n return obj.data as T\n }\n\n // Wrapper: { data: ... } (simple wrapper without meta)\n if ('data' in obj && Object.keys(obj).length <= 2) {\n return obj.data as T\n }\n\n // Unrecognized shape: return as-is\n return payload as T\n }\n\n /**\n * Handle HTTP error responses and throw appropriate errors\n */\n private async handleErrorResponse(response: Response): Promise<never> {\n const statusCode = response.status\n let errorData: { message?: string; code?: string; details?: unknown } = {}\n\n try {\n const data = await response.json()\n if (typeof data === 'object' && data !== null) {\n errorData = data as { message?: string; code?: string; details?: unknown }\n }\n } catch {\n // If response body is not JSON, use status text\n errorData = { message: response.statusText }\n }\n\n const message = errorData.message || `HTTP ${statusCode} error`\n const code = errorData.code\n const details = errorData.details\n\n // Map specific status codes to error types\n switch (statusCode) {\n case 400:\n throw new AuraValidationError(message, details)\n case 401:\n throw new AuraAuthenticationError(message)\n case 404:\n throw new AuraNotFoundError(message)\n case 429:\n {\n const retryAfter = response.headers.get('Retry-After')\n throw new AuraRateLimitError(message, retryAfter ? parseInt(retryAfter) : undefined)\n }\n case 408:\n throw new AuraTimeoutError(message)\n default:\n throw new AuraAPIError(message, statusCode, code, details)\n }\n }\n\n /**\n * Get the auto-idempotency setting\n */\n getAutoIdempotency(): boolean {\n return this.autoIdempotency\n }\n}\n"]}
|