agentbnb 5.1.10 → 6.0.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.
Files changed (49) hide show
  1. package/dist/{card-RSGDCHCV.js → card-REW7BSWW.js} +1 -1
  2. package/dist/{chunk-EPIWHNB2.js → chunk-2TLZ6G2B.js} +446 -373
  3. package/dist/{chunk-WGZ5AGOX.js → chunk-3CIMVISQ.js} +24 -1
  4. package/dist/{chunk-NH2FIERR.js → chunk-574W3HHE.js} +1 -1
  5. package/dist/{chunk-B5FTAGFN.js → chunk-7XHDSWRD.js} +75 -75
  6. package/dist/{chunk-NLAWT4DT.js → chunk-7YLFLC5C.js} +6 -6
  7. package/dist/chunk-BP3L2TET.js +148 -0
  8. package/dist/{chunk-EGUOAHCW.js → chunk-C2T4BMRW.js} +12 -12
  9. package/dist/{chunk-5KFI5X7B.js → chunk-F53QQIM2.js} +1 -1
  10. package/dist/chunk-JR6TJDIF.js +425 -0
  11. package/dist/{chunk-DFBX3BBD.js → chunk-KA2VIEGM.js} +211 -16
  12. package/dist/chunk-NQTE577Q.js +159 -0
  13. package/dist/{chunk-WTXRY7R2.js → chunk-NYV3NE5Z.js} +157 -9
  14. package/dist/{chunk-UKT6H7YT.js → chunk-OZXCRLP3.js} +1 -1
  15. package/dist/{chunk-QITOPASZ.js → chunk-PSQHUZ7X.js} +1 -1
  16. package/dist/{chunk-EANI2N2V.js → chunk-RVYQSC6L.js} +2 -99
  17. package/dist/{chunk-MLS6IGGG.js → chunk-TQDV254A.js} +1 -1
  18. package/dist/{chunk-QQFBFV4V.js → chunk-TR6UZDNX.js} +57 -18
  19. package/dist/{chunk-ZX5623ER.js → chunk-VMH2YS2I.js} +1 -1
  20. package/dist/{chunk-XND2DWTZ.js → chunk-VPQ44XKE.js} +2 -2
  21. package/dist/{chunk-CSATDXZC.js → chunk-Y7T6IMM3.js} +1 -1
  22. package/dist/{chunk-FLY3WIQR.js → chunk-YRRVFTDR.js} +3 -3
  23. package/dist/cli/index.js +261 -125
  24. package/dist/{client-T5MTY3CS.js → client-HRYRJKSA.js} +3 -3
  25. package/dist/{conduct-WU3VEXB6.js → conduct-LF6FYPLD.js} +11 -11
  26. package/dist/conduct-QAFZIEY6.js +21 -0
  27. package/dist/{conductor-mode-ZMTFZGJP.js → conductor-mode-NUDQLZFM.js} +309 -13
  28. package/dist/conductor-mode-YQ6QSPPT.js +275 -0
  29. package/dist/{execute-4D4ITQCL.js → execute-ITHIYYOX.js} +4 -3
  30. package/dist/execute-PNJFABVJ.js +14 -0
  31. package/dist/index.d.ts +555 -0
  32. package/dist/index.js +592 -83
  33. package/dist/{process-guard-CC7CNRQJ.js → process-guard-QCCBGILS.js} +1 -1
  34. package/dist/publish-capability-TS6CNR5G.js +12 -0
  35. package/dist/{request-VOXBFUOG.js → request-P6QCTCCG.js} +14 -14
  36. package/dist/{serve-skill-IH7UAJNR.js → serve-skill-EZOL7UYN.js} +10 -9
  37. package/dist/{server-JVQW2TID.js → server-3G6ZTASA.js} +16 -16
  38. package/dist/{service-coordinator-EYRDTHL5.js → service-coordinator-CRSE4GWC.js} +174 -242
  39. package/dist/skill-config-4W5W5O6T.js +22 -0
  40. package/dist/skills/agentbnb/bootstrap.js +227 -67
  41. package/openclaw.plugin.json +1 -1
  42. package/package.json +1 -1
  43. package/skills/agentbnb/SKILL.md +50 -1
  44. package/skills/agentbnb/bootstrap.ts +126 -8
  45. package/skills/agentbnb/install.sh +49 -9
  46. package/dist/chunk-CRFCWD6V.js +0 -366
  47. package/dist/conduct-6LKIJJKQ.js +0 -21
  48. package/dist/conductor-mode-Q4IIDY5E.js +0 -123
  49. package/dist/execute-T7Y6RKSW.js +0 -13
