@clawnch/clawtomaton 0.2.2 → 0.3.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 +80 -8
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +12 -0
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/prompt.d.ts +2 -0
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js +43 -2
- package/dist/agent/prompt.js.map +1 -1
- package/dist/bunker/client.d.ts +113 -0
- package/dist/bunker/client.d.ts.map +1 -0
- package/dist/bunker/client.js +404 -0
- package/dist/bunker/client.js.map +1 -0
- package/dist/bunker/self-deploy.d.ts +54 -0
- package/dist/bunker/self-deploy.d.ts.map +1 -0
- package/dist/bunker/self-deploy.js +353 -0
- package/dist/bunker/self-deploy.js.map +1 -0
- package/dist/bunker/threat-monitor.d.ts +47 -0
- package/dist/bunker/threat-monitor.d.ts.map +1 -0
- package/dist/bunker/threat-monitor.js +173 -0
- package/dist/bunker/threat-monitor.js.map +1 -0
- package/dist/bunker/types.d.ts +320 -0
- package/dist/bunker/types.d.ts.map +1 -0
- package/dist/bunker/types.js +9 -0
- package/dist/bunker/types.js.map +1 -0
- package/dist/cli.js +207 -9
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -1
- package/dist/heartbeat/index.d.ts +10 -0
- package/dist/heartbeat/index.d.ts.map +1 -1
- package/dist/heartbeat/index.js +89 -11
- package/dist/heartbeat/index.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/market/index.d.ts +12 -0
- package/dist/market/index.d.ts.map +1 -1
- package/dist/market/index.js +48 -2
- package/dist/market/index.js.map +1 -1
- package/dist/skills/bunker.d.ts +29 -0
- package/dist/skills/bunker.d.ts.map +1 -0
- package/dist/skills/bunker.js +502 -0
- package/dist/skills/bunker.js.map +1 -0
- package/dist/skills/index.d.ts +2 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +6 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/state/index.d.ts +6 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +55 -0
- package/dist/state/index.js.map +1 -1
- package/dist/survival/index.d.ts.map +1 -1
- package/dist/survival/index.js +3 -0
- package/dist/survival/index.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MoltBunker API client — production-hardened HTTP client with wallet session auth.
|
|
3
|
+
*
|
|
4
|
+
* Auth: EIP-191 signed challenge → session token (wt_*). Auto-refreshes on 401.
|
|
5
|
+
* Rate limits: Exponential backoff on 429 with Retry-After header.
|
|
6
|
+
* Errors: Typed error hierarchy for structured handling.
|
|
7
|
+
* Timeouts: 30s default per request.
|
|
8
|
+
*
|
|
9
|
+
* This client is stateless except for the cached session token.
|
|
10
|
+
* All methods are safe to call concurrently (token refresh is serialized).
|
|
11
|
+
*/
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Errors
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export class BunkerError extends Error {
|
|
16
|
+
status;
|
|
17
|
+
body;
|
|
18
|
+
constructor(message, status, body) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.status = status;
|
|
21
|
+
this.body = body;
|
|
22
|
+
this.name = 'BunkerError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class BunkerAuthError extends BunkerError {
|
|
26
|
+
constructor(message, body) {
|
|
27
|
+
super(message, 401, body);
|
|
28
|
+
this.name = 'BunkerAuthError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class BunkerInsufficientFundsError extends BunkerError {
|
|
32
|
+
required;
|
|
33
|
+
available;
|
|
34
|
+
constructor(message, body) {
|
|
35
|
+
super(message, 402, body);
|
|
36
|
+
this.name = 'BunkerInsufficientFundsError';
|
|
37
|
+
this.required = body?.required;
|
|
38
|
+
this.available = body?.available;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class BunkerNotFoundError extends BunkerError {
|
|
42
|
+
constructor(message, body) {
|
|
43
|
+
super(message, 404, body);
|
|
44
|
+
this.name = 'BunkerNotFoundError';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class BunkerRateLimitError extends BunkerError {
|
|
48
|
+
retryAfterMs;
|
|
49
|
+
constructor(message, retryAfterMs, body) {
|
|
50
|
+
super(message, 429, body);
|
|
51
|
+
this.name = 'BunkerRateLimitError';
|
|
52
|
+
this.retryAfterMs = retryAfterMs;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ============================================================================
|
|
56
|
+
// Client
|
|
57
|
+
// ============================================================================
|
|
58
|
+
const DEFAULT_API_URL = 'https://api.moltbunker.com/v1';
|
|
59
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
60
|
+
const MAX_RATE_LIMIT_RETRIES = 3;
|
|
61
|
+
const SESSION_REFRESH_BUFFER_MS = 60_000; // refresh 1 min before expiry
|
|
62
|
+
export class BunkerClient {
|
|
63
|
+
apiUrl;
|
|
64
|
+
walletClient;
|
|
65
|
+
timeoutMs;
|
|
66
|
+
// Session token state
|
|
67
|
+
sessionToken = null;
|
|
68
|
+
sessionExpiresAt = 0;
|
|
69
|
+
refreshPromise = null;
|
|
70
|
+
constructor(opts) {
|
|
71
|
+
this.apiUrl = (opts.apiUrl ?? DEFAULT_API_URL).replace(/\/+$/, '');
|
|
72
|
+
this.walletClient = opts.walletClient;
|
|
73
|
+
this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
74
|
+
}
|
|
75
|
+
// --------------------------------------------------------------------------
|
|
76
|
+
// Auth
|
|
77
|
+
// --------------------------------------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Get a valid session token. Uses cached token if still valid,
|
|
80
|
+
* otherwise authenticates via challenge-response.
|
|
81
|
+
*
|
|
82
|
+
* Concurrent calls are serialized — only one auth request at a time.
|
|
83
|
+
*/
|
|
84
|
+
async getSessionToken() {
|
|
85
|
+
// Return cached token if valid
|
|
86
|
+
if (this.sessionToken && Date.now() < this.sessionExpiresAt - SESSION_REFRESH_BUFFER_MS) {
|
|
87
|
+
return this.sessionToken;
|
|
88
|
+
}
|
|
89
|
+
// Serialize concurrent refresh attempts
|
|
90
|
+
if (this.refreshPromise) {
|
|
91
|
+
return this.refreshPromise;
|
|
92
|
+
}
|
|
93
|
+
this.refreshPromise = this.authenticate();
|
|
94
|
+
try {
|
|
95
|
+
return await this.refreshPromise;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
this.refreshPromise = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Full challenge-response auth flow. Signs with EIP-191 via viem wallet.
|
|
103
|
+
*/
|
|
104
|
+
async authenticate() {
|
|
105
|
+
const account = this.walletClient.account;
|
|
106
|
+
if (!account) {
|
|
107
|
+
throw new BunkerAuthError('WalletClient has no account set');
|
|
108
|
+
}
|
|
109
|
+
const address = account.address;
|
|
110
|
+
// Step 1: Get challenge
|
|
111
|
+
const challengeResp = await this.rawRequest('POST', '/auth/challenge', { address }, false);
|
|
112
|
+
// Step 2: Sign challenge with EIP-191
|
|
113
|
+
const signature = await this.walletClient.signMessage({
|
|
114
|
+
account: account,
|
|
115
|
+
message: challengeResp.message,
|
|
116
|
+
});
|
|
117
|
+
// Step 3: Verify and get token
|
|
118
|
+
const verifyResp = await this.rawRequest('POST', '/auth/verify', { address, message: challengeResp.message, signature }, false);
|
|
119
|
+
this.sessionToken = verifyResp.access_token;
|
|
120
|
+
this.sessionExpiresAt = Date.now() + verifyResp.expires_in * 1000;
|
|
121
|
+
return this.sessionToken;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Invalidate the current session and force re-authentication on next request.
|
|
125
|
+
*/
|
|
126
|
+
invalidateSession() {
|
|
127
|
+
this.sessionToken = null;
|
|
128
|
+
this.sessionExpiresAt = 0;
|
|
129
|
+
}
|
|
130
|
+
// --------------------------------------------------------------------------
|
|
131
|
+
// HTTP Layer
|
|
132
|
+
// --------------------------------------------------------------------------
|
|
133
|
+
/**
|
|
134
|
+
* Low-level request without auth retry logic. Used for auth endpoints.
|
|
135
|
+
*/
|
|
136
|
+
async rawRequest(method, path, body, authenticated = false, timeoutMs) {
|
|
137
|
+
const url = `${this.apiUrl}${path}`;
|
|
138
|
+
const headers = {
|
|
139
|
+
'Content-Type': 'application/json',
|
|
140
|
+
'User-Agent': 'clawtomaton-bunker/1.0',
|
|
141
|
+
};
|
|
142
|
+
if (authenticated) {
|
|
143
|
+
const token = await this.getSessionToken();
|
|
144
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
145
|
+
}
|
|
146
|
+
const controller = new AbortController();
|
|
147
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs ?? this.timeoutMs);
|
|
148
|
+
try {
|
|
149
|
+
const response = await fetch(url, {
|
|
150
|
+
method,
|
|
151
|
+
headers,
|
|
152
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
153
|
+
signal: controller.signal,
|
|
154
|
+
});
|
|
155
|
+
if (response.ok) {
|
|
156
|
+
// Handle 204 No Content
|
|
157
|
+
if (response.status === 204)
|
|
158
|
+
return undefined;
|
|
159
|
+
const text = await response.text();
|
|
160
|
+
if (!text)
|
|
161
|
+
return undefined;
|
|
162
|
+
return JSON.parse(text);
|
|
163
|
+
}
|
|
164
|
+
// Parse error body
|
|
165
|
+
let errorBody;
|
|
166
|
+
try {
|
|
167
|
+
errorBody = await response.json();
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Non-JSON error body
|
|
171
|
+
}
|
|
172
|
+
const errorMessage = errorBody?.error ?? `HTTP ${response.status} on ${method} ${path}`;
|
|
173
|
+
switch (response.status) {
|
|
174
|
+
case 401:
|
|
175
|
+
throw new BunkerAuthError(errorMessage, errorBody);
|
|
176
|
+
case 402:
|
|
177
|
+
throw new BunkerInsufficientFundsError(errorMessage, errorBody);
|
|
178
|
+
case 404:
|
|
179
|
+
throw new BunkerNotFoundError(errorMessage, errorBody);
|
|
180
|
+
case 429: {
|
|
181
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
182
|
+
const retryMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 5000;
|
|
183
|
+
throw new BunkerRateLimitError(errorMessage, retryMs, errorBody);
|
|
184
|
+
}
|
|
185
|
+
default:
|
|
186
|
+
throw new BunkerError(errorMessage, response.status, errorBody);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
if (err instanceof BunkerError)
|
|
191
|
+
throw err;
|
|
192
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
193
|
+
throw new BunkerError(`Request timed out after ${timeoutMs ?? this.timeoutMs}ms: ${method} ${path}`, 0);
|
|
194
|
+
}
|
|
195
|
+
throw new BunkerError(`Network error: ${err instanceof Error ? err.message : String(err)}`, 0);
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
clearTimeout(timeout);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Authenticated request with auto-refresh on 401 and rate limit retry.
|
|
203
|
+
*
|
|
204
|
+
* For mutating operations that can't be safely retried (deploy, clone),
|
|
205
|
+
* set `idempotent: false` to skip rate-limit retry.
|
|
206
|
+
*/
|
|
207
|
+
async request(method, path, body, opts) {
|
|
208
|
+
const idempotent = opts?.idempotent ?? (method === 'GET' || method === 'DELETE');
|
|
209
|
+
// Rate limit retry loop
|
|
210
|
+
for (let attempt = 0; attempt <= (idempotent ? MAX_RATE_LIMIT_RETRIES : 0); attempt++) {
|
|
211
|
+
try {
|
|
212
|
+
return await this.rawRequest(method, path, body, true, opts?.timeoutMs);
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
// Auto-refresh on 401 (only once)
|
|
216
|
+
if (err instanceof BunkerAuthError && attempt === 0) {
|
|
217
|
+
this.invalidateSession();
|
|
218
|
+
return this.rawRequest(method, path, body, true, opts?.timeoutMs);
|
|
219
|
+
}
|
|
220
|
+
// Rate limit retry with backoff
|
|
221
|
+
if (err instanceof BunkerRateLimitError && attempt < MAX_RATE_LIMIT_RETRIES && idempotent) {
|
|
222
|
+
const backoffMs = Math.min(err.retryAfterMs, 30_000) * Math.pow(2, attempt);
|
|
223
|
+
await sleep(backoffMs);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
throw err;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Should never reach here, but TypeScript needs it
|
|
230
|
+
throw new BunkerError('Max retries exceeded', 429);
|
|
231
|
+
}
|
|
232
|
+
// --------------------------------------------------------------------------
|
|
233
|
+
// Bots
|
|
234
|
+
// --------------------------------------------------------------------------
|
|
235
|
+
async createBot(req) {
|
|
236
|
+
return this.request('POST', '/bots', req, { idempotent: false });
|
|
237
|
+
}
|
|
238
|
+
async listBots() {
|
|
239
|
+
return this.request('GET', '/bots');
|
|
240
|
+
}
|
|
241
|
+
async getBot(id) {
|
|
242
|
+
return this.request('GET', `/bots/${enc(id)}`);
|
|
243
|
+
}
|
|
244
|
+
async updateBot(id, req) {
|
|
245
|
+
return this.request('PATCH', `/bots/${enc(id)}`, req);
|
|
246
|
+
}
|
|
247
|
+
async deleteBot(id) {
|
|
248
|
+
await this.request('DELETE', `/bots/${enc(id)}`);
|
|
249
|
+
}
|
|
250
|
+
async getBotStatus(id) {
|
|
251
|
+
return this.request('GET', `/bots/${enc(id)}/status`);
|
|
252
|
+
}
|
|
253
|
+
async enableCloning(botId, config) {
|
|
254
|
+
await this.request('POST', `/bots/${enc(botId)}/cloning`, config, { idempotent: false });
|
|
255
|
+
}
|
|
256
|
+
async syncClones(botId) {
|
|
257
|
+
await this.request('POST', `/bots/${enc(botId)}/clones/sync`, undefined, { idempotent: false });
|
|
258
|
+
}
|
|
259
|
+
// --------------------------------------------------------------------------
|
|
260
|
+
// Runtimes
|
|
261
|
+
// --------------------------------------------------------------------------
|
|
262
|
+
async reserveRuntime(req) {
|
|
263
|
+
return this.request('POST', '/runtimes/reserve', req, { idempotent: false });
|
|
264
|
+
}
|
|
265
|
+
async getRuntime(id) {
|
|
266
|
+
return this.request('GET', `/runtimes/${enc(id)}`);
|
|
267
|
+
}
|
|
268
|
+
async getRuntimeStatus(id) {
|
|
269
|
+
return this.request('GET', `/runtimes/${enc(id)}/status`);
|
|
270
|
+
}
|
|
271
|
+
async extendRuntime(id, req) {
|
|
272
|
+
await this.request('POST', `/runtimes/${enc(id)}/extend`, req, { idempotent: false });
|
|
273
|
+
}
|
|
274
|
+
async releaseRuntime(id) {
|
|
275
|
+
await this.request('DELETE', `/runtimes/${enc(id)}`);
|
|
276
|
+
}
|
|
277
|
+
// --------------------------------------------------------------------------
|
|
278
|
+
// Deployments
|
|
279
|
+
// --------------------------------------------------------------------------
|
|
280
|
+
async createDeployment(req) {
|
|
281
|
+
return this.request('POST', '/deployments', req, { idempotent: false });
|
|
282
|
+
}
|
|
283
|
+
async listDeployments(botId) {
|
|
284
|
+
const query = botId ? `?bot_id=${enc(botId)}` : '';
|
|
285
|
+
return this.request('GET', `/deployments${query}`);
|
|
286
|
+
}
|
|
287
|
+
async getDeployment(id) {
|
|
288
|
+
return this.request('GET', `/deployments/${enc(id)}`);
|
|
289
|
+
}
|
|
290
|
+
async stopDeployment(id) {
|
|
291
|
+
await this.request('POST', `/deployments/${enc(id)}/stop`, undefined, { idempotent: false });
|
|
292
|
+
}
|
|
293
|
+
// --------------------------------------------------------------------------
|
|
294
|
+
// Containers
|
|
295
|
+
// --------------------------------------------------------------------------
|
|
296
|
+
async listContainers(params) {
|
|
297
|
+
const query = new URLSearchParams();
|
|
298
|
+
if (params?.status)
|
|
299
|
+
query.set('status', params.status);
|
|
300
|
+
if (params?.owner)
|
|
301
|
+
query.set('owner', params.owner);
|
|
302
|
+
const qs = query.toString();
|
|
303
|
+
return this.request('GET', `/containers${qs ? '?' + qs : ''}`);
|
|
304
|
+
}
|
|
305
|
+
async getContainer(id) {
|
|
306
|
+
return this.request('GET', `/containers/${enc(id)}`);
|
|
307
|
+
}
|
|
308
|
+
async startContainer(id) {
|
|
309
|
+
await this.request('POST', `/containers/${enc(id)}/start`, undefined, { idempotent: false });
|
|
310
|
+
}
|
|
311
|
+
async stopContainer(id) {
|
|
312
|
+
await this.request('POST', `/containers/${enc(id)}/stop`, undefined, { idempotent: false });
|
|
313
|
+
}
|
|
314
|
+
async deleteContainer(id) {
|
|
315
|
+
await this.request('DELETE', `/containers/${enc(id)}`);
|
|
316
|
+
}
|
|
317
|
+
async getContainerLogs(id, tail = 100) {
|
|
318
|
+
return this.request('GET', `/containers/${enc(id)}/logs?tail=${tail}`);
|
|
319
|
+
}
|
|
320
|
+
async enableCheckpoints(id) {
|
|
321
|
+
await this.request('POST', `/containers/${enc(id)}/checkpoints`, undefined, { idempotent: false });
|
|
322
|
+
}
|
|
323
|
+
async enableContainerCloning(id, config) {
|
|
324
|
+
await this.request('POST', `/containers/${enc(id)}/cloning`, config, { idempotent: false });
|
|
325
|
+
}
|
|
326
|
+
// --------------------------------------------------------------------------
|
|
327
|
+
// Snapshots
|
|
328
|
+
// --------------------------------------------------------------------------
|
|
329
|
+
async createSnapshot(req) {
|
|
330
|
+
return this.request('POST', '/snapshots', req, { idempotent: false });
|
|
331
|
+
}
|
|
332
|
+
async listSnapshots(containerId) {
|
|
333
|
+
const query = containerId ? `?container_id=${enc(containerId)}` : '';
|
|
334
|
+
return this.request('GET', `/snapshots${query}`);
|
|
335
|
+
}
|
|
336
|
+
async getSnapshot(id) {
|
|
337
|
+
return this.request('GET', `/snapshots/${enc(id)}`);
|
|
338
|
+
}
|
|
339
|
+
async deleteSnapshot(id) {
|
|
340
|
+
await this.request('DELETE', `/snapshots/${enc(id)}`);
|
|
341
|
+
}
|
|
342
|
+
async restoreSnapshot(id, req) {
|
|
343
|
+
return this.request('POST', `/snapshots/${enc(id)}/restore`, req, { idempotent: false });
|
|
344
|
+
}
|
|
345
|
+
// --------------------------------------------------------------------------
|
|
346
|
+
// Clones
|
|
347
|
+
// --------------------------------------------------------------------------
|
|
348
|
+
async createClone(req) {
|
|
349
|
+
return this.request('POST', '/clones', req, { idempotent: false });
|
|
350
|
+
}
|
|
351
|
+
async listClones(params) {
|
|
352
|
+
const query = new URLSearchParams();
|
|
353
|
+
if (params?.bot_id)
|
|
354
|
+
query.set('bot_id', params.bot_id);
|
|
355
|
+
if (params?.active !== undefined)
|
|
356
|
+
query.set('active', String(params.active));
|
|
357
|
+
if (params?.limit !== undefined)
|
|
358
|
+
query.set('limit', String(params.limit));
|
|
359
|
+
const qs = query.toString();
|
|
360
|
+
return this.request('GET', `/clones${qs ? '?' + qs : ''}`);
|
|
361
|
+
}
|
|
362
|
+
async getClone(id) {
|
|
363
|
+
return this.request('GET', `/clones/${enc(id)}`);
|
|
364
|
+
}
|
|
365
|
+
async cancelClone(id) {
|
|
366
|
+
await this.request('POST', `/clones/${enc(id)}/cancel`, undefined, { idempotent: false });
|
|
367
|
+
}
|
|
368
|
+
// --------------------------------------------------------------------------
|
|
369
|
+
// Threat
|
|
370
|
+
// --------------------------------------------------------------------------
|
|
371
|
+
async getThreat() {
|
|
372
|
+
return this.request('GET', '/threat');
|
|
373
|
+
}
|
|
374
|
+
// --------------------------------------------------------------------------
|
|
375
|
+
// Migration
|
|
376
|
+
// --------------------------------------------------------------------------
|
|
377
|
+
async migrate(req) {
|
|
378
|
+
return this.request('POST', '/migrate', req, { idempotent: false });
|
|
379
|
+
}
|
|
380
|
+
// --------------------------------------------------------------------------
|
|
381
|
+
// Catalog
|
|
382
|
+
// --------------------------------------------------------------------------
|
|
383
|
+
async getCatalog() {
|
|
384
|
+
return this.request('GET', '/catalog');
|
|
385
|
+
}
|
|
386
|
+
// --------------------------------------------------------------------------
|
|
387
|
+
// Balance
|
|
388
|
+
// --------------------------------------------------------------------------
|
|
389
|
+
async getBalance(address) {
|
|
390
|
+
const query = address ? `?address=${enc(address)}` : '';
|
|
391
|
+
return this.request('GET', `/balance${query}`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// ============================================================================
|
|
395
|
+
// Helpers
|
|
396
|
+
// ============================================================================
|
|
397
|
+
function sleep(ms) {
|
|
398
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
399
|
+
}
|
|
400
|
+
/** URL-encode a path segment */
|
|
401
|
+
function enc(s) {
|
|
402
|
+
return encodeURIComponent(s);
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bunker/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAmCH,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGlB;IACA;IAHlB,YACE,OAAe,EACC,MAAc,EACd,IAA0B;QAE1C,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAsB;QAG1C,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC9C,YAAY,OAAe,EAAE,IAA0B;QACrD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,4BAA6B,SAAQ,WAAW;IAC3C,QAAQ,CAAqB;IAC7B,SAAS,CAAqB;IAE9C,YAAY,OAAe,EAAE,IAA0B;QACrD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAClD,YAAY,OAAe,EAAE,IAA0B;QACrD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IACnC,YAAY,CAAS;IAErC,YAAY,OAAe,EAAE,YAAoB,EAAE,IAA0B;QAC3E,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAED,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,MAAM,eAAe,GAAG,+BAA+B,CAAC;AACxD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,yBAAyB,GAAG,MAAM,CAAC,CAAC,8BAA8B;AASxE,MAAM,OAAO,YAAY;IACN,MAAM,CAAS;IACf,YAAY,CAAe;IAC3B,SAAS,CAAS;IAEnC,sBAAsB;IACd,YAAY,GAAkB,IAAI,CAAC;IACnC,gBAAgB,GAAG,CAAC,CAAC;IACrB,cAAc,GAA2B,IAAI,CAAC;IAEtD,YAAY,IAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACxD,CAAC;IAED,6EAA6E;IAC7E,OAAO;IACP,6EAA6E;IAE7E;;;;;OAKG;IACK,KAAK,CAAC,eAAe;QAC3B,+BAA+B;QAC/B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,GAAG,yBAAyB,EAAE,CAAC;YACxF,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QAED,wCAAwC;QACxC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC;QACnC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,eAAe,CAAC,iCAAiC,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAEhC,wBAAwB;QACxB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CACzC,MAAM,EACN,iBAAiB,EACjB,EAAE,OAAO,EAAE,EACX,KAAK,CACN,CAAC;QAEF,sCAAsC;QACtC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;YACpD,OAAO,EAAE,OAAkB;YAC3B,OAAO,EAAE,aAAa,CAAC,OAAO;SAC/B,CAAC,CAAC;QAEH,+BAA+B;QAC/B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CACtC,MAAM,EACN,cAAc,EACd,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,EACtD,KAAK,CACN,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC;QAElE,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,6EAA6E;IAC7E,aAAa;IACb,6EAA6E;IAE7E;;OAEG;IACK,KAAK,CAAC,UAAU,CACtB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,aAAa,GAAG,KAAK,EACrB,SAAkB;QAElB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACpC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,wBAAwB;SACvC,CAAC;QAEF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,SAAS,IAAI,IAAI,CAAC,SAAS,CAC5B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM;gBACN,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,wBAAwB;gBACxB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;oBAAE,OAAO,SAAc,CAAC;gBACnD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI;oBAAE,OAAO,SAAc,CAAC;gBACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;YAC/B,CAAC;YAED,mBAAmB;YACnB,IAAI,SAA0C,CAAC;YAC/C,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAyB,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;YAED,MAAM,YAAY,GAAG,SAAS,EAAE,KAAK,IAAI,QAAQ,QAAQ,CAAC,MAAM,OAAO,MAAM,IAAI,IAAI,EAAE,CAAC;YAExF,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxB,KAAK,GAAG;oBACN,MAAM,IAAI,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;gBACrD,KAAK,GAAG;oBACN,MAAM,IAAI,4BAA4B,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;gBAClE,KAAK,GAAG;oBACN,MAAM,IAAI,mBAAmB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;gBACzD,KAAK,GAAG,CAAC,CAAC,CAAC;oBACT,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;oBACvD,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBACpE,MAAM,IAAI,oBAAoB,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBACnE,CAAC;gBACD;oBACE,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,WAAW;gBAAE,MAAM,GAAG,CAAC;YAC1C,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACtD,MAAM,IAAI,WAAW,CAAC,2BAA2B,SAAS,IAAI,IAAI,CAAC,SAAS,OAAO,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1G,CAAC;YACD,MAAM,IAAI,WAAW,CACnB,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACpE,CAAC,CACF,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,IAAmD;QAEnD,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAC;QAEjF,wBAAwB;QACxB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YACtF,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAC7E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,kCAAkC;gBAClC,IAAI,GAAG,YAAY,eAAe,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;oBACpD,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,UAAU,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBACvE,CAAC;gBAED,gCAAgC;gBAChC,IAAI,GAAG,YAAY,oBAAoB,IAAI,OAAO,GAAG,sBAAsB,IAAI,UAAU,EAAE,CAAC;oBAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC5E,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;oBACvB,SAAS;gBACX,CAAC;gBAED,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,MAAM,IAAI,WAAW,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,6EAA6E;IAC7E,OAAO;IACP,6EAA6E;IAE7E,KAAK,CAAC,SAAS,CAAC,GAAqB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAM,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,OAAO,CAAQ,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,OAAO,CAAM,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,GAAqB;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAM,OAAO,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,MAAM,IAAI,CAAC,OAAO,CAAO,QAAQ,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAY,KAAK,EAAE,SAAS,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,MAAqB;QACtD,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,SAAS,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,SAAS,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,6EAA6E;IAC7E,WAAW;IACX,6EAA6E;IAE7E,KAAK,CAAC,cAAc,CAAC,GAA0B;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAU,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,OAAO,CAAU,KAAK,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAU;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAgB,KAAK,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU,EAAE,GAAyB;QACvD,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,IAAI,CAAC,OAAO,CAAO,QAAQ,EAAE,aAAa,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,6EAA6E;IAC7E,cAAc;IACd,6EAA6E;IAE7E,KAAK,CAAC,gBAAgB,CAAC,GAA4B;QACjD,OAAO,IAAI,CAAC,OAAO,CAAa,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAc;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,OAAO,CAAe,KAAK,EAAE,eAAe,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAa,KAAK,EAAE,gBAAgB,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,gBAAgB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,6EAA6E;IAC7E,aAAa;IACb,6EAA6E;IAE7E,KAAK,CAAC,cAAc,CAAC,MAA4B;QAC/C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,MAAM,EAAE,MAAM;YAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,MAAM,EAAE,KAAK;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAc,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAY,KAAK,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU;QAC9B,MAAM,IAAI,CAAC,OAAO,CAAO,QAAQ,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAU,EAAE,IAAI,GAAG,GAAG;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAS,KAAK,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,EAAU;QAChC,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,EAAU,EAAE,MAAqB;QAC5D,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,eAAe,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,6EAA6E;IAC7E,YAAY;IACZ,6EAA6E;IAE7E,KAAK,CAAC,cAAc,CAAC,GAA0B;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAW,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,WAAoB;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC,OAAO,CAAa,KAAK,EAAE,aAAa,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAW,KAAK,EAAE,cAAc,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,IAAI,CAAC,OAAO,CAAO,QAAQ,EAAE,cAAc,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,GAA2B;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAW,MAAM,EAAE,cAAc,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,6EAA6E;IAC7E,SAAS;IACT,6EAA6E;IAE7E,KAAK,CAAC,WAAW,CAAC,GAAuB;QACvC,OAAO,IAAI,CAAC,OAAO,CAAQ,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAwB;QACvC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,MAAM,EAAE,MAAM;YAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAU,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,OAAO,CAAQ,KAAK,EAAE,WAAW,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,6EAA6E;IAC7E,SAAS;IACT,6EAA6E;IAE7E,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAmB,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,6EAA6E;IAC7E,YAAY;IACZ,6EAA6E;IAE7E,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAY,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,6EAA6E;IAC7E,UAAU;IACV,6EAA6E;IAE7E,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,OAAO,CAAkB,KAAK,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,6EAA6E;IAC7E,UAAU;IACV,6EAA6E;IAE7E,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,OAAO,CAAgB,KAAK,EAAE,WAAW,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;CACF;AAED,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,gCAAgC;AAChC,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-deployment — packages the agent and deploys to MoltBunker.
|
|
3
|
+
*
|
|
4
|
+
* Flow:
|
|
5
|
+
* 1. Pre-flight checks (BUNKER balance, no duplicate deployments)
|
|
6
|
+
* 2. Register bot on MoltBunker (or reuse existing)
|
|
7
|
+
* 3. Reserve runtime with requested tier/region
|
|
8
|
+
* 4. Deploy container with agent config as env vars
|
|
9
|
+
* 5. Enable cloning if configured
|
|
10
|
+
* 6. Health verification (poll until running + heartbeat in logs)
|
|
11
|
+
* 7. Persist state (bot_id, runtime_id, deployment_id, container_id)
|
|
12
|
+
*
|
|
13
|
+
* Edge cases:
|
|
14
|
+
* - Existing running container → return status instead of re-deploying
|
|
15
|
+
* - Bot already registered → reuse it
|
|
16
|
+
* - Partial failure (runtime reserved, deploy fails) → release runtime
|
|
17
|
+
* - Env var size limits → config is small enough to fit, state stays in container volume
|
|
18
|
+
*/
|
|
19
|
+
import type { ClawtomatonConfig, ClawtomatonIdentity } from '../types.js';
|
|
20
|
+
import type { StateStore } from '../state/index.js';
|
|
21
|
+
import type { BunkerClient } from './client.js';
|
|
22
|
+
import type { BunkerRegion } from './types.js';
|
|
23
|
+
export interface SelfDeployResult {
|
|
24
|
+
botId: string;
|
|
25
|
+
runtimeId: string;
|
|
26
|
+
deploymentId: string;
|
|
27
|
+
containerId: string;
|
|
28
|
+
expiresAt: number;
|
|
29
|
+
region: BunkerRegion;
|
|
30
|
+
onionAddress: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface SelfDeployOptions {
|
|
33
|
+
/** Override docker image (default: ghcr.io/clawnch/clawtomaton:latest) */
|
|
34
|
+
image?: string;
|
|
35
|
+
/** Override runtime duration in hours */
|
|
36
|
+
durationHours?: number;
|
|
37
|
+
/** Override region */
|
|
38
|
+
region?: BunkerRegion;
|
|
39
|
+
/** Skip health verification (useful for testing) */
|
|
40
|
+
skipHealthCheck?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Deploy this agent to MoltBunker. Handles the full lifecycle:
|
|
44
|
+
* bot registration → runtime reservation → container deployment → health check.
|
|
45
|
+
*
|
|
46
|
+
* Idempotent: if already deployed and running, returns existing state.
|
|
47
|
+
*/
|
|
48
|
+
export declare function selfDeploy(client: BunkerClient, config: ClawtomatonConfig, identity: ClawtomatonIdentity, state: StateStore, opts?: SelfDeployOptions): Promise<SelfDeployResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Stop the bunker deployment and clean up state.
|
|
51
|
+
* Does NOT delete the bot — it can be reused for future deployments.
|
|
52
|
+
*/
|
|
53
|
+
export declare function stopDeploy(client: BunkerClient, state: StateStore): Promise<void>;
|
|
54
|
+
//# sourceMappingURL=self-deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-deploy.d.ts","sourceRoot":"","sources":["../../src/bunker/self-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAEV,YAAY,EAMb,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oDAAoD;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAcD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,iBAAiB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAsI3B;AAMD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAsCf"}
|