@vapi-network/core 0.2.3 → 0.5.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/README.md +18 -5
- package/dist/accounts.d.ts.map +1 -1
- package/dist/agent-guard.d.ts +40 -0
- package/dist/agent-guard.d.ts.map +1 -0
- package/dist/agent-link.d.ts +98 -0
- package/dist/agent-link.d.ts.map +1 -0
- package/dist/agent-link.js +1715 -0
- package/dist/agent-link.js.map +6 -0
- package/dist/agent-profile.d.ts +27 -0
- package/dist/agent-profile.d.ts.map +1 -0
- package/dist/api-key.d.ts +99 -0
- package/dist/api-key.d.ts.map +1 -0
- package/dist/api-key.js +20084 -0
- package/dist/api-key.js.map +6 -0
- package/dist/audit.d.ts +44 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/authorization-state.d.ts +58 -0
- package/dist/authorization-state.d.ts.map +1 -0
- package/dist/call-contracts-wire.d.ts +151 -11
- package/dist/call-contracts-wire.d.ts.map +1 -1
- package/dist/config.d.ts +10 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/discovery.d.ts +20 -2
- package/dist/discovery.d.ts.map +1 -1
- package/dist/hd.d.ts +33 -0
- package/dist/hd.d.ts.map +1 -0
- package/dist/index.d.ts +14 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25354 -954
- package/dist/index.js.map +3 -3
- package/dist/keystore.d.ts +94 -4
- package/dist/keystore.d.ts.map +1 -1
- package/dist/marketplace-contracts.d.ts +448 -15
- package/dist/marketplace-contracts.d.ts.map +1 -1
- package/dist/networks.d.ts +16 -2
- package/dist/networks.d.ts.map +1 -1
- package/dist/onramp.d.ts +12 -28
- package/dist/onramp.d.ts.map +1 -1
- package/dist/passphrase.d.ts +47 -0
- package/dist/passphrase.d.ts.map +1 -0
- package/dist/policy.d.ts +6 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/receipts.d.ts +40 -4
- package/dist/receipts.d.ts.map +1 -1
- package/dist/router-client.d.ts +117 -0
- package/dist/router-client.d.ts.map +1 -0
- package/dist/router-client.js +27421 -0
- package/dist/router-client.js.map +6 -0
- package/dist/secret-store.d.ts +60 -0
- package/dist/secret-store.d.ts.map +1 -0
- package/dist/secrets.d.ts +14 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +47238 -0
- package/dist/secrets.js.map +6 -0
- package/dist/spend-policy.d.ts +13 -1
- package/dist/spend-policy.d.ts.map +1 -1
- package/dist/stats.d.ts +3 -2
- package/dist/stats.d.ts.map +1 -1
- package/dist/support-report.d.ts +1 -1
- package/dist/sweep.d.ts +4 -0
- package/dist/sweep.d.ts.map +1 -1
- package/dist/wallet-name.d.ts +18 -0
- package/dist/wallet-name.d.ts.map +1 -0
- package/dist/wallet-store.d.ts +220 -0
- package/dist/wallet-store.d.ts.map +1 -0
- package/dist/wallet.d.ts +0 -5
- package/dist/wallet.d.ts.map +1 -1
- package/dist/x402-networks.d.ts +6 -9
- package/dist/x402-networks.d.ts.map +1 -1
- package/dist/x402-pay.d.ts +131 -0
- package/dist/x402-pay.d.ts.map +1 -0
- package/dist/x402.d.ts +20 -1
- package/dist/x402.d.ts.map +1 -1
- package/package.json +17 -1
|
@@ -0,0 +1,1715 @@
|
|
|
1
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
2
|
+
var __esm = (fn, res, err) => function __init() {
|
|
3
|
+
if (err) throw err[0];
|
|
4
|
+
try {
|
|
5
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
6
|
+
} catch (e) {
|
|
7
|
+
throw err = [e], e;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// ../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_u64.js
|
|
12
|
+
function fromBig(n, le = false) {
|
|
13
|
+
if (le)
|
|
14
|
+
return { h: Number(n & U32_MASK64), l: Number(n >> _32n & U32_MASK64) };
|
|
15
|
+
return { h: Number(n >> _32n & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
|
|
16
|
+
}
|
|
17
|
+
function split(lst, le = false) {
|
|
18
|
+
const len = lst.length;
|
|
19
|
+
let Ah = new Uint32Array(len);
|
|
20
|
+
let Al = new Uint32Array(len);
|
|
21
|
+
for (let i = 0; i < len; i++) {
|
|
22
|
+
const { h, l } = fromBig(lst[i], le);
|
|
23
|
+
[Ah[i], Al[i]] = [h, l];
|
|
24
|
+
}
|
|
25
|
+
return [Ah, Al];
|
|
26
|
+
}
|
|
27
|
+
var U32_MASK64, _32n, rotlSH, rotlSL, rotlBH, rotlBL;
|
|
28
|
+
var init_u64 = __esm({
|
|
29
|
+
"../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/_u64.js"() {
|
|
30
|
+
U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
|
|
31
|
+
_32n = /* @__PURE__ */ BigInt(32);
|
|
32
|
+
rotlSH = (h, l, s) => h << s | l >>> 32 - s;
|
|
33
|
+
rotlSL = (h, l, s) => l << s | h >>> 32 - s;
|
|
34
|
+
rotlBH = (h, l, s) => l << s - 32 | h >>> 64 - s;
|
|
35
|
+
rotlBL = (h, l, s) => h << s - 32 | l >>> 64 - s;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// ../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js
|
|
40
|
+
function isBytes(a) {
|
|
41
|
+
return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array";
|
|
42
|
+
}
|
|
43
|
+
function anumber(n) {
|
|
44
|
+
if (!Number.isSafeInteger(n) || n < 0)
|
|
45
|
+
throw new Error("positive integer expected, got " + n);
|
|
46
|
+
}
|
|
47
|
+
function abytes(b, ...lengths) {
|
|
48
|
+
if (!isBytes(b))
|
|
49
|
+
throw new Error("Uint8Array expected");
|
|
50
|
+
if (lengths.length > 0 && !lengths.includes(b.length))
|
|
51
|
+
throw new Error("Uint8Array expected of length " + lengths + ", got length=" + b.length);
|
|
52
|
+
}
|
|
53
|
+
function aexists(instance, checkFinished = true) {
|
|
54
|
+
if (instance.destroyed)
|
|
55
|
+
throw new Error("Hash instance has been destroyed");
|
|
56
|
+
if (checkFinished && instance.finished)
|
|
57
|
+
throw new Error("Hash#digest() has already been called");
|
|
58
|
+
}
|
|
59
|
+
function aoutput(out, instance) {
|
|
60
|
+
abytes(out);
|
|
61
|
+
const min = instance.outputLen;
|
|
62
|
+
if (out.length < min) {
|
|
63
|
+
throw new Error("digestInto() expects output buffer of length at least " + min);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function u32(arr) {
|
|
67
|
+
return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
|
|
68
|
+
}
|
|
69
|
+
function clean(...arrays) {
|
|
70
|
+
for (let i = 0; i < arrays.length; i++) {
|
|
71
|
+
arrays[i].fill(0);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function byteSwap(word) {
|
|
75
|
+
return word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255;
|
|
76
|
+
}
|
|
77
|
+
function byteSwap32(arr) {
|
|
78
|
+
for (let i = 0; i < arr.length; i++) {
|
|
79
|
+
arr[i] = byteSwap(arr[i]);
|
|
80
|
+
}
|
|
81
|
+
return arr;
|
|
82
|
+
}
|
|
83
|
+
function utf8ToBytes(str) {
|
|
84
|
+
if (typeof str !== "string")
|
|
85
|
+
throw new Error("string expected");
|
|
86
|
+
return new Uint8Array(new TextEncoder().encode(str));
|
|
87
|
+
}
|
|
88
|
+
function toBytes(data) {
|
|
89
|
+
if (typeof data === "string")
|
|
90
|
+
data = utf8ToBytes(data);
|
|
91
|
+
abytes(data);
|
|
92
|
+
return data;
|
|
93
|
+
}
|
|
94
|
+
function createHasher(hashCons) {
|
|
95
|
+
const hashC = (msg) => hashCons().update(toBytes(msg)).digest();
|
|
96
|
+
const tmp = hashCons();
|
|
97
|
+
hashC.outputLen = tmp.outputLen;
|
|
98
|
+
hashC.blockLen = tmp.blockLen;
|
|
99
|
+
hashC.create = () => hashCons();
|
|
100
|
+
return hashC;
|
|
101
|
+
}
|
|
102
|
+
var isLE, swap32IfBE, Hash;
|
|
103
|
+
var init_utils = __esm({
|
|
104
|
+
"../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js"() {
|
|
105
|
+
isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)();
|
|
106
|
+
swap32IfBE = isLE ? (u) => u : byteSwap32;
|
|
107
|
+
Hash = class {
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// ../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha3.js
|
|
113
|
+
function keccakP(s, rounds = 24) {
|
|
114
|
+
const B = new Uint32Array(5 * 2);
|
|
115
|
+
for (let round = 24 - rounds; round < 24; round++) {
|
|
116
|
+
for (let x = 0; x < 10; x++)
|
|
117
|
+
B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];
|
|
118
|
+
for (let x = 0; x < 10; x += 2) {
|
|
119
|
+
const idx1 = (x + 8) % 10;
|
|
120
|
+
const idx0 = (x + 2) % 10;
|
|
121
|
+
const B0 = B[idx0];
|
|
122
|
+
const B1 = B[idx0 + 1];
|
|
123
|
+
const Th = rotlH(B0, B1, 1) ^ B[idx1];
|
|
124
|
+
const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];
|
|
125
|
+
for (let y = 0; y < 50; y += 10) {
|
|
126
|
+
s[x + y] ^= Th;
|
|
127
|
+
s[x + y + 1] ^= Tl;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
let curH = s[2];
|
|
131
|
+
let curL = s[3];
|
|
132
|
+
for (let t = 0; t < 24; t++) {
|
|
133
|
+
const shift = SHA3_ROTL[t];
|
|
134
|
+
const Th = rotlH(curH, curL, shift);
|
|
135
|
+
const Tl = rotlL(curH, curL, shift);
|
|
136
|
+
const PI = SHA3_PI[t];
|
|
137
|
+
curH = s[PI];
|
|
138
|
+
curL = s[PI + 1];
|
|
139
|
+
s[PI] = Th;
|
|
140
|
+
s[PI + 1] = Tl;
|
|
141
|
+
}
|
|
142
|
+
for (let y = 0; y < 50; y += 10) {
|
|
143
|
+
for (let x = 0; x < 10; x++)
|
|
144
|
+
B[x] = s[y + x];
|
|
145
|
+
for (let x = 0; x < 10; x++)
|
|
146
|
+
s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];
|
|
147
|
+
}
|
|
148
|
+
s[0] ^= SHA3_IOTA_H[round];
|
|
149
|
+
s[1] ^= SHA3_IOTA_L[round];
|
|
150
|
+
}
|
|
151
|
+
clean(B);
|
|
152
|
+
}
|
|
153
|
+
var _0n, _1n, _2n, _7n, _256n, _0x71n, SHA3_PI, SHA3_ROTL, _SHA3_IOTA, IOTAS, SHA3_IOTA_H, SHA3_IOTA_L, rotlH, rotlL, Keccak, gen, keccak_256;
|
|
154
|
+
var init_sha3 = __esm({
|
|
155
|
+
"../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/esm/sha3.js"() {
|
|
156
|
+
init_u64();
|
|
157
|
+
init_utils();
|
|
158
|
+
_0n = BigInt(0);
|
|
159
|
+
_1n = BigInt(1);
|
|
160
|
+
_2n = BigInt(2);
|
|
161
|
+
_7n = BigInt(7);
|
|
162
|
+
_256n = BigInt(256);
|
|
163
|
+
_0x71n = BigInt(113);
|
|
164
|
+
SHA3_PI = [];
|
|
165
|
+
SHA3_ROTL = [];
|
|
166
|
+
_SHA3_IOTA = [];
|
|
167
|
+
for (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {
|
|
168
|
+
[x, y] = [y, (2 * x + 3 * y) % 5];
|
|
169
|
+
SHA3_PI.push(2 * (5 * y + x));
|
|
170
|
+
SHA3_ROTL.push((round + 1) * (round + 2) / 2 % 64);
|
|
171
|
+
let t = _0n;
|
|
172
|
+
for (let j = 0; j < 7; j++) {
|
|
173
|
+
R = (R << _1n ^ (R >> _7n) * _0x71n) % _256n;
|
|
174
|
+
if (R & _2n)
|
|
175
|
+
t ^= _1n << (_1n << /* @__PURE__ */ BigInt(j)) - _1n;
|
|
176
|
+
}
|
|
177
|
+
_SHA3_IOTA.push(t);
|
|
178
|
+
}
|
|
179
|
+
IOTAS = split(_SHA3_IOTA, true);
|
|
180
|
+
SHA3_IOTA_H = IOTAS[0];
|
|
181
|
+
SHA3_IOTA_L = IOTAS[1];
|
|
182
|
+
rotlH = (h, l, s) => s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s);
|
|
183
|
+
rotlL = (h, l, s) => s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s);
|
|
184
|
+
Keccak = class _Keccak extends Hash {
|
|
185
|
+
// NOTE: we accept arguments in bytes instead of bits here.
|
|
186
|
+
constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {
|
|
187
|
+
super();
|
|
188
|
+
this.pos = 0;
|
|
189
|
+
this.posOut = 0;
|
|
190
|
+
this.finished = false;
|
|
191
|
+
this.destroyed = false;
|
|
192
|
+
this.enableXOF = false;
|
|
193
|
+
this.blockLen = blockLen;
|
|
194
|
+
this.suffix = suffix;
|
|
195
|
+
this.outputLen = outputLen;
|
|
196
|
+
this.enableXOF = enableXOF;
|
|
197
|
+
this.rounds = rounds;
|
|
198
|
+
anumber(outputLen);
|
|
199
|
+
if (!(0 < blockLen && blockLen < 200))
|
|
200
|
+
throw new Error("only keccak-f1600 function is supported");
|
|
201
|
+
this.state = new Uint8Array(200);
|
|
202
|
+
this.state32 = u32(this.state);
|
|
203
|
+
}
|
|
204
|
+
clone() {
|
|
205
|
+
return this._cloneInto();
|
|
206
|
+
}
|
|
207
|
+
keccak() {
|
|
208
|
+
swap32IfBE(this.state32);
|
|
209
|
+
keccakP(this.state32, this.rounds);
|
|
210
|
+
swap32IfBE(this.state32);
|
|
211
|
+
this.posOut = 0;
|
|
212
|
+
this.pos = 0;
|
|
213
|
+
}
|
|
214
|
+
update(data) {
|
|
215
|
+
aexists(this);
|
|
216
|
+
data = toBytes(data);
|
|
217
|
+
abytes(data);
|
|
218
|
+
const { blockLen, state } = this;
|
|
219
|
+
const len = data.length;
|
|
220
|
+
for (let pos = 0; pos < len; ) {
|
|
221
|
+
const take = Math.min(blockLen - this.pos, len - pos);
|
|
222
|
+
for (let i = 0; i < take; i++)
|
|
223
|
+
state[this.pos++] ^= data[pos++];
|
|
224
|
+
if (this.pos === blockLen)
|
|
225
|
+
this.keccak();
|
|
226
|
+
}
|
|
227
|
+
return this;
|
|
228
|
+
}
|
|
229
|
+
finish() {
|
|
230
|
+
if (this.finished)
|
|
231
|
+
return;
|
|
232
|
+
this.finished = true;
|
|
233
|
+
const { state, suffix, pos, blockLen } = this;
|
|
234
|
+
state[pos] ^= suffix;
|
|
235
|
+
if ((suffix & 128) !== 0 && pos === blockLen - 1)
|
|
236
|
+
this.keccak();
|
|
237
|
+
state[blockLen - 1] ^= 128;
|
|
238
|
+
this.keccak();
|
|
239
|
+
}
|
|
240
|
+
writeInto(out) {
|
|
241
|
+
aexists(this, false);
|
|
242
|
+
abytes(out);
|
|
243
|
+
this.finish();
|
|
244
|
+
const bufferOut = this.state;
|
|
245
|
+
const { blockLen } = this;
|
|
246
|
+
for (let pos = 0, len = out.length; pos < len; ) {
|
|
247
|
+
if (this.posOut >= blockLen)
|
|
248
|
+
this.keccak();
|
|
249
|
+
const take = Math.min(blockLen - this.posOut, len - pos);
|
|
250
|
+
out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);
|
|
251
|
+
this.posOut += take;
|
|
252
|
+
pos += take;
|
|
253
|
+
}
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
xofInto(out) {
|
|
257
|
+
if (!this.enableXOF)
|
|
258
|
+
throw new Error("XOF is not possible for this instance");
|
|
259
|
+
return this.writeInto(out);
|
|
260
|
+
}
|
|
261
|
+
xof(bytes) {
|
|
262
|
+
anumber(bytes);
|
|
263
|
+
return this.xofInto(new Uint8Array(bytes));
|
|
264
|
+
}
|
|
265
|
+
digestInto(out) {
|
|
266
|
+
aoutput(out, this);
|
|
267
|
+
if (this.finished)
|
|
268
|
+
throw new Error("digest() was already called");
|
|
269
|
+
this.writeInto(out);
|
|
270
|
+
this.destroy();
|
|
271
|
+
return out;
|
|
272
|
+
}
|
|
273
|
+
digest() {
|
|
274
|
+
return this.digestInto(new Uint8Array(this.outputLen));
|
|
275
|
+
}
|
|
276
|
+
destroy() {
|
|
277
|
+
this.destroyed = true;
|
|
278
|
+
clean(this.state);
|
|
279
|
+
}
|
|
280
|
+
_cloneInto(to) {
|
|
281
|
+
const { blockLen, suffix, outputLen, rounds, enableXOF } = this;
|
|
282
|
+
to || (to = new _Keccak(blockLen, suffix, outputLen, enableXOF, rounds));
|
|
283
|
+
to.state32.set(this.state32);
|
|
284
|
+
to.pos = this.pos;
|
|
285
|
+
to.posOut = this.posOut;
|
|
286
|
+
to.finished = this.finished;
|
|
287
|
+
to.rounds = rounds;
|
|
288
|
+
to.suffix = suffix;
|
|
289
|
+
to.outputLen = outputLen;
|
|
290
|
+
to.enableXOF = enableXOF;
|
|
291
|
+
to.destroyed = this.destroyed;
|
|
292
|
+
return to;
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
gen = (suffix, blockLen, outputLen) => createHasher(() => new Keccak(blockLen, suffix, outputLen));
|
|
296
|
+
keccak_256 = /* @__PURE__ */ (() => gen(1, 136, 256 / 8))();
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/data/isHex.js
|
|
301
|
+
function isHex(value, { strict = true } = {}) {
|
|
302
|
+
if (!value)
|
|
303
|
+
return false;
|
|
304
|
+
if (typeof value !== "string")
|
|
305
|
+
return false;
|
|
306
|
+
return strict ? /^0x[0-9a-fA-F]*$/.test(value) : value.startsWith("0x");
|
|
307
|
+
}
|
|
308
|
+
var init_isHex = __esm({
|
|
309
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/data/isHex.js"() {
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/version.js
|
|
314
|
+
var version;
|
|
315
|
+
var init_version = __esm({
|
|
316
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/version.js"() {
|
|
317
|
+
version = "2.56.1";
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/base.js
|
|
322
|
+
function walk(err, fn) {
|
|
323
|
+
if (fn?.(err))
|
|
324
|
+
return err;
|
|
325
|
+
if (err && typeof err === "object" && "cause" in err && err.cause !== void 0)
|
|
326
|
+
return walk(err.cause, fn);
|
|
327
|
+
return fn ? null : err;
|
|
328
|
+
}
|
|
329
|
+
var errorConfig, BaseError;
|
|
330
|
+
var init_base = __esm({
|
|
331
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/base.js"() {
|
|
332
|
+
init_version();
|
|
333
|
+
errorConfig = {
|
|
334
|
+
getDocsUrl: ({ docsBaseUrl, docsPath = "", docsSlug }) => docsPath ? `${docsBaseUrl ?? "https://viem.sh"}${docsPath}${docsSlug ? `#${docsSlug}` : ""}` : void 0,
|
|
335
|
+
version: `viem@${version}`
|
|
336
|
+
};
|
|
337
|
+
BaseError = class _BaseError extends Error {
|
|
338
|
+
constructor(shortMessage, args = {}) {
|
|
339
|
+
const details = (() => {
|
|
340
|
+
if (args.cause instanceof _BaseError)
|
|
341
|
+
return args.cause.details;
|
|
342
|
+
if (args.cause?.message)
|
|
343
|
+
return args.cause.message;
|
|
344
|
+
return args.details;
|
|
345
|
+
})();
|
|
346
|
+
const docsPath = (() => {
|
|
347
|
+
if (args.cause instanceof _BaseError)
|
|
348
|
+
return args.cause.docsPath || args.docsPath;
|
|
349
|
+
return args.docsPath;
|
|
350
|
+
})();
|
|
351
|
+
const docsUrl = errorConfig.getDocsUrl?.({ ...args, docsPath });
|
|
352
|
+
const message = [
|
|
353
|
+
shortMessage || "An error occurred.",
|
|
354
|
+
"",
|
|
355
|
+
...args.metaMessages ? [...args.metaMessages, ""] : [],
|
|
356
|
+
...docsUrl ? [`Docs: ${docsUrl}`] : [],
|
|
357
|
+
...details ? [`Details: ${details}`] : [],
|
|
358
|
+
...errorConfig.version ? [`Version: ${errorConfig.version}`] : []
|
|
359
|
+
].join("\n");
|
|
360
|
+
super(message, args.cause ? { cause: args.cause } : void 0);
|
|
361
|
+
Object.defineProperty(this, "details", {
|
|
362
|
+
enumerable: true,
|
|
363
|
+
configurable: true,
|
|
364
|
+
writable: true,
|
|
365
|
+
value: void 0
|
|
366
|
+
});
|
|
367
|
+
Object.defineProperty(this, "docsPath", {
|
|
368
|
+
enumerable: true,
|
|
369
|
+
configurable: true,
|
|
370
|
+
writable: true,
|
|
371
|
+
value: void 0
|
|
372
|
+
});
|
|
373
|
+
Object.defineProperty(this, "metaMessages", {
|
|
374
|
+
enumerable: true,
|
|
375
|
+
configurable: true,
|
|
376
|
+
writable: true,
|
|
377
|
+
value: void 0
|
|
378
|
+
});
|
|
379
|
+
Object.defineProperty(this, "shortMessage", {
|
|
380
|
+
enumerable: true,
|
|
381
|
+
configurable: true,
|
|
382
|
+
writable: true,
|
|
383
|
+
value: void 0
|
|
384
|
+
});
|
|
385
|
+
Object.defineProperty(this, "version", {
|
|
386
|
+
enumerable: true,
|
|
387
|
+
configurable: true,
|
|
388
|
+
writable: true,
|
|
389
|
+
value: void 0
|
|
390
|
+
});
|
|
391
|
+
Object.defineProperty(this, "name", {
|
|
392
|
+
enumerable: true,
|
|
393
|
+
configurable: true,
|
|
394
|
+
writable: true,
|
|
395
|
+
value: "BaseError"
|
|
396
|
+
});
|
|
397
|
+
this.details = details;
|
|
398
|
+
this.docsPath = docsPath;
|
|
399
|
+
this.metaMessages = args.metaMessages;
|
|
400
|
+
this.name = args.name ?? this.name;
|
|
401
|
+
this.shortMessage = shortMessage;
|
|
402
|
+
this.version = version;
|
|
403
|
+
}
|
|
404
|
+
walk(fn) {
|
|
405
|
+
return walk(this, fn);
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/data.js
|
|
412
|
+
var SizeExceedsPaddingSizeError;
|
|
413
|
+
var init_data = __esm({
|
|
414
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/data.js"() {
|
|
415
|
+
init_base();
|
|
416
|
+
SizeExceedsPaddingSizeError = class extends BaseError {
|
|
417
|
+
constructor({ size: size2, targetSize, type }) {
|
|
418
|
+
super(`${type.charAt(0).toUpperCase()}${type.slice(1).toLowerCase()} size (${size2}) exceeds padding size (${targetSize}).`, { name: "SizeExceedsPaddingSizeError" });
|
|
419
|
+
}
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/data/pad.js
|
|
425
|
+
function pad(hexOrBytes, { dir, size: size2 = 32 } = {}) {
|
|
426
|
+
if (typeof hexOrBytes === "string")
|
|
427
|
+
return padHex(hexOrBytes, { dir, size: size2 });
|
|
428
|
+
return padBytes(hexOrBytes, { dir, size: size2 });
|
|
429
|
+
}
|
|
430
|
+
function padHex(hex_, { dir, size: size2 = 32 } = {}) {
|
|
431
|
+
if (size2 === null)
|
|
432
|
+
return hex_;
|
|
433
|
+
const hex = hex_.replace("0x", "");
|
|
434
|
+
if (hex.length > size2 * 2)
|
|
435
|
+
throw new SizeExceedsPaddingSizeError({
|
|
436
|
+
size: Math.ceil(hex.length / 2),
|
|
437
|
+
targetSize: size2,
|
|
438
|
+
type: "hex"
|
|
439
|
+
});
|
|
440
|
+
return `0x${hex[dir === "right" ? "padEnd" : "padStart"](size2 * 2, "0")}`;
|
|
441
|
+
}
|
|
442
|
+
function padBytes(bytes, { dir, size: size2 = 32 } = {}) {
|
|
443
|
+
if (size2 === null)
|
|
444
|
+
return bytes;
|
|
445
|
+
if (bytes.length > size2)
|
|
446
|
+
throw new SizeExceedsPaddingSizeError({
|
|
447
|
+
size: bytes.length,
|
|
448
|
+
targetSize: size2,
|
|
449
|
+
type: "bytes"
|
|
450
|
+
});
|
|
451
|
+
const paddedBytes = new Uint8Array(size2);
|
|
452
|
+
for (let i = 0; i < size2; i++) {
|
|
453
|
+
const padEnd = dir === "right";
|
|
454
|
+
paddedBytes[padEnd ? i : size2 - i - 1] = bytes[padEnd ? i : bytes.length - i - 1];
|
|
455
|
+
}
|
|
456
|
+
return paddedBytes;
|
|
457
|
+
}
|
|
458
|
+
var init_pad = __esm({
|
|
459
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/data/pad.js"() {
|
|
460
|
+
init_data();
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/encoding.js
|
|
465
|
+
var IntegerOutOfRangeError, SizeOverflowError;
|
|
466
|
+
var init_encoding = __esm({
|
|
467
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/encoding.js"() {
|
|
468
|
+
init_base();
|
|
469
|
+
IntegerOutOfRangeError = class extends BaseError {
|
|
470
|
+
constructor({ max, min, signed, size: size2, value }) {
|
|
471
|
+
super(`Number "${value}" is not in safe ${size2 ? `${size2 * 8}-bit ${signed ? "signed" : "unsigned"} ` : ""}integer range ${max ? `(${min} to ${max})` : `(above ${min})`}`, { name: "IntegerOutOfRangeError" });
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
SizeOverflowError = class extends BaseError {
|
|
475
|
+
constructor({ givenSize, maxSize }) {
|
|
476
|
+
super(`Size cannot exceed ${maxSize} bytes. Given size: ${givenSize} bytes.`, { name: "SizeOverflowError" });
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/data/size.js
|
|
483
|
+
function size(value) {
|
|
484
|
+
if (isHex(value, { strict: false }))
|
|
485
|
+
return Math.ceil((value.length - 2) / 2);
|
|
486
|
+
return value.length;
|
|
487
|
+
}
|
|
488
|
+
var init_size = __esm({
|
|
489
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/data/size.js"() {
|
|
490
|
+
init_isHex();
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/encoding/fromHex.js
|
|
495
|
+
function assertSize(hexOrBytes, { size: size2 }) {
|
|
496
|
+
if (size(hexOrBytes) > size2)
|
|
497
|
+
throw new SizeOverflowError({
|
|
498
|
+
givenSize: size(hexOrBytes),
|
|
499
|
+
maxSize: size2
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
var init_fromHex = __esm({
|
|
503
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/encoding/fromHex.js"() {
|
|
504
|
+
init_encoding();
|
|
505
|
+
init_size();
|
|
506
|
+
}
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/encoding/toHex.js
|
|
510
|
+
function toHex(value, opts = {}) {
|
|
511
|
+
if (typeof value === "number" || typeof value === "bigint")
|
|
512
|
+
return numberToHex(value, opts);
|
|
513
|
+
if (typeof value === "string") {
|
|
514
|
+
return stringToHex(value, opts);
|
|
515
|
+
}
|
|
516
|
+
if (typeof value === "boolean")
|
|
517
|
+
return boolToHex(value, opts);
|
|
518
|
+
return bytesToHex(value, opts);
|
|
519
|
+
}
|
|
520
|
+
function boolToHex(value, opts = {}) {
|
|
521
|
+
const hex = `0x${Number(value)}`;
|
|
522
|
+
if (typeof opts.size === "number") {
|
|
523
|
+
assertSize(hex, { size: opts.size });
|
|
524
|
+
return pad(hex, { size: opts.size });
|
|
525
|
+
}
|
|
526
|
+
return hex;
|
|
527
|
+
}
|
|
528
|
+
function bytesToHex(value, opts = {}) {
|
|
529
|
+
let string = "";
|
|
530
|
+
for (let i = 0; i < value.length; i++) {
|
|
531
|
+
string += hexes[value[i]];
|
|
532
|
+
}
|
|
533
|
+
const hex = `0x${string}`;
|
|
534
|
+
if (typeof opts.size === "number") {
|
|
535
|
+
assertSize(hex, { size: opts.size });
|
|
536
|
+
return pad(hex, { dir: "right", size: opts.size });
|
|
537
|
+
}
|
|
538
|
+
return hex;
|
|
539
|
+
}
|
|
540
|
+
function numberToHex(value_, opts = {}) {
|
|
541
|
+
const { signed, size: size2 } = opts;
|
|
542
|
+
const value = BigInt(value_);
|
|
543
|
+
let maxValue;
|
|
544
|
+
if (size2) {
|
|
545
|
+
if (signed)
|
|
546
|
+
maxValue = (1n << BigInt(size2) * 8n - 1n) - 1n;
|
|
547
|
+
else
|
|
548
|
+
maxValue = 2n ** (BigInt(size2) * 8n) - 1n;
|
|
549
|
+
} else if (typeof value_ === "number") {
|
|
550
|
+
maxValue = BigInt(Number.MAX_SAFE_INTEGER);
|
|
551
|
+
}
|
|
552
|
+
const minValue = typeof maxValue === "bigint" && signed ? -maxValue - 1n : 0;
|
|
553
|
+
if (maxValue && value > maxValue || value < minValue) {
|
|
554
|
+
const suffix = typeof value_ === "bigint" ? "n" : "";
|
|
555
|
+
throw new IntegerOutOfRangeError({
|
|
556
|
+
max: maxValue ? `${maxValue}${suffix}` : void 0,
|
|
557
|
+
min: `${minValue}${suffix}`,
|
|
558
|
+
signed,
|
|
559
|
+
size: size2,
|
|
560
|
+
value: `${value_}${suffix}`
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
const hex = `0x${(signed && value < 0 ? (1n << BigInt(size2 * 8)) + BigInt(value) : value).toString(16)}`;
|
|
564
|
+
if (size2)
|
|
565
|
+
return pad(hex, { size: size2 });
|
|
566
|
+
return hex;
|
|
567
|
+
}
|
|
568
|
+
function stringToHex(value_, opts = {}) {
|
|
569
|
+
const value = encoder.encode(value_);
|
|
570
|
+
return bytesToHex(value, opts);
|
|
571
|
+
}
|
|
572
|
+
var hexes, encoder;
|
|
573
|
+
var init_toHex = __esm({
|
|
574
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/encoding/toHex.js"() {
|
|
575
|
+
init_encoding();
|
|
576
|
+
init_pad();
|
|
577
|
+
init_fromHex();
|
|
578
|
+
hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_v, i) => i.toString(16).padStart(2, "0"));
|
|
579
|
+
encoder = /* @__PURE__ */ new TextEncoder();
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/encoding/toBytes.js
|
|
584
|
+
function toBytes2(value, opts = {}) {
|
|
585
|
+
if (typeof value === "number" || typeof value === "bigint")
|
|
586
|
+
return numberToBytes(value, opts);
|
|
587
|
+
if (typeof value === "boolean")
|
|
588
|
+
return boolToBytes(value, opts);
|
|
589
|
+
if (isHex(value))
|
|
590
|
+
return hexToBytes(value, opts);
|
|
591
|
+
return stringToBytes(value, opts);
|
|
592
|
+
}
|
|
593
|
+
function boolToBytes(value, opts = {}) {
|
|
594
|
+
const bytes = new Uint8Array(1);
|
|
595
|
+
bytes[0] = Number(value);
|
|
596
|
+
if (typeof opts.size === "number") {
|
|
597
|
+
assertSize(bytes, { size: opts.size });
|
|
598
|
+
return pad(bytes, { size: opts.size });
|
|
599
|
+
}
|
|
600
|
+
return bytes;
|
|
601
|
+
}
|
|
602
|
+
function charCodeToBase16(char) {
|
|
603
|
+
if (char >= charCodeMap.zero && char <= charCodeMap.nine)
|
|
604
|
+
return char - charCodeMap.zero;
|
|
605
|
+
if (char >= charCodeMap.A && char <= charCodeMap.F)
|
|
606
|
+
return char - (charCodeMap.A - 10);
|
|
607
|
+
if (char >= charCodeMap.a && char <= charCodeMap.f)
|
|
608
|
+
return char - (charCodeMap.a - 10);
|
|
609
|
+
return void 0;
|
|
610
|
+
}
|
|
611
|
+
function hexToBytes(hex_, opts = {}) {
|
|
612
|
+
let hex = hex_;
|
|
613
|
+
if (opts.size) {
|
|
614
|
+
assertSize(hex, { size: opts.size });
|
|
615
|
+
hex = pad(hex, { dir: "right", size: opts.size });
|
|
616
|
+
}
|
|
617
|
+
let hexString = hex.slice(2);
|
|
618
|
+
if (hexString.length % 2)
|
|
619
|
+
hexString = `0${hexString}`;
|
|
620
|
+
const length = hexString.length / 2;
|
|
621
|
+
const bytes = new Uint8Array(length);
|
|
622
|
+
for (let index = 0, j = 0; index < length; index++) {
|
|
623
|
+
const nibbleLeft = charCodeToBase16(hexString.charCodeAt(j++));
|
|
624
|
+
const nibbleRight = charCodeToBase16(hexString.charCodeAt(j++));
|
|
625
|
+
if (nibbleLeft === void 0 || nibbleRight === void 0) {
|
|
626
|
+
throw new BaseError(`Invalid byte sequence ("${hexString[j - 2]}${hexString[j - 1]}" in "${hexString}").`);
|
|
627
|
+
}
|
|
628
|
+
bytes[index] = nibbleLeft * 16 + nibbleRight;
|
|
629
|
+
}
|
|
630
|
+
return bytes;
|
|
631
|
+
}
|
|
632
|
+
function numberToBytes(value, opts) {
|
|
633
|
+
const hex = numberToHex(value, opts);
|
|
634
|
+
return hexToBytes(hex);
|
|
635
|
+
}
|
|
636
|
+
function stringToBytes(value, opts = {}) {
|
|
637
|
+
const bytes = encoder2.encode(value);
|
|
638
|
+
if (typeof opts.size === "number") {
|
|
639
|
+
assertSize(bytes, { size: opts.size });
|
|
640
|
+
return pad(bytes, { dir: "right", size: opts.size });
|
|
641
|
+
}
|
|
642
|
+
return bytes;
|
|
643
|
+
}
|
|
644
|
+
var encoder2, charCodeMap;
|
|
645
|
+
var init_toBytes = __esm({
|
|
646
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/encoding/toBytes.js"() {
|
|
647
|
+
init_base();
|
|
648
|
+
init_isHex();
|
|
649
|
+
init_pad();
|
|
650
|
+
init_fromHex();
|
|
651
|
+
init_toHex();
|
|
652
|
+
encoder2 = /* @__PURE__ */ new TextEncoder();
|
|
653
|
+
charCodeMap = {
|
|
654
|
+
zero: 48,
|
|
655
|
+
nine: 57,
|
|
656
|
+
A: 65,
|
|
657
|
+
F: 70,
|
|
658
|
+
a: 97,
|
|
659
|
+
f: 102
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/hash/keccak256.js
|
|
665
|
+
function keccak256(value, to_) {
|
|
666
|
+
const to = to_ || "hex";
|
|
667
|
+
const bytes = keccak_256(isHex(value, { strict: false }) ? toBytes2(value) : value);
|
|
668
|
+
if (to === "bytes")
|
|
669
|
+
return bytes;
|
|
670
|
+
return toHex(bytes);
|
|
671
|
+
}
|
|
672
|
+
var init_keccak256 = __esm({
|
|
673
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/hash/keccak256.js"() {
|
|
674
|
+
init_sha3();
|
|
675
|
+
init_isHex();
|
|
676
|
+
init_toBytes();
|
|
677
|
+
init_toHex();
|
|
678
|
+
}
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/lru.js
|
|
682
|
+
var LruMap;
|
|
683
|
+
var init_lru = __esm({
|
|
684
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/lru.js"() {
|
|
685
|
+
LruMap = class extends Map {
|
|
686
|
+
constructor(size2) {
|
|
687
|
+
super();
|
|
688
|
+
Object.defineProperty(this, "maxSize", {
|
|
689
|
+
enumerable: true,
|
|
690
|
+
configurable: true,
|
|
691
|
+
writable: true,
|
|
692
|
+
value: void 0
|
|
693
|
+
});
|
|
694
|
+
this.maxSize = size2;
|
|
695
|
+
}
|
|
696
|
+
get(key) {
|
|
697
|
+
const value = super.get(key);
|
|
698
|
+
if (super.has(key)) {
|
|
699
|
+
super.delete(key);
|
|
700
|
+
super.set(key, value);
|
|
701
|
+
}
|
|
702
|
+
return value;
|
|
703
|
+
}
|
|
704
|
+
set(key, value) {
|
|
705
|
+
if (super.has(key))
|
|
706
|
+
super.delete(key);
|
|
707
|
+
super.set(key, value);
|
|
708
|
+
if (this.maxSize && this.size > this.maxSize) {
|
|
709
|
+
const firstKey = super.keys().next().value;
|
|
710
|
+
if (firstKey !== void 0)
|
|
711
|
+
super.delete(firstKey);
|
|
712
|
+
}
|
|
713
|
+
return this;
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/address.js
|
|
720
|
+
var InvalidAddressError;
|
|
721
|
+
var init_address = __esm({
|
|
722
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/address.js"() {
|
|
723
|
+
init_base();
|
|
724
|
+
InvalidAddressError = class extends BaseError {
|
|
725
|
+
constructor({ address }) {
|
|
726
|
+
super(`Address "${address}" is invalid.`, {
|
|
727
|
+
metaMessages: [
|
|
728
|
+
"- Address must be a hex value of 20 bytes (40 hex characters).",
|
|
729
|
+
"- Address must match its checksum counterpart."
|
|
730
|
+
],
|
|
731
|
+
name: "InvalidAddressError"
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/address/getAddress.js
|
|
739
|
+
function checksumAddress(address_, chainId) {
|
|
740
|
+
if (checksumAddressCache.has(`${address_}.${chainId}`))
|
|
741
|
+
return checksumAddressCache.get(`${address_}.${chainId}`);
|
|
742
|
+
const hexAddress = chainId ? `${chainId}${address_.toLowerCase()}` : address_.substring(2).toLowerCase();
|
|
743
|
+
const hash = keccak256(stringToBytes(hexAddress), "bytes");
|
|
744
|
+
const address = (chainId ? hexAddress.substring(`${chainId}0x`.length) : hexAddress).split("");
|
|
745
|
+
for (let i = 0; i < 40; i += 2) {
|
|
746
|
+
if (hash[i >> 1] >> 4 >= 8 && address[i]) {
|
|
747
|
+
address[i] = address[i].toUpperCase();
|
|
748
|
+
}
|
|
749
|
+
if ((hash[i >> 1] & 15) >= 8 && address[i + 1]) {
|
|
750
|
+
address[i + 1] = address[i + 1].toUpperCase();
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
const result = `0x${address.join("")}`;
|
|
754
|
+
checksumAddressCache.set(`${address_}.${chainId}`, result);
|
|
755
|
+
return result;
|
|
756
|
+
}
|
|
757
|
+
function getAddress(address, chainId) {
|
|
758
|
+
if (!isAddress(address, { strict: false }))
|
|
759
|
+
throw new InvalidAddressError({ address });
|
|
760
|
+
return checksumAddress(address, chainId);
|
|
761
|
+
}
|
|
762
|
+
var checksumAddressCache;
|
|
763
|
+
var init_getAddress = __esm({
|
|
764
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/address/getAddress.js"() {
|
|
765
|
+
init_address();
|
|
766
|
+
init_toBytes();
|
|
767
|
+
init_keccak256();
|
|
768
|
+
init_lru();
|
|
769
|
+
init_isAddress();
|
|
770
|
+
checksumAddressCache = /* @__PURE__ */ new LruMap(8192);
|
|
771
|
+
}
|
|
772
|
+
});
|
|
773
|
+
|
|
774
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/address/isAddress.js
|
|
775
|
+
function isAddress(address, options) {
|
|
776
|
+
const { strict = true } = options ?? {};
|
|
777
|
+
const cacheKey = `${address}.${strict}`;
|
|
778
|
+
if (isAddressCache.has(cacheKey))
|
|
779
|
+
return isAddressCache.get(cacheKey);
|
|
780
|
+
const result = (() => {
|
|
781
|
+
if (!addressRegex.test(address))
|
|
782
|
+
return false;
|
|
783
|
+
if (address.toLowerCase() === address)
|
|
784
|
+
return true;
|
|
785
|
+
if (strict)
|
|
786
|
+
return checksumAddress(address) === address;
|
|
787
|
+
return true;
|
|
788
|
+
})();
|
|
789
|
+
isAddressCache.set(cacheKey, result);
|
|
790
|
+
return result;
|
|
791
|
+
}
|
|
792
|
+
var addressRegex, isAddressCache;
|
|
793
|
+
var init_isAddress = __esm({
|
|
794
|
+
"../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/address/isAddress.js"() {
|
|
795
|
+
init_lru();
|
|
796
|
+
init_getAddress();
|
|
797
|
+
addressRegex = /^0x[a-fA-F0-9]{40}$/;
|
|
798
|
+
isAddressCache = /* @__PURE__ */ new LruMap(8192);
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
// src/agent-link.ts
|
|
803
|
+
import { createHash } from "node:crypto";
|
|
804
|
+
import { mkdir as mkdir2, open, stat, unlink } from "node:fs/promises";
|
|
805
|
+
import { dirname } from "node:path";
|
|
806
|
+
|
|
807
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/errors/siwe.js
|
|
808
|
+
init_base();
|
|
809
|
+
var SiweInvalidMessageFieldError = class extends BaseError {
|
|
810
|
+
constructor(parameters) {
|
|
811
|
+
const { docsPath, field, metaMessages } = parameters;
|
|
812
|
+
super(`Invalid Sign-In with Ethereum message field "${field}".`, {
|
|
813
|
+
docsPath,
|
|
814
|
+
metaMessages,
|
|
815
|
+
name: "SiweInvalidMessageFieldError"
|
|
816
|
+
});
|
|
817
|
+
}
|
|
818
|
+
};
|
|
819
|
+
|
|
820
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/siwe/createSiweMessage.js
|
|
821
|
+
init_getAddress();
|
|
822
|
+
|
|
823
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/siwe/utils.js
|
|
824
|
+
function isUri(value) {
|
|
825
|
+
if (/[^a-z0-9:/?#[\]@!$&'()*+,;=.\-_~%]/i.test(value))
|
|
826
|
+
return false;
|
|
827
|
+
if (/%[^0-9a-f]/i.test(value))
|
|
828
|
+
return false;
|
|
829
|
+
if (/%[0-9a-f](:?[^0-9a-f]|$)/i.test(value))
|
|
830
|
+
return false;
|
|
831
|
+
const splitted = splitUri(value);
|
|
832
|
+
const scheme = splitted[1];
|
|
833
|
+
const authority = splitted[2];
|
|
834
|
+
const path = splitted[3];
|
|
835
|
+
const query = splitted[4];
|
|
836
|
+
const fragment = splitted[5];
|
|
837
|
+
if (!(scheme?.length && path.length >= 0))
|
|
838
|
+
return false;
|
|
839
|
+
if (authority?.length) {
|
|
840
|
+
if (!(path.length === 0 || /^\//.test(path)))
|
|
841
|
+
return false;
|
|
842
|
+
} else {
|
|
843
|
+
if (/^\/\//.test(path))
|
|
844
|
+
return false;
|
|
845
|
+
}
|
|
846
|
+
if (!/^[a-z][a-z0-9+\-.]*$/.test(scheme.toLowerCase()))
|
|
847
|
+
return false;
|
|
848
|
+
let out = "";
|
|
849
|
+
out += `${scheme}:`;
|
|
850
|
+
if (authority?.length)
|
|
851
|
+
out += `//${authority}`;
|
|
852
|
+
out += path;
|
|
853
|
+
if (query?.length)
|
|
854
|
+
out += `?${query}`;
|
|
855
|
+
if (fragment?.length)
|
|
856
|
+
out += `#${fragment}`;
|
|
857
|
+
return out;
|
|
858
|
+
}
|
|
859
|
+
function splitUri(value) {
|
|
860
|
+
return value.match(/(?:([^:/?#]+):)?(?:\/\/([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?/);
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
// ../../node_modules/.pnpm/viem@2.56.1_typescript@6.0.3_zod@4.5.4/node_modules/viem/_esm/utils/siwe/createSiweMessage.js
|
|
864
|
+
function createSiweMessage(parameters) {
|
|
865
|
+
const { chainId, domain, expirationTime, issuedAt = /* @__PURE__ */ new Date(), nonce, notBefore, requestId, resources, scheme, uri, version: version2 } = parameters;
|
|
866
|
+
{
|
|
867
|
+
if (chainId !== Math.floor(chainId))
|
|
868
|
+
throw new SiweInvalidMessageFieldError({
|
|
869
|
+
field: "chainId",
|
|
870
|
+
metaMessages: [
|
|
871
|
+
"- Chain ID must be a EIP-155 chain ID.",
|
|
872
|
+
"- See https://eips.ethereum.org/EIPS/eip-155",
|
|
873
|
+
"",
|
|
874
|
+
`Provided value: ${chainId}`
|
|
875
|
+
]
|
|
876
|
+
});
|
|
877
|
+
if (!(domainRegex.test(domain) || ipRegex.test(domain) || localhostRegex.test(domain)))
|
|
878
|
+
throw new SiweInvalidMessageFieldError({
|
|
879
|
+
field: "domain",
|
|
880
|
+
metaMessages: [
|
|
881
|
+
"- Domain must be an RFC 3986 authority.",
|
|
882
|
+
"- See https://www.rfc-editor.org/rfc/rfc3986",
|
|
883
|
+
"",
|
|
884
|
+
`Provided value: ${domain}`
|
|
885
|
+
]
|
|
886
|
+
});
|
|
887
|
+
if (!nonceRegex.test(nonce))
|
|
888
|
+
throw new SiweInvalidMessageFieldError({
|
|
889
|
+
field: "nonce",
|
|
890
|
+
metaMessages: [
|
|
891
|
+
"- Nonce must be at least 8 characters.",
|
|
892
|
+
"- Nonce must be alphanumeric.",
|
|
893
|
+
"",
|
|
894
|
+
`Provided value: ${nonce}`
|
|
895
|
+
]
|
|
896
|
+
});
|
|
897
|
+
if (!isUri(uri))
|
|
898
|
+
throw new SiweInvalidMessageFieldError({
|
|
899
|
+
field: "uri",
|
|
900
|
+
metaMessages: [
|
|
901
|
+
"- URI must be a RFC 3986 URI referring to the resource that is the subject of the signing.",
|
|
902
|
+
"- See https://www.rfc-editor.org/rfc/rfc3986",
|
|
903
|
+
"",
|
|
904
|
+
`Provided value: ${uri}`
|
|
905
|
+
]
|
|
906
|
+
});
|
|
907
|
+
if (version2 !== "1")
|
|
908
|
+
throw new SiweInvalidMessageFieldError({
|
|
909
|
+
field: "version",
|
|
910
|
+
metaMessages: [
|
|
911
|
+
"- Version must be '1'.",
|
|
912
|
+
"",
|
|
913
|
+
`Provided value: ${version2}`
|
|
914
|
+
]
|
|
915
|
+
});
|
|
916
|
+
if (scheme && !schemeRegex.test(scheme))
|
|
917
|
+
throw new SiweInvalidMessageFieldError({
|
|
918
|
+
field: "scheme",
|
|
919
|
+
metaMessages: [
|
|
920
|
+
"- Scheme must be an RFC 3986 URI scheme.",
|
|
921
|
+
"- See https://www.rfc-editor.org/rfc/rfc3986#section-3.1",
|
|
922
|
+
"",
|
|
923
|
+
`Provided value: ${scheme}`
|
|
924
|
+
]
|
|
925
|
+
});
|
|
926
|
+
const statement2 = parameters.statement;
|
|
927
|
+
if (statement2?.includes("\n"))
|
|
928
|
+
throw new SiweInvalidMessageFieldError({
|
|
929
|
+
field: "statement",
|
|
930
|
+
metaMessages: [
|
|
931
|
+
"- Statement must not include '\\n'.",
|
|
932
|
+
"",
|
|
933
|
+
`Provided value: ${statement2}`
|
|
934
|
+
]
|
|
935
|
+
});
|
|
936
|
+
}
|
|
937
|
+
const address = getAddress(parameters.address);
|
|
938
|
+
const origin = (() => {
|
|
939
|
+
if (scheme)
|
|
940
|
+
return `${scheme}://${domain}`;
|
|
941
|
+
return domain;
|
|
942
|
+
})();
|
|
943
|
+
const statement = (() => {
|
|
944
|
+
if (!parameters.statement)
|
|
945
|
+
return "";
|
|
946
|
+
return `${parameters.statement}
|
|
947
|
+
`;
|
|
948
|
+
})();
|
|
949
|
+
const prefix = `${origin} wants you to sign in with your Ethereum account:
|
|
950
|
+
${address}
|
|
951
|
+
|
|
952
|
+
${statement}`;
|
|
953
|
+
let suffix = `URI: ${uri}
|
|
954
|
+
Version: ${version2}
|
|
955
|
+
Chain ID: ${chainId}
|
|
956
|
+
Nonce: ${nonce}
|
|
957
|
+
Issued At: ${issuedAt.toISOString()}`;
|
|
958
|
+
if (expirationTime)
|
|
959
|
+
suffix += `
|
|
960
|
+
Expiration Time: ${expirationTime.toISOString()}`;
|
|
961
|
+
if (notBefore)
|
|
962
|
+
suffix += `
|
|
963
|
+
Not Before: ${notBefore.toISOString()}`;
|
|
964
|
+
if (requestId)
|
|
965
|
+
suffix += `
|
|
966
|
+
Request ID: ${requestId}`;
|
|
967
|
+
if (resources) {
|
|
968
|
+
let content = "\nResources:";
|
|
969
|
+
for (const resource of resources) {
|
|
970
|
+
if (!isUri(resource))
|
|
971
|
+
throw new SiweInvalidMessageFieldError({
|
|
972
|
+
field: "resources",
|
|
973
|
+
metaMessages: [
|
|
974
|
+
"- Every resource must be a RFC 3986 URI.",
|
|
975
|
+
"- See https://www.rfc-editor.org/rfc/rfc3986",
|
|
976
|
+
"",
|
|
977
|
+
`Provided value: ${resource}`
|
|
978
|
+
]
|
|
979
|
+
});
|
|
980
|
+
content += `
|
|
981
|
+
- ${resource}`;
|
|
982
|
+
}
|
|
983
|
+
suffix += content;
|
|
984
|
+
}
|
|
985
|
+
return `${prefix}
|
|
986
|
+
${suffix}`;
|
|
987
|
+
}
|
|
988
|
+
var domainRegex = /^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}(:[0-9]{1,5})?$/;
|
|
989
|
+
var ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:[0-9]{1,5})?$/;
|
|
990
|
+
var localhostRegex = /^localhost(:[0-9]{1,5})?$/;
|
|
991
|
+
var nonceRegex = /^[a-zA-Z0-9]{8,}$/;
|
|
992
|
+
var schemeRegex = /^([a-zA-Z][a-zA-Z0-9+-.]*)$/;
|
|
993
|
+
|
|
994
|
+
// src/audit.ts
|
|
995
|
+
import { appendFile, chmod, mkdir, readFile } from "node:fs/promises";
|
|
996
|
+
import { join } from "node:path";
|
|
997
|
+
|
|
998
|
+
// src/net-guard.ts
|
|
999
|
+
import { lookup as dnsLookup } from "node:dns/promises";
|
|
1000
|
+
import { request as httpRequest } from "node:http";
|
|
1001
|
+
import { request as httpsRequest } from "node:https";
|
|
1002
|
+
import { isIP } from "node:net";
|
|
1003
|
+
import { Readable } from "node:stream";
|
|
1004
|
+
var defaultLookup = async (hostname) => {
|
|
1005
|
+
const addresses = await dnsLookup(hostname, { all: true });
|
|
1006
|
+
return addresses.map(({ address }) => address);
|
|
1007
|
+
};
|
|
1008
|
+
async function assertPublicUrl(url, options) {
|
|
1009
|
+
if (url.username || url.password) {
|
|
1010
|
+
throw guardError(url);
|
|
1011
|
+
}
|
|
1012
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
1013
|
+
throw guardError(url);
|
|
1014
|
+
}
|
|
1015
|
+
if (options.allowPrivateNetwork) {
|
|
1016
|
+
return;
|
|
1017
|
+
}
|
|
1018
|
+
const hostname = normalizeHostname(url.hostname);
|
|
1019
|
+
const lowercaseHostname = hostname.toLowerCase();
|
|
1020
|
+
if (!lowercaseHostname || lowercaseHostname === "localhost" || lowercaseHostname.endsWith(".localhost") || lowercaseHostname.endsWith(".local") || lowercaseHostname.endsWith(".internal")) {
|
|
1021
|
+
throw guardError(url);
|
|
1022
|
+
}
|
|
1023
|
+
if (isIP(hostname)) {
|
|
1024
|
+
if (isNonPublicAddress(hostname)) {
|
|
1025
|
+
throw guardError(url);
|
|
1026
|
+
}
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
1029
|
+
let addresses;
|
|
1030
|
+
try {
|
|
1031
|
+
addresses = await withTimeout(
|
|
1032
|
+
(options.lookup ?? defaultLookup)(hostname),
|
|
1033
|
+
options.timeoutMs ?? 5e3
|
|
1034
|
+
);
|
|
1035
|
+
} catch {
|
|
1036
|
+
throw guardError(url);
|
|
1037
|
+
}
|
|
1038
|
+
if (addresses.length === 0 || addresses.some(isNonPublicAddress)) {
|
|
1039
|
+
throw guardError(url);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
function createPublicFetch(options) {
|
|
1043
|
+
const lookupFn = options.lookup ?? defaultLookup;
|
|
1044
|
+
return (async (input, init) => {
|
|
1045
|
+
const url = new URL(input instanceof Request ? input.url : input);
|
|
1046
|
+
await assertPublicUrl(url, {
|
|
1047
|
+
allowPrivateNetwork: options.allowPrivateNetwork,
|
|
1048
|
+
lookup: lookupFn,
|
|
1049
|
+
timeoutMs: 5e3
|
|
1050
|
+
});
|
|
1051
|
+
const normalized = new Request(input, init);
|
|
1052
|
+
const bytes = normalized.body ? Buffer.from(await normalized.arrayBuffer()) : null;
|
|
1053
|
+
return await new Promise((resolve, reject) => {
|
|
1054
|
+
const requestOptions = {
|
|
1055
|
+
method: normalized.method,
|
|
1056
|
+
headers: Object.fromEntries(normalized.headers),
|
|
1057
|
+
signal: normalized.signal,
|
|
1058
|
+
...options.allowPrivateNetwork ? {} : { lookup: pinnedLookup(lookupFn) }
|
|
1059
|
+
};
|
|
1060
|
+
const onResponse = (incoming) => {
|
|
1061
|
+
try {
|
|
1062
|
+
const headers = new Headers();
|
|
1063
|
+
for (const [name, value] of Object.entries(incoming.headers)) {
|
|
1064
|
+
if (Array.isArray(value)) {
|
|
1065
|
+
for (const item of value) headers.append(name, item);
|
|
1066
|
+
} else if (value !== void 0) {
|
|
1067
|
+
headers.set(name, value);
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
const status = incoming.statusCode ?? 500;
|
|
1071
|
+
const bodyForbidden = normalized.method === "HEAD" || [204, 205, 304].includes(status);
|
|
1072
|
+
if (bodyForbidden) incoming.resume();
|
|
1073
|
+
const response = new Response(
|
|
1074
|
+
bodyForbidden ? null : Readable.toWeb(incoming),
|
|
1075
|
+
{ status, statusText: incoming.statusMessage, headers }
|
|
1076
|
+
);
|
|
1077
|
+
Object.defineProperty(response, "url", { value: url.toString() });
|
|
1078
|
+
resolve(response);
|
|
1079
|
+
} catch (error) {
|
|
1080
|
+
incoming.destroy();
|
|
1081
|
+
reject(error);
|
|
1082
|
+
}
|
|
1083
|
+
};
|
|
1084
|
+
const request = url.protocol === "https:" ? httpsRequest(url, requestOptions, onResponse) : httpRequest(url, requestOptions, onResponse);
|
|
1085
|
+
request.on("error", reject);
|
|
1086
|
+
if (bytes) request.write(bytes);
|
|
1087
|
+
request.end();
|
|
1088
|
+
});
|
|
1089
|
+
});
|
|
1090
|
+
}
|
|
1091
|
+
function pinnedLookup(lookup) {
|
|
1092
|
+
return (hostname, dnsOptions, callback) => {
|
|
1093
|
+
void lookup(normalizeHostname(hostname)).then((addresses) => {
|
|
1094
|
+
if (addresses.length === 0 || addresses.some(isNonPublicAddress)) {
|
|
1095
|
+
callback(guardError(new URL(`https://${hostname}`)), "");
|
|
1096
|
+
return;
|
|
1097
|
+
}
|
|
1098
|
+
const address = addresses[0];
|
|
1099
|
+
const family = isIP(address);
|
|
1100
|
+
callback(
|
|
1101
|
+
null,
|
|
1102
|
+
dnsOptions.all ? [{ address, family }] : address,
|
|
1103
|
+
dnsOptions.all ? void 0 : family
|
|
1104
|
+
);
|
|
1105
|
+
}).catch(
|
|
1106
|
+
(error) => callback(error instanceof Error ? error : new Error("DNS lookup failed."), "")
|
|
1107
|
+
);
|
|
1108
|
+
};
|
|
1109
|
+
}
|
|
1110
|
+
async function withTimeout(operation, timeoutMs) {
|
|
1111
|
+
let timeout;
|
|
1112
|
+
try {
|
|
1113
|
+
return await Promise.race([
|
|
1114
|
+
operation,
|
|
1115
|
+
new Promise((_resolve, reject) => {
|
|
1116
|
+
timeout = setTimeout(() => reject(new Error("DNS lookup timed out.")), timeoutMs);
|
|
1117
|
+
})
|
|
1118
|
+
]);
|
|
1119
|
+
} finally {
|
|
1120
|
+
if (timeout) clearTimeout(timeout);
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
function normalizeHostname(hostname) {
|
|
1124
|
+
const unbracketed = hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
|
|
1125
|
+
return unbracketed.endsWith(".") ? unbracketed.slice(0, -1) : unbracketed;
|
|
1126
|
+
}
|
|
1127
|
+
function isNonPublicAddress(address) {
|
|
1128
|
+
const normalized = normalizeHostname(address);
|
|
1129
|
+
const version2 = isIP(normalized);
|
|
1130
|
+
if (version2 === 4) {
|
|
1131
|
+
return isNonPublicIpv4(parseIpv4(normalized));
|
|
1132
|
+
}
|
|
1133
|
+
if (version2 === 6) {
|
|
1134
|
+
return isNonPublicIpv6(parseIpv6(normalized));
|
|
1135
|
+
}
|
|
1136
|
+
return true;
|
|
1137
|
+
}
|
|
1138
|
+
function parseIpv4(address) {
|
|
1139
|
+
const octets = address.split(".").map(Number);
|
|
1140
|
+
return [octets[0], octets[1], octets[2], octets[3]];
|
|
1141
|
+
}
|
|
1142
|
+
function isNonPublicIpv4([first, second, third]) {
|
|
1143
|
+
return first === 0 || first === 10 || first === 100 && second >= 64 && second <= 127 || first === 127 || first === 169 && second === 254 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 0 && (third === 0 || third === 2) || first === 192 && second === 168 || first === 198 && second >= 18 && second <= 19 || first === 198 && second === 51 && third === 100 || first === 203 && second === 0 && third === 113 || first >= 224;
|
|
1144
|
+
}
|
|
1145
|
+
function parseIpv6(address) {
|
|
1146
|
+
let normalized = address.toLowerCase();
|
|
1147
|
+
const lastColon = normalized.lastIndexOf(":");
|
|
1148
|
+
const dottedTail = normalized.slice(lastColon + 1);
|
|
1149
|
+
if (dottedTail.includes(".")) {
|
|
1150
|
+
const [first, second, third, fourth] = parseIpv4(dottedTail);
|
|
1151
|
+
normalized = `${normalized.slice(0, lastColon + 1)}${(first << 8 | second).toString(16)}:${(third << 8 | fourth).toString(16)}`;
|
|
1152
|
+
}
|
|
1153
|
+
const halves = normalized.split("::");
|
|
1154
|
+
const left = halves[0] ? halves[0].split(":").map(parseHex) : [];
|
|
1155
|
+
const right = halves[1] ? halves[1].split(":").map(parseHex) : [];
|
|
1156
|
+
const omittedCount = 8 - left.length - right.length;
|
|
1157
|
+
return halves.length === 2 ? [...left, ...Array.from({ length: omittedCount }, () => 0), ...right] : left;
|
|
1158
|
+
}
|
|
1159
|
+
function parseHex(value) {
|
|
1160
|
+
return Number.parseInt(value, 16);
|
|
1161
|
+
}
|
|
1162
|
+
function isNonPublicIpv6(hextets) {
|
|
1163
|
+
if (hextets.slice(0, 5).every((hextet) => hextet === 0) && hextets[5] === 65535) {
|
|
1164
|
+
const embeddedIpv4 = [
|
|
1165
|
+
hextets[6] >> 8,
|
|
1166
|
+
hextets[6] & 255,
|
|
1167
|
+
hextets[7] >> 8,
|
|
1168
|
+
hextets[7] & 255
|
|
1169
|
+
];
|
|
1170
|
+
return isNonPublicIpv4(embeddedIpv4);
|
|
1171
|
+
}
|
|
1172
|
+
if (hextets.slice(0, 6).every((hextet) => hextet === 0)) {
|
|
1173
|
+
const compatibleIpv4 = [
|
|
1174
|
+
hextets[6] >> 8,
|
|
1175
|
+
hextets[6] & 255,
|
|
1176
|
+
hextets[7] >> 8,
|
|
1177
|
+
hextets[7] & 255
|
|
1178
|
+
];
|
|
1179
|
+
if (isNonPublicIpv4(compatibleIpv4)) return true;
|
|
1180
|
+
}
|
|
1181
|
+
const isUnspecified = hextets.every((hextet) => hextet === 0);
|
|
1182
|
+
const isLoopback = hextets.slice(0, 7).every((hextet) => hextet === 0) && hextets[7] === 1;
|
|
1183
|
+
const first = hextets[0];
|
|
1184
|
+
const isUniqueLocal = first >= 64512 && first <= 65023;
|
|
1185
|
+
const isLinkLocal = first >= 65152 && first <= 65215;
|
|
1186
|
+
const isSiteLocal = first >= 65216 && first <= 65279;
|
|
1187
|
+
const isMulticast = first >= 65280;
|
|
1188
|
+
const isDocumentation = first === 8193 && hextets[1] === 3512;
|
|
1189
|
+
return isUnspecified || isLoopback || isUniqueLocal || isLinkLocal || isSiteLocal || isMulticast || isDocumentation;
|
|
1190
|
+
}
|
|
1191
|
+
function guardError(url) {
|
|
1192
|
+
return new Error(
|
|
1193
|
+
`URL hostname ${JSON.stringify(url.hostname)} is not allowed; private or internal destinations require allowPrivateNetwork true in the vAPI config.`
|
|
1194
|
+
);
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
// src/audit.ts
|
|
1198
|
+
var AUDIT_FILE = "audit.log";
|
|
1199
|
+
function auditLogPath(home) {
|
|
1200
|
+
return join(home, AUDIT_FILE);
|
|
1201
|
+
}
|
|
1202
|
+
async function appendAudit(home, record, options = {}) {
|
|
1203
|
+
const entry = {
|
|
1204
|
+
time: (options.now?.() ?? /* @__PURE__ */ new Date()).toISOString(),
|
|
1205
|
+
event: record.event,
|
|
1206
|
+
...record.wallet === void 0 ? {} : { wallet: record.wallet },
|
|
1207
|
+
...record.owner === void 0 ? {} : { owner: record.owner },
|
|
1208
|
+
tty: record.tty,
|
|
1209
|
+
...record.agentMarker === void 0 ? {} : { agentMarker: record.agentMarker },
|
|
1210
|
+
...record.detail === void 0 ? {} : { detail: record.detail }
|
|
1211
|
+
};
|
|
1212
|
+
const path = auditLogPath(home);
|
|
1213
|
+
await mkdir(home, { recursive: true, mode: 448 });
|
|
1214
|
+
await appendFile(path, `${JSON.stringify(entry)}
|
|
1215
|
+
`, { encoding: "utf8", mode: 384 });
|
|
1216
|
+
await chmod(path, 384);
|
|
1217
|
+
return entry;
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
// src/agent-link.ts
|
|
1221
|
+
var AGENT_LINK_STATEMENT = "Link this wallet to a vAPI account as an agent.";
|
|
1222
|
+
var AGENT_LINK_REVOKED_MESSAGE = "This agent's link was revoked or has expired. Run vapi login to link it again.";
|
|
1223
|
+
var AgentLinkError = class extends Error {
|
|
1224
|
+
constructor(code, message) {
|
|
1225
|
+
super(message);
|
|
1226
|
+
this.code = code;
|
|
1227
|
+
this.name = "AgentLinkError";
|
|
1228
|
+
}
|
|
1229
|
+
code;
|
|
1230
|
+
};
|
|
1231
|
+
var DEFAULT_AGENT_SCOPES = ["mcp:call", "router.use"];
|
|
1232
|
+
var ALLOWED_AGENT_SCOPES = /* @__PURE__ */ new Set([...DEFAULT_AGENT_SCOPES, "call.publish"]);
|
|
1233
|
+
var publicFetch = createPublicFetch({ allowPrivateNetwork: false });
|
|
1234
|
+
async function startDeviceLink(args) {
|
|
1235
|
+
const scopes = args.scopes ?? [...DEFAULT_AGENT_SCOPES];
|
|
1236
|
+
if (scopes.some((scope) => !ALLOWED_AGENT_SCOPES.has(scope))) {
|
|
1237
|
+
throw new AgentLinkError("invalid_scope", "The requested agent scope is not allowed.");
|
|
1238
|
+
}
|
|
1239
|
+
const fetchImpl = args.fetchImpl ?? publicFetch;
|
|
1240
|
+
const api = new URL(args.apiBase);
|
|
1241
|
+
const nonceResponse = await safeFetch(
|
|
1242
|
+
fetchImpl,
|
|
1243
|
+
apiEndpoint(args.apiBase, "/api/auth/siwe-nonce?purpose=link")
|
|
1244
|
+
);
|
|
1245
|
+
if (!nonceResponse.ok) throw httpError("The vAPI sign-in nonce request failed.");
|
|
1246
|
+
const noncePayload = await responseRecord(nonceResponse);
|
|
1247
|
+
const nonce = stringField(noncePayload, "nonce");
|
|
1248
|
+
if (nonce === void 0) throw httpError("The vAPI sign-in nonce response was invalid.");
|
|
1249
|
+
const message = createSiweMessage({
|
|
1250
|
+
domain: api.host,
|
|
1251
|
+
address: args.account.address,
|
|
1252
|
+
statement: AGENT_LINK_STATEMENT,
|
|
1253
|
+
uri: api.origin,
|
|
1254
|
+
version: "1",
|
|
1255
|
+
chainId: 8453,
|
|
1256
|
+
nonce,
|
|
1257
|
+
issuedAt: args.now?.() ?? /* @__PURE__ */ new Date()
|
|
1258
|
+
});
|
|
1259
|
+
const signature = await args.account.signMessage({ message });
|
|
1260
|
+
const response = await safeFetch(
|
|
1261
|
+
fetchImpl,
|
|
1262
|
+
apiEndpoint(args.apiBase, "/oauth/device_authorization"),
|
|
1263
|
+
{
|
|
1264
|
+
method: "POST",
|
|
1265
|
+
headers: { "content-type": "application/json" },
|
|
1266
|
+
body: JSON.stringify({
|
|
1267
|
+
agent_message: message,
|
|
1268
|
+
agent_signature: signature,
|
|
1269
|
+
label: args.label,
|
|
1270
|
+
scope: scopes.join(" "),
|
|
1271
|
+
...args.routerAllowanceUsd === void 0 ? {} : { router_allowance_usd: args.routerAllowanceUsd }
|
|
1272
|
+
})
|
|
1273
|
+
}
|
|
1274
|
+
);
|
|
1275
|
+
const payload = await responseRecord(response);
|
|
1276
|
+
if (!response.ok) throw deviceAuthorizationError(response.status, payload);
|
|
1277
|
+
return {
|
|
1278
|
+
clientId: requiredString(payload, "client_id"),
|
|
1279
|
+
deviceCode: requiredString(payload, "device_code"),
|
|
1280
|
+
userCode: requiredString(payload, "user_code"),
|
|
1281
|
+
verificationUri: requiredString(payload, "verification_uri"),
|
|
1282
|
+
verificationUriComplete: requiredString(payload, "verification_uri_complete"),
|
|
1283
|
+
expiresIn: requiredNumber(payload, "expires_in"),
|
|
1284
|
+
interval: requiredNumber(payload, "interval")
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
async function pollDeviceLink(args) {
|
|
1288
|
+
const fetchImpl = args.fetchImpl ?? publicFetch;
|
|
1289
|
+
const sleep = args.sleep ?? sleepFor;
|
|
1290
|
+
const now = args.now ?? Date.now;
|
|
1291
|
+
const deadline = now() + args.start.expiresIn * 1e3;
|
|
1292
|
+
let interval = args.start.interval;
|
|
1293
|
+
while (now() < deadline) {
|
|
1294
|
+
await sleep(interval * 1e3);
|
|
1295
|
+
if (now() >= deadline) break;
|
|
1296
|
+
const body = new URLSearchParams({
|
|
1297
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
1298
|
+
device_code: args.start.deviceCode,
|
|
1299
|
+
client_id: args.start.clientId
|
|
1300
|
+
});
|
|
1301
|
+
const response = await safeFetch(fetchImpl, apiEndpoint(args.apiBase, "/oauth/token"), {
|
|
1302
|
+
method: "POST",
|
|
1303
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
1304
|
+
body
|
|
1305
|
+
});
|
|
1306
|
+
const payload = await responseRecord(response);
|
|
1307
|
+
if (response.ok) {
|
|
1308
|
+
const scope = requiredString(payload, "scope");
|
|
1309
|
+
const owner = requiredOwner(payload, "owner_wallet");
|
|
1310
|
+
return {
|
|
1311
|
+
tokens: {
|
|
1312
|
+
accessToken: requiredString(payload, "access_token"),
|
|
1313
|
+
refreshToken: requiredString(payload, "refresh_token"),
|
|
1314
|
+
expiresAt: now() + requiredNumber(payload, "expires_in") * 1e3,
|
|
1315
|
+
scopes: splitScopes(scope)
|
|
1316
|
+
},
|
|
1317
|
+
owner,
|
|
1318
|
+
...optionalStringProperty(payload, "router_key", "routerKey"),
|
|
1319
|
+
...optionalStringProperty(payload, "router_base_url", "routerBaseUrl"),
|
|
1320
|
+
...optionalStringProperty(payload, "router_key_error", "routerKeyError")
|
|
1321
|
+
};
|
|
1322
|
+
}
|
|
1323
|
+
const error = stringField(payload, "error");
|
|
1324
|
+
if (response.status === 400 && error === "authorization_pending") continue;
|
|
1325
|
+
if (response.status === 400 && error === "slow_down") {
|
|
1326
|
+
interval += 5;
|
|
1327
|
+
continue;
|
|
1328
|
+
}
|
|
1329
|
+
if (response.status === 400 && error === "access_denied") {
|
|
1330
|
+
throw new AgentLinkError("access_denied", "The owner denied the agent link.");
|
|
1331
|
+
}
|
|
1332
|
+
if (response.status === 400 && error === "expired_token") throw expiredLinkError();
|
|
1333
|
+
throw httpError("The vAPI agent link request failed.");
|
|
1334
|
+
}
|
|
1335
|
+
throw expiredLinkError();
|
|
1336
|
+
}
|
|
1337
|
+
var agentSecretAccounts = (wallet) => ({
|
|
1338
|
+
tokens: `vapi.agent.${wallet}.tokens`,
|
|
1339
|
+
routerStake: `vapi.agent.${wallet}.router.stake`,
|
|
1340
|
+
routerBalance: `vapi.agent.${wallet}.router.balance`
|
|
1341
|
+
});
|
|
1342
|
+
async function renameAgentLinkWallet(args) {
|
|
1343
|
+
await args.wallets.reload();
|
|
1344
|
+
const current = args.wallets.resolve({ name: args.from });
|
|
1345
|
+
if (current.entry.link === void 0) return await args.wallets.rename(args.from, args.to);
|
|
1346
|
+
return await withAgentCredentialLock(
|
|
1347
|
+
args.wallets,
|
|
1348
|
+
current.entry.link.clientId,
|
|
1349
|
+
async () => await args.wallets.rename(args.from, args.to, { secrets: args.secrets })
|
|
1350
|
+
);
|
|
1351
|
+
}
|
|
1352
|
+
async function saveAgentLink(args) {
|
|
1353
|
+
if (!args.secrets.available) {
|
|
1354
|
+
throw new Error(
|
|
1355
|
+
"No OS secret store is available on this machine, so the agent link cannot be stored safely. Nothing was saved."
|
|
1356
|
+
);
|
|
1357
|
+
}
|
|
1358
|
+
const link = {
|
|
1359
|
+
apiBase: args.apiBase,
|
|
1360
|
+
clientId: args.start.clientId,
|
|
1361
|
+
owner: args.result.owner,
|
|
1362
|
+
label: args.label,
|
|
1363
|
+
scopes: [...args.result.tokens.scopes],
|
|
1364
|
+
linkedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1365
|
+
...args.result.routerKey === void 0 || args.result.routerBaseUrl === void 0 ? {} : { routerBaseUrl: args.result.routerBaseUrl }
|
|
1366
|
+
};
|
|
1367
|
+
await withAgentCredentialLock(args.wallets, `wallet:${args.wallet}`, async () => {
|
|
1368
|
+
await args.wallets.reload();
|
|
1369
|
+
const previousLink = args.wallets.entry(args.wallet)?.link;
|
|
1370
|
+
const accounts = agentSecretAccounts(args.wallet);
|
|
1371
|
+
const previousSecrets = await readSecretSnapshot(args.secrets, accounts);
|
|
1372
|
+
try {
|
|
1373
|
+
await safeSetSecret(args.secrets, accounts.tokens, JSON.stringify(args.result.tokens));
|
|
1374
|
+
await writeOptionalSecret(args.secrets, accounts.routerStake, args.result.routerKey);
|
|
1375
|
+
await writeOptionalSecret(args.secrets, accounts.routerBalance, void 0);
|
|
1376
|
+
await args.wallets.setLink(args.wallet, link);
|
|
1377
|
+
} catch (error) {
|
|
1378
|
+
const secretsRestored = await restoreSecretSnapshot(args.secrets, accounts, previousSecrets);
|
|
1379
|
+
const metadataRestored = await restoreLinkMetadata(args.wallets, args.wallet, previousLink);
|
|
1380
|
+
if (!secretsRestored || !metadataRestored) {
|
|
1381
|
+
await args.wallets.clearLink(args.wallet).catch(() => void 0);
|
|
1382
|
+
throw httpError(
|
|
1383
|
+
"The agent link could not be stored consistently. Local link metadata was cleared; run vapi login again."
|
|
1384
|
+
);
|
|
1385
|
+
}
|
|
1386
|
+
throw error;
|
|
1387
|
+
}
|
|
1388
|
+
});
|
|
1389
|
+
await appendAudit(args.home ?? args.wallets.home, {
|
|
1390
|
+
event: "agent.linked",
|
|
1391
|
+
wallet: args.wallet,
|
|
1392
|
+
owner: args.result.owner,
|
|
1393
|
+
tty: Boolean(process.stderr.isTTY)
|
|
1394
|
+
});
|
|
1395
|
+
return link;
|
|
1396
|
+
}
|
|
1397
|
+
async function agentAccessToken(args) {
|
|
1398
|
+
return await resolveAgentAccessToken(args, {});
|
|
1399
|
+
}
|
|
1400
|
+
async function agentFetch(args, url, init) {
|
|
1401
|
+
const fetchImpl = args.fetchImpl ?? publicFetch;
|
|
1402
|
+
const accessToken = await resolveAgentAccessToken(args, {});
|
|
1403
|
+
const response = await safeAgentFetch(fetchImpl, url, withBearer(init, accessToken));
|
|
1404
|
+
if (response.status !== 401) return response;
|
|
1405
|
+
const refreshedToken = await resolveAgentAccessToken(args, { rejectedAccessToken: accessToken });
|
|
1406
|
+
const refreshedResponse = await safeAgentFetch(fetchImpl, url, withBearer(init, refreshedToken));
|
|
1407
|
+
if (refreshedResponse.status === 401) {
|
|
1408
|
+
throw new AgentLinkError("not_linked", AGENT_LINK_REVOKED_MESSAGE);
|
|
1409
|
+
}
|
|
1410
|
+
return refreshedResponse;
|
|
1411
|
+
}
|
|
1412
|
+
async function forgetAgentLink(args) {
|
|
1413
|
+
const link = args.wallets.entry(args.wallet)?.link;
|
|
1414
|
+
let revokedError;
|
|
1415
|
+
if (link !== void 0) {
|
|
1416
|
+
try {
|
|
1417
|
+
await agentFetch(args, apiEndpoint(link.apiBase, "/api/agents/self"), {
|
|
1418
|
+
method: "DELETE"
|
|
1419
|
+
});
|
|
1420
|
+
} catch (error) {
|
|
1421
|
+
if (error instanceof AgentLinkError && error.code === "not_linked" && error.message === AGENT_LINK_REVOKED_MESSAGE) {
|
|
1422
|
+
revokedError = error;
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
if (args.secrets.available) {
|
|
1427
|
+
if (link !== void 0) {
|
|
1428
|
+
await removeSecretAccounts(args.secrets, agentSecretAccounts(args.wallet));
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
if (args.wallets.entry(args.wallet) !== void 0) await args.wallets.clearLink(args.wallet);
|
|
1432
|
+
if (link !== void 0) {
|
|
1433
|
+
await appendAudit(args.home ?? args.wallets.home, {
|
|
1434
|
+
event: "agent.unlinked",
|
|
1435
|
+
wallet: args.wallet,
|
|
1436
|
+
owner: link.owner,
|
|
1437
|
+
tty: Boolean(process.stderr.isTTY)
|
|
1438
|
+
});
|
|
1439
|
+
}
|
|
1440
|
+
if (revokedError !== void 0) throw revokedError;
|
|
1441
|
+
}
|
|
1442
|
+
async function resolveAgentAccessToken(args, options) {
|
|
1443
|
+
await args.wallets.reload();
|
|
1444
|
+
const link = args.wallets.entry(args.wallet)?.link;
|
|
1445
|
+
if (link === void 0 || !args.secrets.available) throw notLinkedError();
|
|
1446
|
+
const accounts = agentSecretAccounts(args.wallet);
|
|
1447
|
+
const tokens = parseTokens(await safeGetSecret(args.secrets, accounts.tokens));
|
|
1448
|
+
if (tokens === void 0) throw notLinkedError();
|
|
1449
|
+
const now = args.now ?? Date.now;
|
|
1450
|
+
if (options.rejectedAccessToken === void 0 && tokens.expiresAt - 6e4 > now()) {
|
|
1451
|
+
return tokens.accessToken;
|
|
1452
|
+
}
|
|
1453
|
+
return await withAgentCredentialLock(args.wallets, link.clientId, async () => {
|
|
1454
|
+
await args.wallets.reload();
|
|
1455
|
+
const currentLink = args.wallets.entry(args.wallet)?.link;
|
|
1456
|
+
if (currentLink === void 0) throw notLinkedError();
|
|
1457
|
+
const currentAccounts = agentSecretAccounts(args.wallet);
|
|
1458
|
+
const current = parseTokens(await safeGetSecret(args.secrets, currentAccounts.tokens));
|
|
1459
|
+
if (current === void 0) throw notLinkedError();
|
|
1460
|
+
if (options.rejectedAccessToken !== void 0 && current.accessToken !== options.rejectedAccessToken) {
|
|
1461
|
+
return current.accessToken;
|
|
1462
|
+
}
|
|
1463
|
+
if (options.rejectedAccessToken === void 0 && current.expiresAt - 6e4 > now()) {
|
|
1464
|
+
return current.accessToken;
|
|
1465
|
+
}
|
|
1466
|
+
const response = await safeFetch(
|
|
1467
|
+
args.fetchImpl ?? publicFetch,
|
|
1468
|
+
apiEndpoint(currentLink.apiBase, "/oauth/token"),
|
|
1469
|
+
{
|
|
1470
|
+
method: "POST",
|
|
1471
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
1472
|
+
body: new URLSearchParams({
|
|
1473
|
+
grant_type: "refresh_token",
|
|
1474
|
+
refresh_token: current.refreshToken,
|
|
1475
|
+
client_id: currentLink.clientId
|
|
1476
|
+
})
|
|
1477
|
+
}
|
|
1478
|
+
);
|
|
1479
|
+
const payload = await responseRecord(response);
|
|
1480
|
+
if (!response.ok) {
|
|
1481
|
+
if (response.status === 400 && stringField(payload, "error") === "invalid_grant") {
|
|
1482
|
+
throw new AgentLinkError("not_linked", AGENT_LINK_REVOKED_MESSAGE);
|
|
1483
|
+
}
|
|
1484
|
+
throw httpError("The vAPI agent token refresh failed.");
|
|
1485
|
+
}
|
|
1486
|
+
const refreshed = {
|
|
1487
|
+
accessToken: requiredString(payload, "access_token"),
|
|
1488
|
+
refreshToken: stringField(payload, "refresh_token") ?? current.refreshToken,
|
|
1489
|
+
expiresAt: now() + requiredNumber(payload, "expires_in") * 1e3,
|
|
1490
|
+
scopes: stringField(payload, "scope") === void 0 ? [...current.scopes] : splitScopes(requiredString(payload, "scope"))
|
|
1491
|
+
};
|
|
1492
|
+
await safeSetSecret(args.secrets, currentAccounts.tokens, JSON.stringify(refreshed));
|
|
1493
|
+
return refreshed.accessToken;
|
|
1494
|
+
});
|
|
1495
|
+
}
|
|
1496
|
+
async function readSecretSnapshot(secrets, accounts) {
|
|
1497
|
+
const [tokens, routerStake, routerBalance] = await Promise.all([
|
|
1498
|
+
safeGetSecret(secrets, accounts.tokens),
|
|
1499
|
+
safeGetSecret(secrets, accounts.routerStake),
|
|
1500
|
+
safeGetSecret(secrets, accounts.routerBalance)
|
|
1501
|
+
]);
|
|
1502
|
+
return {
|
|
1503
|
+
...tokens === void 0 ? {} : { tokens },
|
|
1504
|
+
...routerStake === void 0 ? {} : { routerStake },
|
|
1505
|
+
...routerBalance === void 0 ? {} : { routerBalance }
|
|
1506
|
+
};
|
|
1507
|
+
}
|
|
1508
|
+
async function restoreSecretSnapshot(secrets, accounts, snapshot) {
|
|
1509
|
+
try {
|
|
1510
|
+
await writeOptionalSecret(secrets, accounts.tokens, snapshot.tokens);
|
|
1511
|
+
await writeOptionalSecret(secrets, accounts.routerStake, snapshot.routerStake);
|
|
1512
|
+
await writeOptionalSecret(secrets, accounts.routerBalance, snapshot.routerBalance);
|
|
1513
|
+
return true;
|
|
1514
|
+
} catch {
|
|
1515
|
+
return false;
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
async function restoreLinkMetadata(wallets, wallet, link) {
|
|
1519
|
+
try {
|
|
1520
|
+
if (link === void 0) await wallets.clearLink(wallet);
|
|
1521
|
+
else await wallets.setLink(wallet, link);
|
|
1522
|
+
return true;
|
|
1523
|
+
} catch {
|
|
1524
|
+
return false;
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1527
|
+
async function writeOptionalSecret(secrets, account, value) {
|
|
1528
|
+
if (value === void 0) await safeRemoveSecret(secrets, account);
|
|
1529
|
+
else await safeSetSecret(secrets, account, value);
|
|
1530
|
+
}
|
|
1531
|
+
async function removeSecretAccounts(secrets, accounts) {
|
|
1532
|
+
await safeRemoveSecret(secrets, accounts.tokens);
|
|
1533
|
+
await safeRemoveSecret(secrets, accounts.routerStake);
|
|
1534
|
+
await safeRemoveSecret(secrets, accounts.routerBalance);
|
|
1535
|
+
}
|
|
1536
|
+
async function withAgentCredentialLock(wallets, clientId, operation) {
|
|
1537
|
+
const digest = createHash("sha256").update(clientId).digest("hex").slice(0, 24);
|
|
1538
|
+
const lockPath = `${wallets.registryPath}.${digest}.agent-link.lock`;
|
|
1539
|
+
await mkdir2(dirname(lockPath), { recursive: true, mode: 448 });
|
|
1540
|
+
const deadline = Date.now() + 3e4;
|
|
1541
|
+
let handle;
|
|
1542
|
+
while (!handle) {
|
|
1543
|
+
try {
|
|
1544
|
+
handle = await open(lockPath, "wx", 384);
|
|
1545
|
+
} catch (error) {
|
|
1546
|
+
if (!(error instanceof Error && "code" in error && error.code === "EEXIST")) throw error;
|
|
1547
|
+
await removeStaleCredentialLock(lockPath);
|
|
1548
|
+
if (Date.now() >= deadline) {
|
|
1549
|
+
throw httpError("Timed out waiting to update the agent credentials.");
|
|
1550
|
+
}
|
|
1551
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
1552
|
+
}
|
|
1553
|
+
}
|
|
1554
|
+
try {
|
|
1555
|
+
return await operation();
|
|
1556
|
+
} finally {
|
|
1557
|
+
await handle.close();
|
|
1558
|
+
await unlink(lockPath).catch(() => void 0);
|
|
1559
|
+
}
|
|
1560
|
+
}
|
|
1561
|
+
async function removeStaleCredentialLock(path) {
|
|
1562
|
+
try {
|
|
1563
|
+
const metadata = await stat(path);
|
|
1564
|
+
if (Date.now() - metadata.mtimeMs > 5 * 6e4) await unlink(path);
|
|
1565
|
+
} catch {
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
async function safeGetSecret(secrets, account) {
|
|
1569
|
+
try {
|
|
1570
|
+
return await secrets.get(account);
|
|
1571
|
+
} catch {
|
|
1572
|
+
throw httpError("The agent tokens could not be read from the OS secret store.");
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1575
|
+
async function safeSetSecret(secrets, account, value) {
|
|
1576
|
+
try {
|
|
1577
|
+
await secrets.set(account, value);
|
|
1578
|
+
} catch {
|
|
1579
|
+
throw httpError("The agent credentials could not be stored in the OS secret store.");
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
async function safeRemoveSecret(secrets, account) {
|
|
1583
|
+
try {
|
|
1584
|
+
await secrets.remove(account);
|
|
1585
|
+
} catch {
|
|
1586
|
+
throw httpError("The agent credentials could not be removed from the OS secret store.");
|
|
1587
|
+
}
|
|
1588
|
+
}
|
|
1589
|
+
function parseTokens(value) {
|
|
1590
|
+
if (value === void 0) return void 0;
|
|
1591
|
+
let parsed;
|
|
1592
|
+
try {
|
|
1593
|
+
parsed = JSON.parse(value);
|
|
1594
|
+
} catch {
|
|
1595
|
+
return void 0;
|
|
1596
|
+
}
|
|
1597
|
+
if (!isRecord(parsed)) return void 0;
|
|
1598
|
+
const accessToken = stringField(parsed, "accessToken");
|
|
1599
|
+
const refreshToken = stringField(parsed, "refreshToken");
|
|
1600
|
+
const expiresAt = numberField(parsed, "expiresAt");
|
|
1601
|
+
const scopes = parsed.scopes;
|
|
1602
|
+
if (accessToken === void 0 || refreshToken === void 0 || expiresAt === void 0 || !Array.isArray(scopes) || scopes.some((scope) => typeof scope !== "string")) {
|
|
1603
|
+
return void 0;
|
|
1604
|
+
}
|
|
1605
|
+
return { accessToken, refreshToken, expiresAt, scopes };
|
|
1606
|
+
}
|
|
1607
|
+
function withBearer(init, accessToken) {
|
|
1608
|
+
const headers = new Headers(init?.headers);
|
|
1609
|
+
headers.set("authorization", `Bearer ${accessToken}`);
|
|
1610
|
+
return { ...init, headers };
|
|
1611
|
+
}
|
|
1612
|
+
async function safeFetch(fetchImpl, input, init) {
|
|
1613
|
+
try {
|
|
1614
|
+
return await fetchImpl(input, init);
|
|
1615
|
+
} catch {
|
|
1616
|
+
throw httpError("The vAPI agent link request failed.");
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
async function safeAgentFetch(fetchImpl, input, init) {
|
|
1620
|
+
try {
|
|
1621
|
+
return await fetchImpl(input, init);
|
|
1622
|
+
} catch {
|
|
1623
|
+
throw httpError("The vAPI agent request failed.");
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
function deviceAuthorizationError(status, payload) {
|
|
1627
|
+
const error = stringField(payload, "error");
|
|
1628
|
+
if (status === 401 && error === "invalid_agent_signature") {
|
|
1629
|
+
return new AgentLinkError(
|
|
1630
|
+
"invalid_agent_signature",
|
|
1631
|
+
"The agent wallet signature was rejected."
|
|
1632
|
+
);
|
|
1633
|
+
}
|
|
1634
|
+
if (status === 400 && error === "invalid_scope") {
|
|
1635
|
+
return new AgentLinkError("invalid_scope", "The requested agent scope is not allowed.");
|
|
1636
|
+
}
|
|
1637
|
+
return httpError("The vAPI agent link request failed.");
|
|
1638
|
+
}
|
|
1639
|
+
function notLinkedError() {
|
|
1640
|
+
return new AgentLinkError("not_linked", "Run vapi login first.");
|
|
1641
|
+
}
|
|
1642
|
+
function expiredLinkError() {
|
|
1643
|
+
return new AgentLinkError(
|
|
1644
|
+
"expired_token",
|
|
1645
|
+
"The agent link request expired. Run vapi login again."
|
|
1646
|
+
);
|
|
1647
|
+
}
|
|
1648
|
+
function httpError(message) {
|
|
1649
|
+
return new AgentLinkError("http", message);
|
|
1650
|
+
}
|
|
1651
|
+
function apiEndpoint(apiBase, path) {
|
|
1652
|
+
return new URL(path, new URL(apiBase).origin).toString();
|
|
1653
|
+
}
|
|
1654
|
+
async function responseRecord(response) {
|
|
1655
|
+
let payload;
|
|
1656
|
+
try {
|
|
1657
|
+
payload = await response.json();
|
|
1658
|
+
} catch {
|
|
1659
|
+
throw httpError("The vAPI agent link response was invalid.");
|
|
1660
|
+
}
|
|
1661
|
+
if (!isRecord(payload)) throw httpError("The vAPI agent link response was invalid.");
|
|
1662
|
+
return payload;
|
|
1663
|
+
}
|
|
1664
|
+
function isRecord(value) {
|
|
1665
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1666
|
+
}
|
|
1667
|
+
function stringField(record, key) {
|
|
1668
|
+
const value = record[key];
|
|
1669
|
+
return typeof value === "string" ? value : void 0;
|
|
1670
|
+
}
|
|
1671
|
+
function numberField(record, key) {
|
|
1672
|
+
const value = record[key];
|
|
1673
|
+
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
1674
|
+
}
|
|
1675
|
+
function requiredString(record, key) {
|
|
1676
|
+
const value = stringField(record, key);
|
|
1677
|
+
if (value === void 0) throw httpError("The vAPI agent link response was invalid.");
|
|
1678
|
+
return value;
|
|
1679
|
+
}
|
|
1680
|
+
function requiredNumber(record, key) {
|
|
1681
|
+
const value = numberField(record, key);
|
|
1682
|
+
if (value === void 0) throw httpError("The vAPI agent link response was invalid.");
|
|
1683
|
+
return value;
|
|
1684
|
+
}
|
|
1685
|
+
function requiredOwner(record, key) {
|
|
1686
|
+
const value = requiredString(record, key);
|
|
1687
|
+
if (!value.startsWith("0x")) throw httpError("The vAPI agent link response was invalid.");
|
|
1688
|
+
return value;
|
|
1689
|
+
}
|
|
1690
|
+
function optionalStringProperty(record, source, target) {
|
|
1691
|
+
const value = stringField(record, source);
|
|
1692
|
+
return value === void 0 ? {} : { [target]: value };
|
|
1693
|
+
}
|
|
1694
|
+
function splitScopes(scope) {
|
|
1695
|
+
return scope.split(/\s+/u).filter(Boolean);
|
|
1696
|
+
}
|
|
1697
|
+
async function sleepFor(milliseconds) {
|
|
1698
|
+
await new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
1699
|
+
}
|
|
1700
|
+
export {
|
|
1701
|
+
AGENT_LINK_REVOKED_MESSAGE,
|
|
1702
|
+
AGENT_LINK_STATEMENT,
|
|
1703
|
+
AgentLinkError,
|
|
1704
|
+
DEFAULT_AGENT_SCOPES,
|
|
1705
|
+
agentAccessToken,
|
|
1706
|
+
agentFetch,
|
|
1707
|
+
agentSecretAccounts,
|
|
1708
|
+
forgetAgentLink,
|
|
1709
|
+
pollDeviceLink,
|
|
1710
|
+
renameAgentLinkWallet,
|
|
1711
|
+
saveAgentLink,
|
|
1712
|
+
startDeviceLink,
|
|
1713
|
+
withAgentCredentialLock
|
|
1714
|
+
};
|
|
1715
|
+
//# sourceMappingURL=agent-link.js.map
|