@@ -0,0 +1,425 @@
1
+ import {
2
+ confirmEscrowDebit,
3
+ getBalance,
4
+ getCard,
5
+ holdEscrow,
6
+ insertRequestLog,
7
+ recordEarning,
8
+ releaseEscrow,
9
+ settleEscrow,
10
+ updateReputation,
11
+ verifyEscrowReceipt
12
+ } from "./chunk-2TLZ6G2B.js";
13
+ import {
14
+ loadConfig
15
+ } from "./chunk-IVOYM3WG.js";
16
+ import {
17
+ AgentBnBError
18
+ } from "./chunk-3CIMVISQ.js";
19
+
20
+ // src/gateway/execute.ts
21
+ import { randomUUID } from "crypto";
22
+
23
+ // src/credit/settlement.ts
24
+ function settleProviderEarning(providerDb, providerOwner, receipt) {
25
+ recordEarning(
26
+ providerDb,
27
+ providerOwner,
28
+ receipt.amount,
29
+ receipt.card_id,
30
+ receipt.nonce
31
+ );
32
+ return { settled: true };
33
+ }
34
+ function settleRequesterEscrow(requesterDb, escrowId) {
35
+ confirmEscrowDebit(requesterDb, escrowId);
36
+ }
37
+ function releaseRequesterEscrow(requesterDb, escrowId) {
38
+ releaseEscrow(requesterDb, escrowId);
39
+ }
40
+
41
+ // src/gateway/execute.ts
42
+ async function notifyTelegramSkillExecuted(opts) {
43
+ const cfg = loadConfig();
44
+ if (!cfg?.telegram_notifications) return;
45
+ const token = cfg.telegram_bot_token ?? process.env["TELEGRAM_BOT_TOKEN"];
46
+ const chatId = cfg.telegram_chat_id ?? process.env["TELEGRAM_CHAT_ID"];
47
+ if (!token || !chatId) return;
48
+ const balance = getBalance(opts.creditDb, opts.owner);
49
+ const skillLabel = opts.skillId ? `${opts.skillName} (${opts.skillId})` : opts.skillName;
50
+ const text = [
51
+ "[AgentBnB] Skill executed",
52
+ `Skill: ${skillLabel}`,
53
+ `Requester: ${opts.requester}`,
54
+ `Earned: +${opts.creditsEarned} credits`,
55
+ `Balance: ${balance} credits`,
56
+ `Latency: ${opts.latencyMs}ms`
57
+ ].join("\n");
58
+ await fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
59
+ method: "POST",
60
+ headers: { "Content-Type": "application/json" },
61
+ body: JSON.stringify({ chat_id: chatId, text })
62
+ });
63
+ }
64
+ async function executeCapabilityRequest(opts) {
65
+ const {
66
+ registryDb,
67
+ creditDb,
68
+ cardId,
69
+ skillId,
70
+ params,
71
+ requester,
72
+ escrowReceipt: receipt,
73
+ skillExecutor,
74
+ handlerUrl,
75
+ timeoutMs = 3e5,
76
+ onProgress,
77
+ relayAuthorized = false
78
+ } = opts;
79
+ const card = getCard(registryDb, cardId);
80
+ if (!card) {
81
+ return { success: false, error: { code: -32602, message: `Card not found: ${cardId}` } };
82
+ }
83
+ if (requester === card.owner && !relayAuthorized) {
84
+ const msg = `Self-request blocked: requester (${requester}) is the card owner. Set AGENTBNB_DIR to your agent's config directory before calling agentbnb request.`;
85
+ try {
86
+ insertRequestLog(registryDb, {
87
+ id: randomUUID(),
88
+ card_id: cardId,
89
+ card_name: card.name,
90
+ skill_id: skillId,
91
+ requester,
92
+ status: "failure",
93
+ latency_ms: 0,
94
+ credits_charged: 0,
95
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
96
+ failure_reason: "auth_error"
97
+ });
98
+ } catch {
99
+ }
100
+ return { success: false, error: { code: -32603, message: msg } };
101
+ }
102
+ let creditsNeeded;
103
+ let cardName;
104
+ let resolvedSkillId;
105
+ const rawCard = card;
106
+ if (Array.isArray(rawCard["skills"])) {
107
+ const v2card = card;
108
+ const skill = skillId ? v2card.skills.find((s) => s.id === skillId) : v2card.skills[0];
109
+ if (!skill) {
110
+ return { success: false, error: { code: -32602, message: `Skill not found: ${skillId}` } };
111
+ }
112
+ creditsNeeded = skill.pricing.credits_per_call;
113
+ cardName = skill.name;
114
+ resolvedSkillId = skill.id;
115
+ } else {
116
+ creditsNeeded = card.pricing.credits_per_call;
117
+ cardName = card.name;
118
+ }
119
+ let escrowId = null;
120
+ let isRemoteEscrow = false;
121
+ if (relayAuthorized) {
122
+ } else if (receipt) {
123
+ const { signature, ...receiptData2 } = receipt;
124
+ const publicKeyBuf = Buffer.from(receipt.requester_public_key, "hex");
125
+ const valid = verifyEscrowReceipt(receiptData2, signature, publicKeyBuf);
126
+ if (!valid) {
127
+ return { success: false, error: { code: -32603, message: "Invalid escrow receipt signature" } };
128
+ }
129
+ if (receipt.amount < creditsNeeded) {
130
+ return { success: false, error: { code: -32603, message: "Insufficient escrow amount" } };
131
+ }
132
+ const receiptAge = Date.now() - new Date(receipt.timestamp).getTime();
133
+ if (receiptAge > 5 * 60 * 1e3) {
134
+ return { success: false, error: { code: -32603, message: "Escrow receipt expired" } };
135
+ }
136
+ isRemoteEscrow = true;
137
+ } else {
138
+ try {
139
+ const balance = getBalance(creditDb, requester);
140
+ if (balance < creditsNeeded) {
141
+ return { success: false, error: { code: -32603, message: "Insufficient credits" } };
142
+ }
143
+ escrowId = holdEscrow(creditDb, requester, creditsNeeded, cardId);
144
+ } catch (err) {
145
+ const msg = err instanceof AgentBnBError ? err.message : "Failed to hold escrow";
146
+ return { success: false, error: { code: -32603, message: msg } };
147
+ }
148
+ }
149
+ const startMs = Date.now();
150
+ const receiptData = isRemoteEscrow ? { receipt_released: true } : void 0;
151
+ const handleFailure = (status, latencyMs, message, failureReason = "bad_execution") => {
152
+ if (!isRemoteEscrow && escrowId) releaseEscrow(creditDb, escrowId);
153
+ updateReputation(registryDb, cardId, false, latencyMs);
154
+ try {
155
+ insertRequestLog(registryDb, {
156
+ id: randomUUID(),
157
+ card_id: cardId,
158
+ card_name: cardName,
159
+ skill_id: resolvedSkillId,
160
+ requester,
161
+ status,
162
+ latency_ms: latencyMs,
163
+ credits_charged: 0,
164
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
165
+ failure_reason: failureReason
166
+ });
167
+ } catch {
168
+ }
169
+ return {
170
+ success: false,
171
+ error: { code: -32603, message, ...receiptData ? { data: receiptData } : {} }
172
+ };
173
+ };
174
+ const handleSuccess = (result, latencyMs) => {
175
+ if (isRemoteEscrow && receipt) {
176
+ settleProviderEarning(creditDb, card.owner, receipt);
177
+ } else if (escrowId) {
178
+ settleEscrow(creditDb, escrowId, card.owner);
179
+ }
180
+ updateReputation(registryDb, cardId, true, latencyMs);
181
+ try {
182
+ insertRequestLog(registryDb, {
183
+ id: randomUUID(),
184
+ card_id: cardId,
185
+ card_name: cardName,
186
+ skill_id: resolvedSkillId,
187
+ requester,
188
+ status: "success",
189
+ latency_ms: latencyMs,
190
+ credits_charged: creditsNeeded,
191
+ created_at: (/* @__PURE__ */ new Date()).toISOString()
192
+ });
193
+ } catch {
194
+ }
195
+ notifyTelegramSkillExecuted({
196
+ creditDb,
197
+ owner: card.owner,
198
+ skillName: cardName,
199
+ skillId: resolvedSkillId ?? null,
200
+ requester,
201
+ creditsEarned: creditsNeeded,
202
+ latencyMs
203
+ }).catch(() => {
204
+ });
205
+ const successResult = isRemoteEscrow ? {
206
+ ...typeof result === "object" && result !== null ? result : { data: result },
207
+ receipt_settled: true,
208
+ receipt_nonce: receipt.nonce
209
+ } : result;
210
+ return { success: true, result: successResult };
211
+ };
212
+ if (skillExecutor) {
213
+ let targetSkillId = resolvedSkillId ?? skillId;
214
+ if (!targetSkillId) {
215
+ const available = skillExecutor.listSkills();
216
+ if (available.length > 0) {
217
+ targetSkillId = available[0];
218
+ } else {
219
+ return handleFailure(
220
+ "failure",
221
+ Date.now() - startMs,
222
+ "No skill_id specified and no skills registered on this provider.",
223
+ "not_found"
224
+ );
225
+ }
226
+ }
227
+ try {
228
+ const execResult = await skillExecutor.execute(targetSkillId, params, onProgress);
229
+ if (!execResult.success) {
230
+ return handleFailure("failure", execResult.latency_ms, execResult.error ?? "Execution failed", "bad_execution");
231
+ }
232
+ return handleSuccess(execResult.result, execResult.latency_ms);
233
+ } catch (err) {
234
+ const message = err instanceof Error ? err.message : "Execution error";
235
+ return handleFailure("failure", Date.now() - startMs, message, "bad_execution");
236
+ }
237
+ }
238
+ if (!handlerUrl) {
239
+ return handleFailure("failure", Date.now() - startMs, "No skill executor or handler URL configured", "bad_execution");
240
+ }
241
+ const controller = new AbortController();
242
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
243
+ try {
244
+ const response = await fetch(handlerUrl, {
245
+ method: "POST",
246
+ headers: { "Content-Type": "application/json" },
247
+ body: JSON.stringify({ card_id: cardId, skill_id: resolvedSkillId, params }),
248
+ signal: controller.signal
249
+ });
250
+ clearTimeout(timer);
251
+ if (!response.ok) {
252
+ return handleFailure("failure", Date.now() - startMs, `Handler returned ${response.status}`, "bad_execution");
253
+ }
254
+ const result = await response.json();
255
+ return handleSuccess(result, Date.now() - startMs);
256
+ } catch (err) {
257
+ clearTimeout(timer);
258
+ const isTimeout = err instanceof Error && err.name === "AbortError";
259
+ return handleFailure(
260
+ isTimeout ? "timeout" : "failure",
261
+ Date.now() - startMs,
262
+ isTimeout ? "Execution timeout" : "Handler error",
263
+ isTimeout ? "timeout" : "bad_execution"
264
+ );
265
+ }
266
+ }
267
+ async function executeCapabilityBatch(options) {
268
+ const { requests, strategy, total_budget, registryDb, creditDb, owner } = options;
269
+ if (requests.length === 0) {
270
+ return { results: [], total_credits_spent: 0, total_credits_refunded: 0, success: true };
271
+ }
272
+ const sumMaxCredits = requests.reduce((acc, r) => acc + r.max_credits, 0);
273
+ if (sumMaxCredits > total_budget) {
274
+ return {
275
+ results: requests.map((_, i) => ({
276
+ request_index: i,
277
+ status: "skipped",
278
+ credits_spent: 0,
279
+ credits_refunded: 0,
280
+ error: `Total requested credits (${sumMaxCredits}) exceeds total_budget (${total_budget})`
281
+ })),
282
+ total_credits_spent: 0,
283
+ total_credits_refunded: 0,
284
+ success: false
285
+ };
286
+ }
287
+ const executeItem = async (item, index) => {
288
+ const card = getCard(registryDb, item.skill_id);
289
+ if (!card) {
290
+ return {
291
+ request_index: index,
292
+ status: "failed",
293
+ credits_spent: 0,
294
+ credits_refunded: 0,
295
+ error: `Card/skill not found: ${item.skill_id}`
296
+ };
297
+ }
298
+ const rawCard = card;
299
+ let creditsNeeded;
300
+ let resolvedSkillId;
301
+ if (Array.isArray(rawCard["skills"])) {
302
+ const v2card = card;
303
+ const skill = v2card.skills[0];
304
+ if (!skill) {
305
+ return {
306
+ request_index: index,
307
+ status: "failed",
308
+ credits_spent: 0,
309
+ credits_refunded: 0,
310
+ error: `No skills defined on card: ${item.skill_id}`
311
+ };
312
+ }
313
+ creditsNeeded = skill.pricing.credits_per_call;
314
+ resolvedSkillId = skill.id;
315
+ } else {
316
+ creditsNeeded = card.pricing.credits_per_call;
317
+ }
318
+ if (creditsNeeded > item.max_credits) {
319
+ return {
320
+ request_index: index,
321
+ status: "failed",
322
+ credits_spent: 0,
323
+ credits_refunded: 0,
324
+ error: `Skill costs ${creditsNeeded} credits but max_credits is ${item.max_credits}`
325
+ };
326
+ }
327
+ let escrowId;
328
+ try {
329
+ const balance = getBalance(creditDb, owner);
330
+ if (balance < creditsNeeded) {
331
+ return {
332
+ request_index: index,
333
+ status: "failed",
334
+ credits_spent: 0,
335
+ credits_refunded: 0,
336
+ error: "Insufficient credits"
337
+ };
338
+ }
339
+ escrowId = holdEscrow(creditDb, owner, creditsNeeded, card.id);
340
+ } catch (err) {
341
+ const msg = err instanceof AgentBnBError ? err.message : "Failed to hold escrow";
342
+ return {
343
+ request_index: index,
344
+ status: "failed",
345
+ credits_spent: 0,
346
+ credits_refunded: 0,
347
+ error: msg
348
+ };
349
+ }
350
+ const startMs = Date.now();
351
+ const latencyMs = Date.now() - startMs;
352
+ settleEscrow(creditDb, escrowId, card.owner);
353
+ updateReputation(registryDb, card.id, true, latencyMs);
354
+ try {
355
+ insertRequestLog(registryDb, {
356
+ id: randomUUID(),
357
+ card_id: card.id,
358
+ card_name: card.name,
359
+ skill_id: resolvedSkillId,
360
+ requester: owner,
361
+ status: "success",
362
+ latency_ms: latencyMs,
363
+ credits_charged: creditsNeeded,
364
+ created_at: (/* @__PURE__ */ new Date()).toISOString()
365
+ });
366
+ } catch {
367
+ }
368
+ return {
369
+ request_index: index,
370
+ status: "success",
371
+ result: { card_id: card.id, skill_id: resolvedSkillId },
372
+ credits_spent: creditsNeeded,
373
+ credits_refunded: 0
374
+ };
375
+ };
376
+ let results;
377
+ if (strategy === "sequential") {
378
+ results = [];
379
+ let stopped = false;
380
+ for (let i = 0; i < requests.length; i++) {
381
+ if (stopped) {
382
+ results.push({
383
+ request_index: i,
384
+ status: "skipped",
385
+ credits_spent: 0,
386
+ credits_refunded: 0,
387
+ error: "Skipped due to earlier failure"
388
+ });
389
+ continue;
390
+ }
391
+ const result = await executeItem(requests[i], i);
392
+ results.push(result);
393
+ if (result.status === "failed") {
394
+ stopped = true;
395
+ }
396
+ }
397
+ } else {
398
+ const settled = await Promise.allSettled(
399
+ requests.map((item, i) => executeItem(item, i))
400
+ );
401
+ results = settled.map((outcome, i) => {
402
+ if (outcome.status === "fulfilled") {
403
+ return outcome.value;
404
+ }
405
+ return {
406
+ request_index: i,
407
+ status: "failed",
408
+ credits_spent: 0,
409
+ credits_refunded: 0,
410
+ error: outcome.reason instanceof Error ? outcome.reason.message : "Unknown error"
411
+ };
412
+ });
413
+ }
414
+ const total_credits_spent = results.reduce((acc, r) => acc + r.credits_spent, 0);
415
+ const total_credits_refunded = results.reduce((acc, r) => acc + r.credits_refunded, 0);
416
+ const success = results.every((r) => r.status === "success");
417
+ return { results, total_credits_spent, total_credits_refunded, success };
418
+ }
419
+
420
+ export {
421
+ settleRequesterEscrow,
422
+ releaseRequesterEscrow,
423
+ executeCapabilityRequest,
424
+ executeCapabilityBatch
425
+ };