@orbserv-labs/orb-wallet 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.
- package/LICENSE +21 -0
- package/README.md +181 -0
- package/dist/client.d.ts +49 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +51 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/agent-wallet.d.ts +118 -0
- package/dist/modules/agent-wallet.d.ts.map +1 -0
- package/dist/modules/agent-wallet.js +136 -0
- package/dist/modules/agent-wallet.js.map +1 -0
- package/dist/modules/policy.d.ts +51 -0
- package/dist/modules/policy.d.ts.map +1 -0
- package/dist/modules/policy.js +65 -0
- package/dist/modules/policy.js.map +1 -0
- package/dist/modules/wallet.d.ts +70 -0
- package/dist/modules/wallet.d.ts.map +1 -0
- package/dist/modules/wallet.js +85 -0
- package/dist/modules/wallet.js.map +1 -0
- package/dist/modules/x402.d.ts +45 -0
- package/dist/modules/x402.d.ts.map +1 -0
- package/dist/modules/x402.js +85 -0
- package/dist/modules/x402.js.map +1 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +22 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +44 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/http.d.ts +35 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +105 -0
- package/dist/utils/http.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OrbAuthError = exports.OrbApiError = exports.OrbError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base error class for all orb-wallet SDK errors.
|
|
6
|
+
*/
|
|
7
|
+
class OrbError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "OrbError";
|
|
11
|
+
// Maintain proper prototype chain in transpiled ES5+
|
|
12
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.OrbError = OrbError;
|
|
16
|
+
/**
|
|
17
|
+
* Thrown when the API returns a non-2xx response.
|
|
18
|
+
* Contains the HTTP status code and the raw response body.
|
|
19
|
+
*/
|
|
20
|
+
class OrbApiError extends OrbError {
|
|
21
|
+
constructor(statusCode, body) {
|
|
22
|
+
const message = typeof body === "object" && body !== null && "message" in body
|
|
23
|
+
? String(body.message)
|
|
24
|
+
: `API error ${statusCode}`;
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = "OrbApiError";
|
|
27
|
+
this.statusCode = statusCode;
|
|
28
|
+
this.body = body;
|
|
29
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.OrbApiError = OrbApiError;
|
|
33
|
+
/**
|
|
34
|
+
* Thrown when the request fails due to authentication issues (401 / 403).
|
|
35
|
+
*/
|
|
36
|
+
class OrbAuthError extends OrbApiError {
|
|
37
|
+
constructor(statusCode, body) {
|
|
38
|
+
super(statusCode, body);
|
|
39
|
+
this.name = "OrbAuthError";
|
|
40
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.OrbAuthError = OrbAuthError;
|
|
44
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,qDAAqD;QACrD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAPD,4BAOC;AAED;;;GAGG;AACH,MAAa,WAAY,SAAQ,QAAQ;IAIvC,YAAY,UAAkB,EAAE,IAAa;QAC3C,MAAM,OAAO,GACX,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,IAAI;YAC5D,CAAC,CAAC,MAAM,CAAE,IAAgC,CAAC,OAAO,CAAC;YACnD,CAAC,CAAC,aAAa,UAAU,EAAE,CAAC;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAfD,kCAeC;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,WAAW;IAC3C,YAAY,UAAkB,EAAE,IAAa;QAC3C,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAND,oCAMC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight HTTP client that attaches the Bearer token and handles errors.
|
|
3
|
+
* Uses the global `fetch` (Node 18+, browsers). No runtime dependencies.
|
|
4
|
+
*/
|
|
5
|
+
export declare class HttpClient {
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
private readonly apiKey;
|
|
8
|
+
constructor(baseUrl: string, apiKey: string);
|
|
9
|
+
private buildUrl;
|
|
10
|
+
private headers;
|
|
11
|
+
private handleResponse;
|
|
12
|
+
/**
|
|
13
|
+
* Perform a GET request.
|
|
14
|
+
* @param path - API path relative to baseUrl, e.g. `/wallets/abc`
|
|
15
|
+
*/
|
|
16
|
+
get<T>(path: string): Promise<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Perform a POST request with a JSON body.
|
|
19
|
+
*/
|
|
20
|
+
post<T>(path: string, body?: unknown): Promise<T>;
|
|
21
|
+
/**
|
|
22
|
+
* Perform a PATCH request with a JSON body.
|
|
23
|
+
*/
|
|
24
|
+
patch<T>(path: string, body?: unknown): Promise<T>;
|
|
25
|
+
/**
|
|
26
|
+
* Perform a DELETE request.
|
|
27
|
+
*/
|
|
28
|
+
delete<T>(path: string): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Perform an arbitrary fetch, forwarding the Authorization header.
|
|
31
|
+
* Used by `wallet.fetch()` for x402 auto-pay flows.
|
|
32
|
+
*/
|
|
33
|
+
proxyFetch(url: string, init?: RequestInit): Promise<Response>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAS3C,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,OAAO;YAQD,cAAc;IA0B5B;;;OAGG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAQtC;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IASvD;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IASxD;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAQzC;;;OAGG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;CAOrE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpClient = void 0;
|
|
4
|
+
const errors_js_1 = require("./errors.js");
|
|
5
|
+
/**
|
|
6
|
+
* Lightweight HTTP client that attaches the Bearer token and handles errors.
|
|
7
|
+
* Uses the global `fetch` (Node 18+, browsers). No runtime dependencies.
|
|
8
|
+
*/
|
|
9
|
+
class HttpClient {
|
|
10
|
+
constructor(baseUrl, apiKey) {
|
|
11
|
+
this.baseUrl = baseUrl.replace(/\/$/, ""); // strip trailing slash
|
|
12
|
+
this.apiKey = apiKey;
|
|
13
|
+
}
|
|
14
|
+
// -------------------------------------------------------------------------
|
|
15
|
+
// Private helpers
|
|
16
|
+
// -------------------------------------------------------------------------
|
|
17
|
+
buildUrl(path) {
|
|
18
|
+
return `${this.baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
19
|
+
}
|
|
20
|
+
headers(extra) {
|
|
21
|
+
return {
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
24
|
+
...extra,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async handleResponse(response) {
|
|
28
|
+
let body;
|
|
29
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
30
|
+
try {
|
|
31
|
+
body = contentType.includes("application/json")
|
|
32
|
+
? await response.json()
|
|
33
|
+
: await response.text();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
body = null;
|
|
37
|
+
}
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
if (response.status === 401 || response.status === 403) {
|
|
40
|
+
throw new errors_js_1.OrbAuthError(response.status, body);
|
|
41
|
+
}
|
|
42
|
+
throw new errors_js_1.OrbApiError(response.status, body);
|
|
43
|
+
}
|
|
44
|
+
return body;
|
|
45
|
+
}
|
|
46
|
+
// -------------------------------------------------------------------------
|
|
47
|
+
// Public HTTP verbs
|
|
48
|
+
// -------------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* Perform a GET request.
|
|
51
|
+
* @param path - API path relative to baseUrl, e.g. `/wallets/abc`
|
|
52
|
+
*/
|
|
53
|
+
async get(path) {
|
|
54
|
+
const response = await fetch(this.buildUrl(path), {
|
|
55
|
+
method: "GET",
|
|
56
|
+
headers: this.headers(),
|
|
57
|
+
});
|
|
58
|
+
return this.handleResponse(response);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Perform a POST request with a JSON body.
|
|
62
|
+
*/
|
|
63
|
+
async post(path, body) {
|
|
64
|
+
const response = await fetch(this.buildUrl(path), {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: this.headers(),
|
|
67
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
68
|
+
});
|
|
69
|
+
return this.handleResponse(response);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Perform a PATCH request with a JSON body.
|
|
73
|
+
*/
|
|
74
|
+
async patch(path, body) {
|
|
75
|
+
const response = await fetch(this.buildUrl(path), {
|
|
76
|
+
method: "PATCH",
|
|
77
|
+
headers: this.headers(),
|
|
78
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
79
|
+
});
|
|
80
|
+
return this.handleResponse(response);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Perform a DELETE request.
|
|
84
|
+
*/
|
|
85
|
+
async delete(path) {
|
|
86
|
+
const response = await fetch(this.buildUrl(path), {
|
|
87
|
+
method: "DELETE",
|
|
88
|
+
headers: this.headers(),
|
|
89
|
+
});
|
|
90
|
+
return this.handleResponse(response);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Perform an arbitrary fetch, forwarding the Authorization header.
|
|
94
|
+
* Used by `wallet.fetch()` for x402 auto-pay flows.
|
|
95
|
+
*/
|
|
96
|
+
async proxyFetch(url, init) {
|
|
97
|
+
const mergedHeaders = {
|
|
98
|
+
...this.headers(),
|
|
99
|
+
...init?.headers,
|
|
100
|
+
};
|
|
101
|
+
return fetch(url, { ...init, headers: mergedHeaders });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.HttpClient = HttpClient;
|
|
105
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@orbserv-labs/orb-wallet",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TypeScript SDK for the orbserv agent wallet API — multi-chain wallets, x402 auto-pay, and spending policies for AI agents",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"wallet",
|
|
7
|
+
"agent-wallet",
|
|
8
|
+
"x402",
|
|
9
|
+
"solana",
|
|
10
|
+
"base",
|
|
11
|
+
"ethereum",
|
|
12
|
+
"arbitrum",
|
|
13
|
+
"usdc",
|
|
14
|
+
"ai-agent",
|
|
15
|
+
"orbserv"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://orbserv.co",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"author": "orbserv Labs",
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"module": "./dist/index.js",
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"default": "./dist/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md",
|
|
32
|
+
"LICENSE"
|
|
33
|
+
],
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc -p tsconfig.build.json",
|
|
39
|
+
"build:cjs": "tsc -p tsconfig.build.json --module commonjs --outDir dist/cjs",
|
|
40
|
+
"dev": "tsc --watch",
|
|
41
|
+
"lint": "tsc --noEmit",
|
|
42
|
+
"prepublishOnly": "npm run lint && npm run build",
|
|
43
|
+
"clean": "rm -rf dist"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18.0.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^20.19.41",
|
|
50
|
+
"typescript": "^5.9.3"
|
|
51
|
+
}
|
|
52
|
+
}
|