agentbnb 8.2.2 → 8.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/dist/{card-EX2EYGCZ.js → card-BN643ZOY.js} +6 -2
- package/dist/card-T2XJZA5A.js +92 -0
- package/dist/{chunk-3LWBH7P3.js → chunk-4NFJ3VYZ.js} +20 -1
- package/dist/chunk-5AIYALBX.js +857 -0
- package/dist/chunk-6QMDJVMS.js +238 -0
- package/dist/{chunk-LKLKYXLV.js → chunk-74LZDEDT.js} +6 -4
- package/dist/{chunk-GKVTD4EZ.js → chunk-77KGEDH4.js} +1 -1
- package/dist/{chunk-QCGIG7WW.js → chunk-7IQE34QK.js} +14 -7
- package/dist/{chunk-QHZGOG3O.js → chunk-D242QZCR.js} +168 -41
- package/dist/chunk-EE3V3DXK.js +60 -0
- package/dist/{chunk-RYISHSHB.js → chunk-F3KIEVJ2.js} +207 -265
- package/dist/{chunk-XBGVQMQJ.js → chunk-FELGHDCA.js} +16 -39
- package/dist/{chunk-EJKW57ZV.js → chunk-GIEJVKZZ.js} +1 -1
- package/dist/{chunk-WVY2W7AA.js → chunk-I7KWA7OB.js} +20 -0
- package/dist/{chunk-4IPJJRTP.js → chunk-IGQNP3ZO.js} +5 -2
- package/dist/chunk-NQANA6WH.js +797 -0
- package/dist/{chunk-Z4MCGKTL.js → chunk-NX27AFPA.js} +15 -2
- package/dist/{chunk-Z2GEFFDO.js → chunk-O4Q7BRG6.js} +2 -2
- package/dist/{chunk-SSK653A6.js → chunk-PQIP7EXY.js} +6 -0
- package/dist/{chunk-EG6RS4JC.js → chunk-QFPXZITP.js} +20 -65
- package/dist/chunk-R4F4XII4.js +264 -0
- package/dist/{chunk-DYQOFGGI.js → chunk-RVBW2QXU.js} +178 -49
- package/dist/{chunk-CQFBNTGT.js → chunk-S7DZHKCG.js} +25 -12
- package/dist/chunk-U6LP4KWN.js +238 -0
- package/dist/{chunk-MWOXW7JQ.js → chunk-VJ7XBEY6.js} +24 -16
- package/dist/chunk-WTHMHNKC.js +129 -0
- package/dist/{chunk-OCSU2S6W.js → chunk-WX3GZVFG.js} +2 -1
- package/dist/{chunk-CKOOVZOI.js → chunk-YKMBFQC2.js} +37 -5
- package/dist/{chunk-S3V6R3EN.js → chunk-ZU2TP7CN.js} +70 -27
- package/dist/cli/index.js +211 -278
- package/dist/client-OKJJ3UP2.js +19 -0
- package/dist/client-UQBGCIPA.js +20 -0
- package/dist/conduct-4JDMWBQD.js +22 -0
- package/dist/{conduct-AZFLNUX3.js → conduct-VYYBCPHA.js} +14 -13
- package/dist/{conductor-mode-WKB42PYM.js → conductor-mode-OPGQJFLA.js} +12 -8
- package/dist/{conductor-mode-PLTB6MS3.js → conductor-mode-SBDCRIX6.js} +16 -11
- package/dist/execute-FZLQGIXB.js +14 -0
- package/dist/execute-TEZPQ5WP.js +15 -0
- package/dist/index.d.ts +172 -11
- package/dist/index.js +1529 -433
- package/dist/{process-guard-GH5LRNWO.js → process-guard-TNSUNHSR.js} +1 -1
- package/dist/{publish-capability-QDR2QIZ2.js → publish-capability-HVYILTPR.js} +4 -3
- package/dist/{reliability-metrics-QG7WC5QK.js → reliability-metrics-G7LPUYJD.js} +3 -1
- package/dist/reliability-metrics-RRUKJ4ME.js +20 -0
- package/dist/{request-NX7GSPIG.js → request-KJNKR27T.js} +96 -43
- package/dist/{serve-skill-E6EJQYAK.js → serve-skill-GC6NIQ5T.js} +10 -11
- package/dist/{server-VBCT32FC.js → server-YV3XPTX5.js} +11 -10
- package/dist/{service-coordinator-KMSA6BST.js → service-coordinator-RY5AKUZS.js} +420 -171
- package/dist/{skill-config-FETXPNVP.js → skill-config-5O2VR546.js} +1 -1
- package/dist/skills/agentbnb/bootstrap.js +550 -231
- package/dist/websocket-client-3U27WJUU.js +7 -0
- package/dist/{websocket-client-4Z5P54RU.js → websocket-client-SNDF3B6N.js} +1 -1
- package/package.json +18 -12
- package/skills/agentbnb/install.sh +0 -0
- package/dist/chunk-MCED4GDW.js +0 -1572
- package/dist/chunk-NWIQJ2CL.js +0 -108
- package/dist/chunk-WNXXLCV5.js +0 -32
- package/dist/client-XOLP5IUZ.js +0 -12
- package/dist/conduct-VPUYTNEA.js +0 -21
- package/dist/execute-NNDCXTN4.js +0 -13
- package/dist/execute-RIRHTIBU.js +0 -16
- package/dist/websocket-client-QOVARTRN.js +0 -7
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ensureAgentsTable,
|
|
3
|
+
resolveCanonicalIdentity
|
|
4
|
+
} from "./chunk-WTHMHNKC.js";
|
|
5
|
+
|
|
6
|
+
// src/credit/owner-normalization.ts
|
|
7
|
+
var RESERVED_OWNERS = /* @__PURE__ */ new Set(["platform_treasury"]);
|
|
8
|
+
function tableExists(db, table) {
|
|
9
|
+
const row = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(table);
|
|
10
|
+
return row !== void 0;
|
|
11
|
+
}
|
|
12
|
+
function mergeBalanceRows(db, oldOwner, newOwner, now) {
|
|
13
|
+
if (!tableExists(db, "credit_balances")) return;
|
|
14
|
+
const oldRow = db.prepare("SELECT balance FROM credit_balances WHERE owner = ?").get(oldOwner);
|
|
15
|
+
if (!oldRow) return;
|
|
16
|
+
const newRow = db.prepare("SELECT balance FROM credit_balances WHERE owner = ?").get(newOwner);
|
|
17
|
+
if (newRow) {
|
|
18
|
+
db.prepare(
|
|
19
|
+
"UPDATE credit_balances SET balance = balance + ?, updated_at = ? WHERE owner = ?"
|
|
20
|
+
).run(oldRow.balance, now, newOwner);
|
|
21
|
+
db.prepare("DELETE FROM credit_balances WHERE owner = ?").run(oldOwner);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
db.prepare("UPDATE credit_balances SET owner = ?, updated_at = ? WHERE owner = ?").run(
|
|
25
|
+
newOwner,
|
|
26
|
+
now,
|
|
27
|
+
oldOwner
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
function mergeProviderRegistryRows(db, oldOwner, newOwner) {
|
|
31
|
+
if (!tableExists(db, "provider_registry")) return;
|
|
32
|
+
const oldRow = db.prepare("SELECT provider_number FROM provider_registry WHERE owner = ?").get(oldOwner);
|
|
33
|
+
if (!oldRow) return;
|
|
34
|
+
const newRow = db.prepare("SELECT provider_number FROM provider_registry WHERE owner = ?").get(newOwner);
|
|
35
|
+
if (newRow) {
|
|
36
|
+
db.prepare("DELETE FROM provider_registry WHERE owner = ?").run(oldOwner);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
db.prepare("UPDATE provider_registry SET owner = ? WHERE owner = ?").run(newOwner, oldOwner);
|
|
40
|
+
}
|
|
41
|
+
function mergeReliabilityRows(db, oldOwner, newOwner, now) {
|
|
42
|
+
if (!tableExists(db, "provider_reliability_metrics")) return;
|
|
43
|
+
const oldRow = db.prepare("SELECT * FROM provider_reliability_metrics WHERE owner = ?").get(oldOwner);
|
|
44
|
+
if (!oldRow) return;
|
|
45
|
+
const newRow = db.prepare("SELECT * FROM provider_reliability_metrics WHERE owner = ?").get(newOwner);
|
|
46
|
+
if (!newRow) {
|
|
47
|
+
db.prepare(
|
|
48
|
+
"UPDATE provider_reliability_metrics SET owner = ?, updated_at = ? WHERE owner = ?"
|
|
49
|
+
).run(newOwner, now, oldOwner);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const cycleStartCandidates = [oldRow.cycle_start, newRow.cycle_start].filter(Boolean);
|
|
53
|
+
const mergedCycleStart = cycleStartCandidates.length > 0 ? cycleStartCandidates.slice().sort((left, right) => left.localeCompare(right))[0] : now;
|
|
54
|
+
db.prepare(
|
|
55
|
+
`UPDATE provider_reliability_metrics
|
|
56
|
+
SET current_streak = ?,
|
|
57
|
+
longest_streak = ?,
|
|
58
|
+
total_hires = ?,
|
|
59
|
+
repeat_hires = ?,
|
|
60
|
+
feedback_count = ?,
|
|
61
|
+
feedback_sum = ?,
|
|
62
|
+
availability_checks = ?,
|
|
63
|
+
availability_hits = ?,
|
|
64
|
+
cycle_start = ?,
|
|
65
|
+
updated_at = ?
|
|
66
|
+
WHERE owner = ?`
|
|
67
|
+
).run(
|
|
68
|
+
Math.max(oldRow.current_streak, newRow.current_streak),
|
|
69
|
+
Math.max(oldRow.longest_streak, newRow.longest_streak),
|
|
70
|
+
oldRow.total_hires + newRow.total_hires,
|
|
71
|
+
oldRow.repeat_hires + newRow.repeat_hires,
|
|
72
|
+
oldRow.feedback_count + newRow.feedback_count,
|
|
73
|
+
oldRow.feedback_sum + newRow.feedback_sum,
|
|
74
|
+
oldRow.availability_checks + newRow.availability_checks,
|
|
75
|
+
oldRow.availability_hits + newRow.availability_hits,
|
|
76
|
+
mergedCycleStart,
|
|
77
|
+
now,
|
|
78
|
+
newOwner
|
|
79
|
+
);
|
|
80
|
+
db.prepare("DELETE FROM provider_reliability_metrics WHERE owner = ?").run(oldOwner);
|
|
81
|
+
}
|
|
82
|
+
function migrateCreditOwnerData(db, oldOwner, newOwner) {
|
|
83
|
+
if (!oldOwner || !newOwner || oldOwner === newOwner) return;
|
|
84
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
85
|
+
db.transaction(() => {
|
|
86
|
+
mergeBalanceRows(db, oldOwner, newOwner, now);
|
|
87
|
+
if (tableExists(db, "credit_transactions")) {
|
|
88
|
+
db.prepare("UPDATE credit_transactions SET owner = ? WHERE owner = ?").run(newOwner, oldOwner);
|
|
89
|
+
}
|
|
90
|
+
if (tableExists(db, "credit_escrow")) {
|
|
91
|
+
db.prepare("UPDATE credit_escrow SET owner = ? WHERE owner = ?").run(newOwner, oldOwner);
|
|
92
|
+
}
|
|
93
|
+
mergeProviderRegistryRows(db, oldOwner, newOwner);
|
|
94
|
+
if (tableExists(db, "demand_vouchers")) {
|
|
95
|
+
db.prepare("UPDATE demand_vouchers SET owner = ? WHERE owner = ?").run(newOwner, oldOwner);
|
|
96
|
+
}
|
|
97
|
+
mergeReliabilityRows(db, oldOwner, newOwner, now);
|
|
98
|
+
})();
|
|
99
|
+
}
|
|
100
|
+
function canonicalizeCreditOwner(db, owner) {
|
|
101
|
+
if (!owner || RESERVED_OWNERS.has(owner)) {
|
|
102
|
+
return owner;
|
|
103
|
+
}
|
|
104
|
+
ensureAgentsTable(db);
|
|
105
|
+
const resolved = resolveCanonicalIdentity(db, owner);
|
|
106
|
+
if (!resolved.resolved) {
|
|
107
|
+
return owner;
|
|
108
|
+
}
|
|
109
|
+
const aliases = /* @__PURE__ */ new Set();
|
|
110
|
+
if (owner !== resolved.agent_id) {
|
|
111
|
+
aliases.add(owner);
|
|
112
|
+
}
|
|
113
|
+
if (resolved.legacy_owner && resolved.legacy_owner !== resolved.agent_id) {
|
|
114
|
+
aliases.add(resolved.legacy_owner);
|
|
115
|
+
}
|
|
116
|
+
for (const alias of aliases) {
|
|
117
|
+
migrateCreditOwnerData(db, alias, resolved.agent_id);
|
|
118
|
+
}
|
|
119
|
+
return resolved.agent_id;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/credit/reliability-metrics.ts
|
|
123
|
+
var RELIABILITY_METRICS_SCHEMA = `
|
|
124
|
+
CREATE TABLE IF NOT EXISTS provider_reliability_metrics (
|
|
125
|
+
owner TEXT PRIMARY KEY,
|
|
126
|
+
current_streak INTEGER NOT NULL DEFAULT 0,
|
|
127
|
+
longest_streak INTEGER NOT NULL DEFAULT 0,
|
|
128
|
+
total_hires INTEGER NOT NULL DEFAULT 0,
|
|
129
|
+
repeat_hires INTEGER NOT NULL DEFAULT 0,
|
|
130
|
+
feedback_count INTEGER NOT NULL DEFAULT 0,
|
|
131
|
+
feedback_sum REAL NOT NULL DEFAULT 0,
|
|
132
|
+
availability_checks INTEGER NOT NULL DEFAULT 0,
|
|
133
|
+
availability_hits INTEGER NOT NULL DEFAULT 0,
|
|
134
|
+
cycle_start TEXT NOT NULL,
|
|
135
|
+
updated_at TEXT NOT NULL
|
|
136
|
+
);
|
|
137
|
+
`;
|
|
138
|
+
function ensureReliabilityTable(db) {
|
|
139
|
+
db.exec(RELIABILITY_METRICS_SCHEMA);
|
|
140
|
+
}
|
|
141
|
+
function ensureRow(db, owner) {
|
|
142
|
+
const canonicalOwner = canonicalizeCreditOwner(db, owner);
|
|
143
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
144
|
+
db.prepare(
|
|
145
|
+
`INSERT OR IGNORE INTO provider_reliability_metrics
|
|
146
|
+
(owner, current_streak, longest_streak, total_hires, repeat_hires,
|
|
147
|
+
feedback_count, feedback_sum, availability_checks, availability_hits,
|
|
148
|
+
cycle_start, updated_at)
|
|
149
|
+
VALUES (?, 0, 0, 0, 0, 0, 0, 0, 0, ?, ?)`
|
|
150
|
+
).run(canonicalOwner, now, now);
|
|
151
|
+
}
|
|
152
|
+
function recordSuccessfulHire(db, providerOwner, consumerOwner) {
|
|
153
|
+
const canonicalProviderOwner = canonicalizeCreditOwner(db, providerOwner);
|
|
154
|
+
const canonicalConsumerOwner = canonicalizeCreditOwner(db, consumerOwner);
|
|
155
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
156
|
+
ensureRow(db, canonicalProviderOwner);
|
|
157
|
+
const isRepeat = db.prepare(
|
|
158
|
+
`SELECT COUNT(*) as cnt FROM credit_transactions
|
|
159
|
+
WHERE owner = ? AND reason = 'settlement'
|
|
160
|
+
AND reference_id IN (
|
|
161
|
+
SELECT id FROM credit_escrow WHERE owner = ?
|
|
162
|
+
)`
|
|
163
|
+
).get(canonicalProviderOwner, canonicalConsumerOwner);
|
|
164
|
+
const repeatIncrement = (isRepeat?.cnt ?? 0) > 0 ? 1 : 0;
|
|
165
|
+
db.prepare(
|
|
166
|
+
`UPDATE provider_reliability_metrics
|
|
167
|
+
SET current_streak = current_streak + 1,
|
|
168
|
+
longest_streak = MAX(longest_streak, current_streak + 1),
|
|
169
|
+
total_hires = total_hires + 1,
|
|
170
|
+
repeat_hires = repeat_hires + ?,
|
|
171
|
+
updated_at = ?
|
|
172
|
+
WHERE owner = ?`
|
|
173
|
+
).run(repeatIncrement, now, canonicalProviderOwner);
|
|
174
|
+
}
|
|
175
|
+
function recordQualityFailure(db, providerOwner) {
|
|
176
|
+
const canonicalProviderOwner = canonicalizeCreditOwner(db, providerOwner);
|
|
177
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
178
|
+
ensureRow(db, canonicalProviderOwner);
|
|
179
|
+
db.prepare(
|
|
180
|
+
`UPDATE provider_reliability_metrics
|
|
181
|
+
SET current_streak = 0, updated_at = ?
|
|
182
|
+
WHERE owner = ?`
|
|
183
|
+
).run(now, canonicalProviderOwner);
|
|
184
|
+
}
|
|
185
|
+
function recordFeedback(db, providerOwner, score) {
|
|
186
|
+
const canonicalProviderOwner = canonicalizeCreditOwner(db, providerOwner);
|
|
187
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
188
|
+
ensureRow(db, canonicalProviderOwner);
|
|
189
|
+
db.prepare(
|
|
190
|
+
`UPDATE provider_reliability_metrics
|
|
191
|
+
SET feedback_count = feedback_count + 1,
|
|
192
|
+
feedback_sum = feedback_sum + ?,
|
|
193
|
+
updated_at = ?
|
|
194
|
+
WHERE owner = ?`
|
|
195
|
+
).run(score, now, canonicalProviderOwner);
|
|
196
|
+
}
|
|
197
|
+
function recordAvailabilityCheck(db, providerOwner, wasAvailable) {
|
|
198
|
+
const canonicalProviderOwner = canonicalizeCreditOwner(db, providerOwner);
|
|
199
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
200
|
+
ensureRow(db, canonicalProviderOwner);
|
|
201
|
+
db.prepare(
|
|
202
|
+
`UPDATE provider_reliability_metrics
|
|
203
|
+
SET availability_checks = availability_checks + 1,
|
|
204
|
+
availability_hits = availability_hits + ?,
|
|
205
|
+
updated_at = ?
|
|
206
|
+
WHERE owner = ?`
|
|
207
|
+
).run(wasAvailable ? 1 : 0, now, canonicalProviderOwner);
|
|
208
|
+
}
|
|
209
|
+
function getReliabilityMetrics(db, owner) {
|
|
210
|
+
const canonicalOwner = canonicalizeCreditOwner(db, owner);
|
|
211
|
+
const row = db.prepare(
|
|
212
|
+
`SELECT current_streak, longest_streak, total_hires, repeat_hires,
|
|
213
|
+
feedback_count, feedback_sum, availability_checks, availability_hits
|
|
214
|
+
FROM provider_reliability_metrics WHERE owner = ?`
|
|
215
|
+
).get(canonicalOwner);
|
|
216
|
+
if (!row) return null;
|
|
217
|
+
return {
|
|
218
|
+
current_streak: row.current_streak,
|
|
219
|
+
longest_streak: row.longest_streak,
|
|
220
|
+
total_hires: row.total_hires,
|
|
221
|
+
repeat_hires: row.repeat_hires,
|
|
222
|
+
repeat_hire_rate: row.total_hires > 0 ? row.repeat_hires / row.total_hires : 0,
|
|
223
|
+
avg_feedback_score: row.feedback_count > 0 ? row.feedback_sum / row.feedback_count : 0,
|
|
224
|
+
availability_rate: row.availability_checks > 0 ? row.availability_hits / row.availability_checks : 0
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export {
|
|
229
|
+
migrateCreditOwnerData,
|
|
230
|
+
canonicalizeCreditOwner,
|
|
231
|
+
RELIABILITY_METRICS_SCHEMA,
|
|
232
|
+
ensureReliabilityTable,
|
|
233
|
+
recordSuccessfulHire,
|
|
234
|
+
recordQualityFailure,
|
|
235
|
+
recordFeedback,
|
|
236
|
+
recordAvailabilityCheck,
|
|
237
|
+
getReliabilityMetrics
|
|
238
|
+
};
|
|
@@ -4,13 +4,16 @@ import {
|
|
|
4
4
|
decompose,
|
|
5
5
|
matchSubTasks,
|
|
6
6
|
orchestrate
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7IQE34QK.js";
|
|
8
8
|
import {
|
|
9
9
|
BudgetManager
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-D242QZCR.js";
|
|
11
11
|
import {
|
|
12
12
|
openCreditDb
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-F3KIEVJ2.js";
|
|
14
|
+
import {
|
|
15
|
+
RelayClient
|
|
16
|
+
} from "./chunk-NX27AFPA.js";
|
|
14
17
|
import {
|
|
15
18
|
loadPeers
|
|
16
19
|
} from "./chunk-5AH3CMOX.js";
|
|
@@ -18,11 +21,9 @@ import {
|
|
|
18
21
|
loadConfig
|
|
19
22
|
} from "./chunk-75OC6E4F.js";
|
|
20
23
|
import {
|
|
21
|
-
|
|
22
|
-
} from "./chunk-Z4MCGKTL.js";
|
|
23
|
-
import {
|
|
24
|
+
listCards,
|
|
24
25
|
openDatabase
|
|
25
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-5AIYALBX.js";
|
|
26
27
|
|
|
27
28
|
// src/cli/conduct.ts
|
|
28
29
|
async function conductAction(task, opts) {
|
|
@@ -81,17 +82,24 @@ async function conductAction(task, opts) {
|
|
|
81
82
|
matchResults.map((m) => [m.subtask_id, m])
|
|
82
83
|
);
|
|
83
84
|
const resolveAgentUrl = (owner) => {
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
const execDb = openDatabase(config.db_path);
|
|
86
|
+
let matchingCards;
|
|
87
|
+
try {
|
|
88
|
+
matchingCards = listCards(execDb, owner);
|
|
89
|
+
} finally {
|
|
90
|
+
execDb.close();
|
|
91
|
+
}
|
|
92
|
+
const candidateNames = /* @__PURE__ */ new Set([owner.toLowerCase()]);
|
|
93
|
+
for (const card of matchingCards) {
|
|
94
|
+
candidateNames.add(card.owner.toLowerCase());
|
|
95
|
+
if (typeof card.agent_id === "string" && card.agent_id.length > 0) {
|
|
96
|
+
candidateNames.add(card.agent_id.toLowerCase());
|
|
93
97
|
}
|
|
94
98
|
}
|
|
99
|
+
const peer = peers.find((p) => candidateNames.has(p.name.toLowerCase()));
|
|
100
|
+
if (peer) {
|
|
101
|
+
return { url: peer.url, cardId: matchingCards[0]?.id ?? owner };
|
|
102
|
+
}
|
|
95
103
|
if (config.registry) {
|
|
96
104
|
let cardId = owner;
|
|
97
105
|
for (const m of matchMap.values()) {
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AgentBnBError
|
|
3
|
+
} from "./chunk-I7KWA7OB.js";
|
|
4
|
+
|
|
5
|
+
// src/identity/agent-identity.ts
|
|
6
|
+
var AGENTS_SCHEMA = `
|
|
7
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
8
|
+
agent_id TEXT PRIMARY KEY,
|
|
9
|
+
display_name TEXT NOT NULL,
|
|
10
|
+
public_key TEXT NOT NULL,
|
|
11
|
+
operator_id TEXT,
|
|
12
|
+
server_id TEXT,
|
|
13
|
+
legacy_owner TEXT,
|
|
14
|
+
created_at TEXT NOT NULL,
|
|
15
|
+
updated_at TEXT NOT NULL
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_agents_operator ON agents(operator_id);
|
|
19
|
+
CREATE INDEX IF NOT EXISTS idx_agents_legacy_owner ON agents(legacy_owner);
|
|
20
|
+
`;
|
|
21
|
+
function ensureAgentsTable(db) {
|
|
22
|
+
db.exec(AGENTS_SCHEMA);
|
|
23
|
+
}
|
|
24
|
+
function createAgentRecord(db, agent) {
|
|
25
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
26
|
+
const record = {
|
|
27
|
+
agent_id: agent.agent_id,
|
|
28
|
+
display_name: agent.display_name,
|
|
29
|
+
public_key: agent.public_key,
|
|
30
|
+
operator_id: agent.operator_id ?? null,
|
|
31
|
+
server_id: agent.server_id ?? null,
|
|
32
|
+
legacy_owner: agent.legacy_owner ?? null,
|
|
33
|
+
created_at: now,
|
|
34
|
+
updated_at: now
|
|
35
|
+
};
|
|
36
|
+
const result = db.prepare(
|
|
37
|
+
`INSERT OR IGNORE INTO agents
|
|
38
|
+
(agent_id, display_name, public_key, operator_id, server_id, legacy_owner, created_at, updated_at)
|
|
39
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
|
|
40
|
+
).run(
|
|
41
|
+
record.agent_id,
|
|
42
|
+
record.display_name,
|
|
43
|
+
record.public_key,
|
|
44
|
+
record.operator_id,
|
|
45
|
+
record.server_id,
|
|
46
|
+
record.legacy_owner,
|
|
47
|
+
record.created_at,
|
|
48
|
+
record.updated_at
|
|
49
|
+
);
|
|
50
|
+
if (result.changes === 0) {
|
|
51
|
+
throw new AgentBnBError(
|
|
52
|
+
"AGENT_EXISTS",
|
|
53
|
+
`Agent ${agent.agent_id} already exists`
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return record;
|
|
57
|
+
}
|
|
58
|
+
function lookupAgent(db, agentId) {
|
|
59
|
+
return db.prepare("SELECT * FROM agents WHERE agent_id = ?").get(agentId) ?? null;
|
|
60
|
+
}
|
|
61
|
+
function lookupAgentByOwner(db, owner) {
|
|
62
|
+
return db.prepare("SELECT * FROM agents WHERE legacy_owner = ?").get(owner) ?? null;
|
|
63
|
+
}
|
|
64
|
+
function updateAgentRecord(db, agentId, updates) {
|
|
65
|
+
const fields = [];
|
|
66
|
+
const values = [];
|
|
67
|
+
if (updates.display_name !== void 0) {
|
|
68
|
+
fields.push("display_name = ?");
|
|
69
|
+
values.push(updates.display_name);
|
|
70
|
+
}
|
|
71
|
+
if (updates.operator_id !== void 0) {
|
|
72
|
+
fields.push("operator_id = ?");
|
|
73
|
+
values.push(updates.operator_id);
|
|
74
|
+
}
|
|
75
|
+
if (updates.server_id !== void 0) {
|
|
76
|
+
fields.push("server_id = ?");
|
|
77
|
+
values.push(updates.server_id);
|
|
78
|
+
}
|
|
79
|
+
if (updates.legacy_owner !== void 0) {
|
|
80
|
+
fields.push("legacy_owner = ?");
|
|
81
|
+
values.push(updates.legacy_owner);
|
|
82
|
+
}
|
|
83
|
+
if (fields.length === 0) return;
|
|
84
|
+
fields.push("updated_at = ?");
|
|
85
|
+
values.push((/* @__PURE__ */ new Date()).toISOString());
|
|
86
|
+
values.push(agentId);
|
|
87
|
+
const result = db.prepare(`UPDATE agents SET ${fields.join(", ")} WHERE agent_id = ?`).run(...values);
|
|
88
|
+
if (result.changes === 0) {
|
|
89
|
+
throw new AgentBnBError("AGENT_NOT_FOUND", `Agent ${agentId} not found`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function resolveCanonicalIdentity(db, identifier) {
|
|
93
|
+
ensureAgentsTable(db);
|
|
94
|
+
if (/^[a-f0-9]{16}$/.test(identifier)) {
|
|
95
|
+
const byAgentId = lookupAgent(db, identifier);
|
|
96
|
+
if (byAgentId) {
|
|
97
|
+
return {
|
|
98
|
+
agent_id: byAgentId.agent_id,
|
|
99
|
+
legacy_owner: byAgentId.legacy_owner,
|
|
100
|
+
resolved: true,
|
|
101
|
+
source: "agent_id"
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const byOwner = lookupAgentByOwner(db, identifier);
|
|
106
|
+
if (byOwner) {
|
|
107
|
+
return {
|
|
108
|
+
agent_id: byOwner.agent_id,
|
|
109
|
+
legacy_owner: byOwner.legacy_owner,
|
|
110
|
+
resolved: true,
|
|
111
|
+
source: "legacy_owner"
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
agent_id: identifier,
|
|
116
|
+
legacy_owner: null,
|
|
117
|
+
resolved: false,
|
|
118
|
+
source: "unresolved"
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export {
|
|
123
|
+
ensureAgentsTable,
|
|
124
|
+
createAgentRecord,
|
|
125
|
+
lookupAgent,
|
|
126
|
+
lookupAgentByOwner,
|
|
127
|
+
updateAgentRecord,
|
|
128
|
+
resolveCanonicalIdentity
|
|
129
|
+
};
|
|
@@ -29,7 +29,8 @@ var CapabilityDeclarationSchema = {
|
|
|
29
29
|
description: z.string().optional(),
|
|
30
30
|
capability_types: z.array(z.string()).optional(),
|
|
31
31
|
requires_capabilities: z.array(z.string()).optional(),
|
|
32
|
-
visibility: z.enum(["public", "private"]).optional()
|
|
32
|
+
visibility: z.enum(["public", "private"]).optional(),
|
|
33
|
+
expected_duration_ms: z.number().positive().optional()
|
|
33
34
|
};
|
|
34
35
|
var ApiSkillConfigSchema = z.object({
|
|
35
36
|
id: z.string().min(1),
|
|
@@ -1,19 +1,33 @@
|
|
|
1
1
|
import {
|
|
2
2
|
signEscrowReceipt
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GIEJVKZZ.js";
|
|
4
4
|
import {
|
|
5
5
|
AgentBnBError
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-I7KWA7OB.js";
|
|
7
7
|
|
|
8
8
|
// src/gateway/client.ts
|
|
9
9
|
import { randomUUID } from "crypto";
|
|
10
10
|
import { Agent } from "undici";
|
|
11
|
+
var REQUEST_TIMEOUT_FALLBACK_MS = 3e5;
|
|
12
|
+
var REQUEST_TIMEOUT_GRACE_MS = 3e4;
|
|
13
|
+
var REQUEST_TIMEOUT_EXPECTED_MULTIPLIER = 1.5;
|
|
11
14
|
var gatewayAgent = new Agent({
|
|
12
15
|
keepAliveTimeout: 3e4,
|
|
13
16
|
keepAliveMaxTimeout: 6e4,
|
|
14
17
|
connections: 10,
|
|
15
18
|
pipelining: 1
|
|
16
19
|
});
|
|
20
|
+
function deriveRequestTimeoutMs(hint) {
|
|
21
|
+
const expectedDurationMs = hint?.expected_duration_ms;
|
|
22
|
+
if (typeof expectedDurationMs === "number" && expectedDurationMs > 0) {
|
|
23
|
+
return Math.ceil(expectedDurationMs * REQUEST_TIMEOUT_EXPECTED_MULTIPLIER) + REQUEST_TIMEOUT_GRACE_MS;
|
|
24
|
+
}
|
|
25
|
+
const hardTimeoutMs = hint?.hard_timeout_ms;
|
|
26
|
+
if (typeof hardTimeoutMs === "number" && hardTimeoutMs > 0) {
|
|
27
|
+
return Math.ceil(hardTimeoutMs) + REQUEST_TIMEOUT_GRACE_MS;
|
|
28
|
+
}
|
|
29
|
+
return REQUEST_TIMEOUT_FALLBACK_MS;
|
|
30
|
+
}
|
|
17
31
|
function buildGatewayAuthHeaders(payload, token, identity) {
|
|
18
32
|
const headers = { "Content-Type": "application/json" };
|
|
19
33
|
if (identity) {
|
|
@@ -28,7 +42,17 @@ function buildGatewayAuthHeaders(payload, token, identity) {
|
|
|
28
42
|
return headers;
|
|
29
43
|
}
|
|
30
44
|
async function requestCapability(opts) {
|
|
31
|
-
const {
|
|
45
|
+
const {
|
|
46
|
+
gatewayUrl,
|
|
47
|
+
token,
|
|
48
|
+
cardId,
|
|
49
|
+
params = {},
|
|
50
|
+
timeoutMs: timeoutOverrideMs,
|
|
51
|
+
timeoutHint,
|
|
52
|
+
escrowReceipt,
|
|
53
|
+
identity
|
|
54
|
+
} = opts;
|
|
55
|
+
const timeoutMs = timeoutOverrideMs ?? deriveRequestTimeoutMs(timeoutHint);
|
|
32
56
|
const id = randomUUID();
|
|
33
57
|
const payload = {
|
|
34
58
|
jsonrpc: "2.0",
|
|
@@ -80,11 +104,13 @@ async function requestCapabilityBatch(gatewayUrl, token, items, opts = {}) {
|
|
|
80
104
|
params: item.params,
|
|
81
105
|
escrowReceipt: item.escrowReceipt,
|
|
82
106
|
timeoutMs: opts.timeoutMs,
|
|
107
|
+
timeoutHint: opts.timeoutHint,
|
|
83
108
|
identity: opts.identity
|
|
84
109
|
});
|
|
85
110
|
return /* @__PURE__ */ new Map([[item.id, result]]);
|
|
86
111
|
}
|
|
87
|
-
const { timeoutMs
|
|
112
|
+
const { timeoutMs: timeoutOverrideMs, timeoutHint, identity } = opts;
|
|
113
|
+
const timeoutMs = timeoutOverrideMs ?? deriveRequestTimeoutMs(timeoutHint);
|
|
88
114
|
const batchPayload = items.map((item) => ({
|
|
89
115
|
jsonrpc: "2.0",
|
|
90
116
|
id: item.id,
|
|
@@ -129,15 +155,17 @@ async function requestCapabilityBatch(gatewayUrl, token, items, opts = {}) {
|
|
|
129
155
|
return results;
|
|
130
156
|
}
|
|
131
157
|
async function requestViaRelay(relay, opts) {
|
|
158
|
+
const timeoutMs = opts.timeoutMs ?? deriveRequestTimeoutMs(opts.timeoutHint);
|
|
132
159
|
try {
|
|
133
160
|
return await relay.request({
|
|
134
161
|
targetOwner: opts.targetOwner,
|
|
162
|
+
targetAgentId: opts.targetAgentId,
|
|
135
163
|
cardId: opts.cardId,
|
|
136
164
|
skillId: opts.skillId,
|
|
137
165
|
params: opts.params ?? {},
|
|
138
166
|
requester: opts.requester,
|
|
139
167
|
escrowReceipt: opts.escrowReceipt,
|
|
140
|
-
timeoutMs
|
|
168
|
+
timeoutMs
|
|
141
169
|
});
|
|
142
170
|
} catch (err) {
|
|
143
171
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -152,6 +180,10 @@ async function requestViaRelay(relay, opts) {
|
|
|
152
180
|
}
|
|
153
181
|
|
|
154
182
|
export {
|
|
183
|
+
REQUEST_TIMEOUT_FALLBACK_MS,
|
|
184
|
+
REQUEST_TIMEOUT_GRACE_MS,
|
|
185
|
+
REQUEST_TIMEOUT_EXPECTED_MULTIPLIER,
|
|
186
|
+
deriveRequestTimeoutMs,
|
|
155
187
|
requestCapability,
|
|
156
188
|
requestCapabilityBatch,
|
|
157
189
|
requestViaRelay
|