@agentspend/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,53 @@
1
+ export interface ChargeRequest {
2
+ wallet_id: string;
3
+ amount_cents: number;
4
+ currency?: string;
5
+ description?: string;
6
+ metadata?: Record<string, string>;
7
+ idempotency_key?: string;
8
+ }
9
+ export interface ChargeResponse {
10
+ charged: true;
11
+ wallet_id: string;
12
+ amount_cents: number;
13
+ currency: string;
14
+ remaining_limit_cents: number;
15
+ stripe_payment_intent_id: string;
16
+ stripe_charge_id: string;
17
+ charge_attempt_id: string;
18
+ }
19
+ export interface AgentSpendOptions {
20
+ platformApiBaseUrl: string;
21
+ serviceApiKey: string;
22
+ fetchImpl?: typeof fetch;
23
+ }
24
+ export interface ChargeOptions {
25
+ amount_cents: number;
26
+ currency?: string;
27
+ description?: string;
28
+ metadata?: Record<string, string>;
29
+ idempotency_key?: string;
30
+ }
31
+ export declare class AgentSpendChargeError extends Error {
32
+ statusCode: number;
33
+ details: unknown;
34
+ constructor(message: string, statusCode: number, details?: unknown);
35
+ }
36
+ export interface HonoContextLike {
37
+ req: {
38
+ header(name: string): string | undefined;
39
+ json(): Promise<unknown>;
40
+ };
41
+ json(body: unknown, status?: number): unknown;
42
+ }
43
+ export interface PaywallOptions {
44
+ currency?: string;
45
+ description?: string;
46
+ metadata?: (body: unknown) => Record<string, unknown>;
47
+ }
48
+ export interface AgentSpend {
49
+ charge(walletId: string, opts: ChargeOptions): Promise<ChargeResponse>;
50
+ paywall(amountCents: number, opts?: PaywallOptions): (c: HonoContextLike, next: () => Promise<void>) => Promise<unknown>;
51
+ }
52
+ export declare function createAgentSpend(options: AgentSpendOptions): AgentSpend;
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAMD,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;gBAEL,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAKnE;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE;QACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QACzC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;KAC1B,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACvE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1H;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CA8FvE"}
package/dist/index.js ADDED
@@ -0,0 +1,129 @@
1
+ export class AgentSpendChargeError extends Error {
2
+ statusCode;
3
+ details;
4
+ constructor(message, statusCode, details) {
5
+ super(message);
6
+ this.statusCode = statusCode;
7
+ this.details = details;
8
+ }
9
+ }
10
+ export function createAgentSpend(options) {
11
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
12
+ if (!fetchImpl) {
13
+ throw new AgentSpendChargeError("No fetch implementation available", 500);
14
+ }
15
+ async function charge(walletIdInput, opts) {
16
+ const walletId = toWalletId(walletIdInput);
17
+ if (!walletId) {
18
+ throw new AgentSpendChargeError("wallet_id must start with wal_", 400);
19
+ }
20
+ if (!Number.isInteger(opts.amount_cents) || opts.amount_cents <= 0) {
21
+ throw new AgentSpendChargeError("amount_cents must be a positive integer", 400);
22
+ }
23
+ const payload = {
24
+ wallet_id: walletId,
25
+ amount_cents: opts.amount_cents,
26
+ currency: opts.currency ?? "usd",
27
+ ...(opts.description ? { description: opts.description } : {}),
28
+ ...(opts.metadata ? { metadata: opts.metadata } : {}),
29
+ idempotency_key: opts.idempotency_key ?? bestEffortIdempotencyKey()
30
+ };
31
+ const response = await fetchImpl(joinUrl(options.platformApiBaseUrl, "/v1/charge"), {
32
+ method: "POST",
33
+ headers: {
34
+ authorization: `Bearer ${options.serviceApiKey}`,
35
+ "content-type": "application/json"
36
+ },
37
+ body: JSON.stringify(payload)
38
+ });
39
+ const responseBody = (await response.json().catch(() => ({})));
40
+ if (!response.ok) {
41
+ throw new AgentSpendChargeError(typeof responseBody.error === "string" ? responseBody.error : "AgentSpend charge failed", response.status, responseBody);
42
+ }
43
+ return responseBody;
44
+ }
45
+ function paywall(amountCents, opts) {
46
+ if (!Number.isInteger(amountCents) || amountCents <= 0) {
47
+ throw new AgentSpendChargeError("amountCents must be a positive integer", 500);
48
+ }
49
+ return async function paywallMiddleware(c, next) {
50
+ const walletIdFromHeader = c.req.header("x-wallet-id");
51
+ let body = null;
52
+ let walletId = walletIdFromHeader ? toWalletId(walletIdFromHeader) : null;
53
+ if (!walletId || opts?.metadata) {
54
+ body = await c.req.json().catch(() => ({}));
55
+ if (!walletId) {
56
+ const bodyWalletId = typeof body?.wallet_id === "string" ? body.wallet_id : null;
57
+ walletId = toWalletId(bodyWalletId);
58
+ }
59
+ }
60
+ if (!walletId) {
61
+ return c.json({ error: "wallet_id is required (x-wallet-id header or JSON body wallet_id)" }, 400);
62
+ }
63
+ try {
64
+ await charge(walletId, {
65
+ amount_cents: amountCents,
66
+ currency: opts?.currency ?? "usd",
67
+ description: opts?.description,
68
+ metadata: opts?.metadata ? toStringMetadata(opts.metadata(body)) : undefined,
69
+ idempotency_key: c.req.header("x-request-id") ?? c.req.header("idempotency-key") ?? undefined
70
+ });
71
+ }
72
+ catch (error) {
73
+ if (error instanceof AgentSpendChargeError) {
74
+ if (error.statusCode === 402) {
75
+ return c.json({ error: "Payment required", details: error.details }, 402);
76
+ }
77
+ return c.json({ error: error.message, details: error.details }, error.statusCode);
78
+ }
79
+ return c.json({ error: "Unexpected paywall failure" }, 500);
80
+ }
81
+ await next();
82
+ };
83
+ }
84
+ return {
85
+ charge,
86
+ paywall
87
+ };
88
+ }
89
+ function toWalletId(input) {
90
+ if (typeof input !== "string") {
91
+ return null;
92
+ }
93
+ const trimmed = input.trim();
94
+ if (!trimmed.startsWith("wal_")) {
95
+ return null;
96
+ }
97
+ return trimmed;
98
+ }
99
+ function joinUrl(base, path) {
100
+ const normalizedBase = base.endsWith("/") ? base.slice(0, -1) : base;
101
+ const normalizedPath = path.startsWith("/") ? path : `/${path}`;
102
+ return `${normalizedBase}${normalizedPath}`;
103
+ }
104
+ function bestEffortIdempotencyKey() {
105
+ const uuid = globalThis.crypto?.randomUUID?.();
106
+ if (uuid) {
107
+ return uuid;
108
+ }
109
+ return `auto_${Date.now()}_${Math.random().toString(16).slice(2)}`;
110
+ }
111
+ function toStringMetadata(input) {
112
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
113
+ return {};
114
+ }
115
+ const result = {};
116
+ for (const [key, value] of Object.entries(input)) {
117
+ if (typeof value === "string") {
118
+ result[key] = value;
119
+ }
120
+ else if (typeof value === "number" && Number.isFinite(value)) {
121
+ result[key] = String(value);
122
+ }
123
+ else if (typeof value === "boolean") {
124
+ result[key] = value ? "true" : "false";
125
+ }
126
+ }
127
+ return result;
128
+ }
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@agentspend/sdk",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "prepublishOnly": "bun run build",
22
+ "typecheck": "tsc --noEmit -p tsconfig.json"
23
+ }
24
+ }