@absol-labs/agent 0.8.0 → 0.9.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/discovery/registry.d.ts +110 -305
  2. package/dist/discovery/registry.d.ts.map +1 -1
  3. package/dist/discovery/registry.js +141 -318
  4. package/dist/discovery/registry.js.map +1 -1
  5. package/dist/frameworks/agentkit.d.ts.map +1 -1
  6. package/dist/frameworks/agentkit.js +23 -6
  7. package/dist/frameworks/agentkit.js.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/wallet/cdp-sdk.d.ts +23 -0
  13. package/dist/wallet/cdp-sdk.d.ts.map +1 -0
  14. package/dist/wallet/cdp-sdk.js +27 -0
  15. package/dist/wallet/cdp-sdk.js.map +1 -0
  16. package/dist/wallet/provider.d.ts +1 -1
  17. package/dist/wallet/provider.d.ts.map +1 -1
  18. package/dist/wallet/provider.js +8 -3
  19. package/dist/wallet/provider.js.map +1 -1
  20. package/dist/zktls/reclaim-js-sdk.d.ts +24 -0
  21. package/dist/zktls/reclaim-js-sdk.d.ts.map +1 -0
  22. package/dist/zktls/reclaim-js-sdk.js +29 -0
  23. package/dist/zktls/reclaim-js-sdk.js.map +1 -0
  24. package/dist/zktls/reclaim.d.ts +14 -2
  25. package/dist/zktls/reclaim.d.ts.map +1 -1
  26. package/dist/zktls/reclaim.js +29 -6
  27. package/dist/zktls/reclaim.js.map +1 -1
  28. package/dist/zktls/t2-delivery-proof.d.ts +8 -1
  29. package/dist/zktls/t2-delivery-proof.d.ts.map +1 -1
  30. package/dist/zktls/t2-delivery-proof.js +22 -6
  31. package/dist/zktls/t2-delivery-proof.js.map +1 -1
  32. package/docs/agent-layer.md +150 -0
  33. package/docs/autonomous-privy-wallet.md +133 -0
  34. package/docs/crewai.md +70 -0
  35. package/docs/eliza.md +109 -0
  36. package/docs/langchain.md +63 -0
  37. package/docs/mcp-hosted.md +137 -0
  38. package/docs/privy-embedded-wallet.md +102 -0
  39. package/docs/quickstart.md +370 -0
  40. package/docs/threat-model.md +160 -0
  41. package/package.json +19 -6
  42. package/src/discovery/registry.ts +242 -414
  43. package/src/frameworks/agentkit.ts +24 -5
  44. package/src/index.ts +5 -0
  45. package/src/wallet/cdp-sdk.ts +33 -0
  46. package/src/wallet/provider.ts +16 -9
  47. package/src/zktls/reclaim-js-sdk.ts +50 -0
  48. package/src/zktls/reclaim.ts +57 -23
  49. package/src/zktls/t2-delivery-proof.ts +28 -10
@@ -1,354 +1,177 @@
1
- import { deriveServiceRef, recoverServiceBindingSigner, recoverServiceDescriptorSigner, serviceBindingSchema, serviceDescriptorSchema, } from "@absol-labs/shared";
2
- import { isHex } from "viem";
3
- import { z } from "zod";
1
+ import { RegistryUnavailableError, discoverServices as sdkDiscoverServices, } from "@absol-labs/sdk";
4
2
  /**
5
- * Default Metrik listings registry (Supabase PostgREST). Selects the columns the
6
- * oracle and the agent both need and orders newest-first.
3
+ * The oracle's public, credential-free, CORS-enabled discovery endpoint. Serves
4
+ * operator-signed envelopes verbatim so they can be verified client-side, and
5
+ * answers an unreachable upstream with `503` and NO `listings` key — precisely so
6
+ * it cannot be misread as "zero services".
7
7
  */
8
- export const DEFAULT_METRIK_REGISTRY_URL = "https://pzvnacjolaipeobmptsb.supabase.co/rest/v1/listings?select=service_ref,operator,public_url,category,signed_binding&order=created_at.desc";
9
- const DEFAULT_TIMEOUT_MS = 5_000;
8
+ export const DEFAULT_METRIK_PUBLIC_REGISTRY_URL = "https://oracle.metrik.live/listings";
10
9
  /**
11
- * `serviceRef` of the built-in verified live-data listing. Kept as a named constant so
12
- * callers can recognise (and dedupe against) the seeded row.
10
+ * @deprecated Renamed to {@link DEFAULT_METRIK_PUBLIC_REGISTRY_URL}. The value
11
+ * changed in 0.9.0: it used to be a raw Supabase PostgREST URL that `401`s
12
+ * without Metrik's anon key.
13
13
  */
14
- export const LIVE_DATA_SEED_SERVICE_REF = "0x79e57358e98a35273c1cd9d5f1bf9ae1e0af8705db432eb706459dc4f88b6fe0";
15
- /** @deprecated Use {@link LIVE_DATA_SEED_SERVICE_REF}. */
16
- export const DEMO_SEED_SERVICE_REF = LIVE_DATA_SEED_SERVICE_REF;
14
+ export const DEFAULT_METRIK_REGISTRY_URL = DEFAULT_METRIK_PUBLIC_REGISTRY_URL;
17
15
  /**
18
- * A real, operator-signed live-data listing row embedded so `discoverServices()` returns
19
- * something hireable with ZERO configuration (no Supabase anon key, no registry URL).
20
- *
21
- * This is PUBLIC data a signed {@link https://github.com/Absol-Labs | Metrik}
22
- * ServiceBinding — safe to ship in source. It is **NOT** a trust bypass: when seeded
23
- * it is fed through the exact same fail-closed {@link verifyRow} path as any registry
24
- * row, so it only ever surfaces if BOTH its EIP-712 signature recovers to
25
- * `binding.operator` AND `deriveServiceRef(binding)` equals its `serviceRef`. Tamper
26
- * with any field here and the seed silently drops itself, identically to a bad
27
- * registry row. The `category` column is unsigned informational metadata only.
16
+ * @deprecated Removed in 0.9.0. The embedded seed listing is gone: it was
17
+ * unrevocable without a release, and masking an unreachable registry with stale
18
+ * local data is exactly the bug this package now refuses to ship. Kept as an
19
+ * empty object so existing imports still compile.
28
20
  */
29
- export const LIVE_DATA_SEED_LISTING = {
30
- service_ref: LIVE_DATA_SEED_SERVICE_REF,
31
- operator: "0xB3e162711920dFD8933609019Dc35C73cC1a09F0",
32
- public_url: "https://livedata.137.23.50.249.sslip.io",
33
- category: "live-data",
34
- signed_binding: {
35
- serviceRef: LIVE_DATA_SEED_SERVICE_REF,
36
- descriptor: {
37
- version: 3,
38
- operator: "0xB3e162711920dFD8933609019Dc35C73cC1a09F0",
39
- publicUrl: "https://livedata.137.23.50.249.sslip.io",
40
- issuedAt: 1_787_772_057,
41
- interface: {
42
- baseUrl: "https://livedata.137.23.50.249.sslip.io",
43
- healthPath: "/health",
44
- endpoints: [
45
- {
46
- name: "health",
47
- path: "/health",
48
- method: "GET",
49
- description: "Liveness probe.",
50
- },
51
- {
52
- name: "readiness",
53
- path: "/readiness",
54
- method: "GET",
55
- description: "Non-value dependency readiness backed by the same real BTC cache policy.",
56
- },
57
- {
58
- name: "price",
59
- path: "/price",
60
- method: "GET",
61
- description: "Real live crypto spot price (?symbol=BTC|ETH|SOL) from CoinGecko's public API.",
62
- },
63
- ],
64
- authModel: "caller-auth",
65
- example: {
66
- endpoint: "price",
67
- request: { symbol: "BTC" },
68
- response: { symbol: "BTC", source: "coingecko-public-api" },
69
- description: "Real, nondeterministic live price — no re-execution guarantee.",
70
- },
71
- expectedStatuses: [200],
72
- },
73
- verification: {
74
- canaries: [
75
- {
76
- path: "/readiness",
77
- method: "GET",
78
- matcher: {
79
- type: "json-field-equals",
80
- field: "source",
81
- expected: "coingecko-public-api",
82
- },
83
- nonce: {
84
- inject: { in: "query", name: "nonce" },
85
- echo: { from: "json-path", path: "nonce" },
86
- },
87
- },
88
- {
89
- path: "/canary",
90
- method: "GET",
91
- matcher: {
92
- type: "includes",
93
- expected: "metrik-canary:live-data:",
94
- },
95
- nonce: {
96
- inject: { in: "query", name: "nonce" },
97
- echo: { from: "json-path", path: "nonce" },
98
- },
99
- },
100
- ],
101
- schema: {
102
- path: "/readiness?nonce=metrik-schema",
103
- required: [
104
- { pointer: "ready", type: "boolean" },
105
- { pointer: "source", type: "string", nonEmpty: true },
106
- { pointer: "fetchedAt", type: "string", nonEmpty: true },
107
- { pointer: "priceAgeMs", type: "number" },
108
- { pointer: "freshness", type: "string", nonEmpty: true },
109
- ],
110
- },
111
- sla: { maxLatencyMs: 5000, freshnessSeconds: 60 },
112
- },
113
- commercial: {
114
- minRatePerSecond: "100",
115
- maxRatePerSecond: "10000",
116
- currency: "USDC",
117
- slaDescription: "Failed or unproven intervals do not advance verified cumulative entitlement; the stream remains active until buyer close or expiry.",
118
- refundPolicy: "The buyer reclaims unspent escrow using the latest checkpoint after close/expiry, or the unverified escape path after its grace window.",
119
- },
120
- access: "gated",
121
- callerAuth: {
122
- mechanism: "on-chain",
123
- role: "buyer",
124
- accessUrl: "https://gateway.137.23.50.249.sslip.io",
125
- },
126
- },
127
- signature: "0x2f4d2784eb40b1542517bc19f12534fb2e97da4ade5a3ff56193fcfb97fbef921309f77af3445e336cb07a4379011b080bba700033a098f672b0b2f096197f161b",
128
- },
129
- };
130
- /** @deprecated Use {@link LIVE_DATA_SEED_LISTING}. */
21
+ export const LIVE_DATA_SEED_LISTING = Object.freeze({});
22
+ /** @deprecated Removed in 0.9.0. See {@link LIVE_DATA_SEED_LISTING}. */
131
23
  export const DEMO_SEED_LISTING = LIVE_DATA_SEED_LISTING;
132
- const signature65HexSchema = z
133
- .string()
134
- .refine((value) => isHex(value, { strict: true }) && value.length === 132, "must be a 65-byte hex signature");
135
- const bytes32HexSchema = z
136
- .string()
137
- .refine((value) => isHex(value, { strict: true }) && value.length === 66, "must be bytes32 hex");
138
- /** The signed envelope inside a listings row. Mirrors the oracle's ingest schema
139
- * (includes the optional operator-supplied `targetMetadata`). */
140
- const signedBindingRecordSchema = z.object({
141
- serviceRef: bytes32HexSchema,
142
- binding: serviceBindingSchema,
143
- signature: signature65HexSchema,
144
- targetMetadata: z.record(z.string()).optional(),
145
- });
146
- const signedDescriptorRecordSchema = z.object({
147
- serviceRef: bytes32HexSchema,
148
- descriptor: serviceDescriptorSchema,
149
- signature: signature65HexSchema,
150
- targetMetadata: z.record(z.string()).optional(),
151
- });
152
- /** A Supabase `listings` row. Only `signed_binding` is trusted; `category` is
153
- * carried through as unsigned informational metadata. Unknown columns are ignored. */
154
- const listingRowSchema = z
155
- .object({
156
- service_ref: bytes32HexSchema.optional(),
157
- operator: z.string().optional(),
158
- public_url: z.string().optional(),
159
- category: z.string().nullish(),
160
- signed_binding: z.union([
161
- signedBindingRecordSchema,
162
- signedDescriptorRecordSchema,
163
- ]),
164
- })
165
- .passthrough();
24
+ /** @deprecated Removed in 0.9.0. There is no seeded listing to identify. */
25
+ export const LIVE_DATA_SEED_SERVICE_REF = null;
26
+ /** @deprecated Removed in 0.9.0. See {@link LIVE_DATA_SEED_SERVICE_REF}. */
27
+ export const DEMO_SEED_SERVICE_REF = null;
28
+ const DEFAULT_TIMEOUT_MS = 5_000;
29
+ export { RegistryUnavailableError };
30
+ /**
31
+ * Discover verified services and return the SDK's full {@link DiscoverResult}
32
+ * (typed listings plus `registryAvailable`, `source`, `matched`, `filteredOut`
33
+ * and an explanatory `note` when a non-empty source was filtered to nothing).
34
+ *
35
+ * Throws {@link RegistryUnavailableError} when the configured read source cannot
36
+ * be read at all.
37
+ */
38
+ export async function discoverServicesDetailed(opts = {}) {
39
+ const logger = opts.logger ?? console;
40
+ const { config, rowCounter } = buildRegistryConfig(opts, logger);
41
+ const result = await sdkDiscoverServices(config, {
42
+ ...(opts.category === undefined ? {} : { category: opts.category }),
43
+ });
44
+ // The SDK drops any row that fails schema / serviceRef / signature
45
+ // verification. Surface that as a warning: a silently shrinking result set is
46
+ // how a tampering registry stays invisible.
47
+ const dropped = rowCounter.rows - result.services.length - result.filteredOut;
48
+ if (dropped > 0) {
49
+ logger.warn(`metrik discovery: ${dropped} of ${rowCounter.rows} registry row(s) dropped by fail-closed verification (bad schema, serviceRef mismatch, or signature that does not recover to the operator)`);
50
+ }
51
+ if (result.note !== undefined) {
52
+ logger.warn(`metrik discovery: ${result.note}`);
53
+ }
54
+ return result;
55
+ }
166
56
  /**
167
57
  * Discover verified services from the Metrik listings registry.
168
58
  *
169
- * Fail-closed: any row whose signed binding is malformed, whose signature does not
170
- * recover to its operator, or whose `serviceRef` does not match `deriveServiceRef`
171
- * is dropped and logged. Degrades gracefully: any network/registry failure returns
172
- * `[]` (with a logged warning) rather than throwing to the caller.
59
+ * Zero configuration: reads {@link DEFAULT_METRIK_PUBLIC_REGISTRY_URL}, the
60
+ * oracle's credential-free public endpoint.
61
+ *
62
+ * Fail-closed: every row is schema-validated, its `serviceRef` re-derived and
63
+ * its operator signature recovered; anything that fails is dropped and logged,
64
+ * so an unverifiable listing is never returned.
65
+ *
66
+ * LOUD, not silent: an unreachable / erroring / non-200 registry throws
67
+ * {@link RegistryUnavailableError} rather than returning `[]` or embedded seed
68
+ * data. Catch it if your caller can genuinely handle "the marketplace was never
69
+ * reached" — but do not confuse it with an empty marketplace.
173
70
  */
174
71
  export async function discoverServices(opts = {}) {
175
72
  const logger = opts.logger ?? console;
176
- const registryUrl = opts.registryUrl ??
177
- process.env.METRIK_AGENT_REGISTRY_URL ??
178
- DEFAULT_METRIK_REGISTRY_URL;
179
- const apiKey = opts.apiKey ?? process.env.METRIK_AGENT_REGISTRY_APIKEY;
180
- const fetchImpl = opts.fetch ?? globalThis.fetch;
181
- const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
182
- const includeDemoSeed = opts.includeDemoSeed ?? true;
183
- // `registryUnavailable` = the registry could not be queried at all (no fetch /
184
- // network error / non-200). It never throws into the hire flow; instead it
185
- // degrades to the built-in verified live-data seed (when enabled) so a cold user
186
- // still discovers a hireable service.
187
- let rows = [];
188
- let registryUnavailable = false;
189
- if (typeof fetchImpl !== "function") {
190
- logger.warn("metrik discovery: no fetch implementation available; falling back to live-data seed only");
191
- registryUnavailable = true;
192
- }
193
- else {
194
- try {
195
- rows = await fetchListingRows(fetchImpl, registryUrl, apiKey, timeoutMs);
196
- }
197
- catch (error) {
198
- // Fail-safe / buyer-favouring: a down, unreachable, or 401 registry (the
199
- // Supabase default rejects credential-free reads) must never throw into the
200
- // agent's hire flow — it degrades to the live-data seed.
201
- logger.warn(`metrik discovery: listings registry unavailable (${errorMessage(error)}); falling back to live-data seed only`);
202
- registryUnavailable = true;
203
- }
73
+ if (opts.includeDemoSeed !== undefined) {
74
+ logger.warn("metrik discovery: `includeDemoSeed` is a deprecated no-op — the embedded seed listing was removed in 0.9.0; an unreachable registry now throws RegistryUnavailableError");
204
75
  }
76
+ const result = await discoverServicesDetailed(opts);
205
77
  const listings = [];
206
- let seedAlreadyPresent = false;
207
- for (const [index, row] of rows.entries()) {
208
- const listing = await verifyRow(row, index, logger);
78
+ for (const service of result.services) {
79
+ const listing = toServiceListing(service, logger);
209
80
  if (listing === null) {
210
81
  continue;
211
82
  }
212
- if (eqHex(listing.serviceRef, DEMO_SEED_SERVICE_REF)) {
213
- seedAlreadyPresent = true;
214
- }
215
- if (opts.category !== undefined && listing.category !== opts.category) {
216
- continue;
217
- }
218
83
  listings.push(listing);
219
84
  if (opts.limit !== undefined && listings.length >= opts.limit) {
220
- // Limit satisfied by the registry alone — no need to seed.
221
- return listings;
222
- }
223
- }
224
- // Append the built-in verified live-data listing when the registry did not already
225
- // surface it. Runs through the SAME fail-closed verifyRow path, so it is
226
- // verified exactly like a registry row and can never be a trust bypass.
227
- if (includeDemoSeed && !seedAlreadyPresent) {
228
- const seed = await verifyRow(DEMO_SEED_LISTING, "live-data-seed", logger);
229
- if (seed === null) {
230
- // Defensive: only reachable if the embedded constant were corrupted.
231
- logger.warn("metrik discovery: built-in live-data seed failed fail-closed verification; not seeding");
232
- }
233
- else if (opts.category === undefined || seed.category === opts.category) {
234
- logger.warn(registryUnavailable
235
- ? "metrik discovery: registry unavailable — serving the built-in verified live-data listing"
236
- : "metrik discovery: registry did not include live data — appending the built-in verified listing");
237
- listings.push(seed);
85
+ break;
238
86
  }
239
87
  }
240
88
  return listings;
241
89
  }
242
- async function fetchListingRows(fetchImpl, url, apiKey, timeoutMs) {
243
- const controller = new AbortController();
244
- const timeout = setTimeout(() => controller.abort(), timeoutMs);
245
- try {
246
- const headers = {};
247
- if (apiKey !== undefined && apiKey.length > 0) {
248
- headers.apikey = apiKey;
249
- headers.Authorization = `Bearer ${apiKey}`;
250
- }
251
- const response = await fetchImpl(url, {
252
- signal: controller.signal,
253
- ...(Object.keys(headers).length === 0 ? {} : { headers }),
254
- });
255
- if (!response.ok) {
256
- throw new Error(`listings registry responded with status ${response.status}`);
257
- }
258
- const body = await response.json();
259
- if (!Array.isArray(body)) {
260
- throw new Error("listings registry response was not a JSON array");
261
- }
262
- return body;
263
- }
264
- finally {
265
- clearTimeout(timeout);
266
- }
267
- }
268
90
  /**
269
- * Verify one raw registry row into a {@link ServiceListing}, or `null` if it fails
270
- * the fail-closed checks. Never throws.
91
+ * Project one verified {@link DiscoveredService} onto a {@link ServiceListing},
92
+ * or `null` when it carries no signed invocation origin (a legacy record that a
93
+ * caller could otherwise invoke against an unsigned URL).
271
94
  */
272
- async function verifyRow(row, index, logger) {
273
- const parsed = listingRowSchema.safeParse(row);
274
- if (!parsed.success) {
275
- logger.warn(`metrik discovery: row ${index} dropped — invalid listing envelope (${parsed.error.issues[0]?.message ?? "schema error"})`);
276
- return null;
277
- }
278
- const { signed_binding: record, category } = parsed.data;
279
- const signedIdentity = "descriptor" in record
280
- ? {
281
- operator: record.descriptor.operator,
282
- publicUrl: record.descriptor.publicUrl,
283
- }
284
- : {
285
- operator: record.binding.operator,
286
- publicUrl: record.binding.publicUrl,
287
- };
288
- if ((parsed.data.service_ref !== undefined &&
289
- !eqHex(parsed.data.service_ref, record.serviceRef)) ||
290
- (parsed.data.operator !== undefined &&
291
- !eqHex(parsed.data.operator, signedIdentity.operator)) ||
292
- (parsed.data.public_url !== undefined &&
293
- parsed.data.public_url !== signedIdentity.publicUrl)) {
294
- logger.warn(`metrik discovery: row ${index} dropped — flat identity columns disagree with signed record`);
295
- return null;
296
- }
297
- let signer;
298
- try {
299
- signer = ("descriptor" in record
300
- ? await recoverServiceDescriptorSigner(record.descriptor, record.signature)
301
- : await recoverServiceBindingSigner(record.binding, record.signature));
302
- }
303
- catch (error) {
304
- logger.warn(`metrik discovery: row ${index} dropped — signature recovery threw (${errorMessage(error)})`);
305
- return null;
306
- }
307
- if (signer === null || !eqHex(signer, signedIdentity.operator)) {
308
- logger.warn(`metrik discovery: row ${index} dropped — signature does not recover to operator (recovered ${signer ?? "null"})`);
309
- return null;
310
- }
311
- const derivedRef = deriveServiceRef("descriptor" in record ? record.descriptor : record.binding);
312
- if (!eqHex(derivedRef, record.serviceRef)) {
313
- logger.warn(`metrik discovery: row ${index} dropped — serviceRef ${record.serviceRef} does not match derived ${derivedRef}`);
314
- return null;
315
- }
316
- const access = "descriptor" in record ? (record.descriptor.access ?? "public") : "public";
317
- const accessUrl = "descriptor" in record
318
- ? access === "gated"
319
- ? record.descriptor.callerAuth?.accessUrl
320
- : (record.descriptor.interface?.baseUrl ?? record.descriptor.publicUrl)
321
- : record.binding.publicUrl;
322
- if (accessUrl === undefined ||
323
- (access === "gated" && !isHttpsUrl(accessUrl))) {
324
- logger.warn(`metrik discovery: row ${index} dropped — gated descriptor has no signed HTTPS callerAuth.accessUrl`);
95
+ function toServiceListing(service, logger) {
96
+ if (service.accessUrl === null) {
97
+ logger.warn(`metrik discovery: listing ${service.serviceRef} dropped — no signed invocation URL`);
325
98
  return null;
326
99
  }
327
100
  return {
328
- serviceRef: derivedRef,
329
- operator: signedIdentity.operator,
330
- publicUrl: signedIdentity.publicUrl,
331
- access,
332
- accessUrl,
333
- signed: record,
334
- category: category ?? null,
335
- ...(record.targetMetadata === undefined
336
- ? {}
337
- : { targetMetadata: record.targetMetadata }),
101
+ serviceRef: service.serviceRef,
102
+ operator: service.operator,
103
+ publicUrl: service.publicUrl,
104
+ access: service.access,
105
+ accessUrl: service.accessUrl,
106
+ signed: service.signed,
107
+ category: service.category,
338
108
  };
339
109
  }
340
- function isHttpsUrl(value) {
341
- try {
342
- return new URL(value).protocol === "https:";
343
- }
344
- catch {
345
- return false;
110
+ /**
111
+ * Translate the agent-layer options into an SDK {@link RegistryConfig}.
112
+ *
113
+ * With an api key the read is authenticated PostgREST (the SDK appends its own
114
+ * `select`/`order`, so a query string on the supplied URL is stripped);
115
+ * otherwise it is the credential-free public `GET`.
116
+ */
117
+ function buildRegistryConfig(opts, logger) {
118
+ const configuredUrl = opts.registryUrl ?? process.env.METRIK_AGENT_REGISTRY_URL;
119
+ const registryUrl = configuredUrl ?? DEFAULT_METRIK_PUBLIC_REGISTRY_URL;
120
+ const apiKey = opts.apiKey ?? process.env.METRIK_AGENT_REGISTRY_APIKEY;
121
+ // An apiKey switches the read to PostgREST, where the SDK appends
122
+ // `/rest/v1/<table>` to the configured base. The public default is NOT a
123
+ // PostgREST base, so appending to it yields `.../listings/rest/v1/listings`
124
+ // and 404s on every read. Fail loudly at the call site instead of shipping a
125
+ // discovery path that can never succeed.
126
+ if (apiKey !== undefined &&
127
+ apiKey.length > 0 &&
128
+ (configuredUrl === undefined || configuredUrl.length === 0)) {
129
+ throw new Error("metrik discovery: an apiKey was supplied without a registryUrl. An authenticated read needs a Supabase project URL (https://<ref>.supabase.co) or a URL ending in /rest/v1[/listings] — set `registryUrl` or METRIK_AGENT_REGISTRY_URL. Omit the apiKey to use the credential-free public endpoint instead.");
346
130
  }
131
+ const rowCounter = { rows: 0 };
132
+ const fetchImpl = opts.fetch ?? globalThis.fetch;
133
+ const config = {
134
+ ...(apiKey !== undefined && apiKey.length > 0
135
+ ? { url: stripQuery(registryUrl), key: apiKey }
136
+ : { publicUrl: registryUrl }),
137
+ ...(typeof fetchImpl === "function"
138
+ ? { fetch: countingFetch(fetchImpl, rowCounter, logger) }
139
+ : {}),
140
+ timeoutMs: opts.timeoutMs ?? DEFAULT_TIMEOUT_MS,
141
+ };
142
+ return { config, rowCounter };
347
143
  }
348
- function eqHex(a, b) {
349
- return a.toLowerCase() === b.toLowerCase();
144
+ function stripQuery(url) {
145
+ const queryStart = url.indexOf("?");
146
+ return queryStart === -1 ? url : url.slice(0, queryStart);
350
147
  }
351
- function errorMessage(error) {
352
- return error instanceof Error ? error.message : String(error);
148
+ /**
149
+ * Wrap `fetch` to count the rows the registry actually served, so the number
150
+ * dropped by fail-closed verification can be reported. Purely observational: the
151
+ * response is passed through untouched (the body is read from a clone), and any
152
+ * failure to inspect it leaves the count at 0 rather than failing discovery.
153
+ */
154
+ function countingFetch(fetchImpl, rowCounter, logger) {
155
+ return async (input, init) => {
156
+ const response = await fetchImpl(input, init);
157
+ if (!response.ok) {
158
+ return response;
159
+ }
160
+ try {
161
+ const payload = await response.clone().json();
162
+ if (Array.isArray(payload)) {
163
+ rowCounter.rows += payload.length;
164
+ }
165
+ else if (typeof payload === "object" &&
166
+ payload !== null &&
167
+ Array.isArray(payload.listings)) {
168
+ rowCounter.rows += payload.listings.length;
169
+ }
170
+ }
171
+ catch {
172
+ logger.warn("metrik discovery: could not inspect the registry payload for a dropped-row count");
173
+ }
174
+ return response;
175
+ };
353
176
  }
354
177
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/discovery/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/discovery/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,IAAI,mBAAmB,GAKxC,MAAM,iBAAiB,CAAC;AA4GzB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAC7C,qCAAqC,CAAC;AAExC;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,kCAAkC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA0B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC/E,wEAAwE;AACxE,MAAM,CAAC,MAAM,iBAAiB,GAA0B,sBAAsB,CAAC;AAC/E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAS,IAAI,CAAC;AACrD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAAS,IAAI,CAAC;AAEhD,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAAE,CAAC;AAGpC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAgC,EAAE;IAElC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE;QAC/C,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;KACpE,CAAC,CAAC;IAEH,mEAAmE;IACnE,8EAA8E;IAC9E,4CAA4C;IAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;IAC9E,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CACT,qBAAqB,OAAO,OAAO,UAAU,CAAC,IAAI,4IAA4I,CAC/L,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAgC,EAAE;IAElC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CACT,yKAAyK,CAC1K,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9D,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CACvB,OAA0B,EAC1B,MAA8C;IAE9C,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CACT,6BAA6B,OAAO,CAAC,UAAU,qCAAqC,CACrF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAMD;;;;;;GAMG;AACH,SAAS,mBAAmB,CAC1B,IAA6B,EAC7B,MAA8C;IAE9C,MAAM,aAAa,GACjB,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC5D,MAAM,WAAW,GAAG,aAAa,IAAI,kCAAkC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAEvE,kEAAkE;IAClE,yEAAyE;IACzE,4EAA4E;IAC5E,6EAA6E;IAC7E,yCAAyC;IACzC,IACE,MAAM,KAAK,SAAS;QACpB,MAAM,CAAC,MAAM,GAAG,CAAC;QACjB,CAAC,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,EAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CACb,6SAA6S,CAC9S,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAEjD,MAAM,MAAM,GAAmB;QAC7B,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAC3C,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE;YAC/C,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAC/B,GAAG,CAAC,OAAO,SAAS,KAAK,UAAU;YACjC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;YACzD,CAAC,CAAC,EAAE,CAAC;QACP,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,kBAAkB;KAChD,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CACpB,SAAuB,EACvB,UAAsB,EACtB,MAA8C;IAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAY,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;YACvD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;YACpC,CAAC;iBAAM,IACL,OAAO,OAAO,KAAK,QAAQ;gBAC3B,OAAO,KAAK,IAAI;gBAChB,KAAK,CAAC,OAAO,CAAE,OAAkC,CAAC,QAAQ,CAAC,EAC3D,CAAC;gBACD,UAAU,CAAC,IAAI,IAAK,OAAmC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CACT,kFAAkF,CACnF,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"agentkit.d.ts","sourceRoot":"","sources":["../../src/frameworks/agentkit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentkit.d.ts","sourceRoot":"","sources":["../../src/frameworks/agentkit.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ import "reflect-metadata";
11
11
  import { ActionProvider, CreateAction, WalletProvider, } from "@coinbase/agentkit";
12
12
  import { isAddress, isHex } from "viem";
13
13
  import { z } from "zod";
14
- import { discoverServices as defaultDiscoverServices, } from "../discovery/registry.js";
14
+ import { RegistryUnavailableError, discoverServices as defaultDiscoverServices, } from "../discovery/registry.js";
15
15
  import { checkMandate } from "../mandates/mandate.js";
16
16
  import { MandateDeniedError, VerifiedStreamAgentClient, } from "../sdk/client.js";
17
17
  /**
@@ -145,12 +145,29 @@ export class MetrikActionProvider extends ActionProvider {
145
145
  this.#discover = config.discoverServices ?? defaultDiscoverServices;
146
146
  }
147
147
  async discoverServices(_walletProvider, args) {
148
- const listings = await this.#discover({
149
- ...(args.category === undefined ? {} : { category: args.category }),
150
- ...(args.limit === undefined ? {} : { limit: args.limit }),
151
- });
148
+ let listings;
149
+ try {
150
+ listings = await this.#discover({
151
+ ...(args.category === undefined ? {} : { category: args.category }),
152
+ ...(args.limit === undefined ? {} : { limit: args.limit }),
153
+ });
154
+ }
155
+ catch (error) {
156
+ // Discovery throws when the registry could not be READ at all. Every other
157
+ // action here returns a string, and more importantly an agent must be able to
158
+ // tell "the marketplace was never reached" from "the marketplace is empty" —
159
+ // collapsing them is how an agent concludes there is nothing to hire and gives
160
+ // up on a live marketplace. So report the failure as a failure, explicitly.
161
+ if (error instanceof RegistryUnavailableError) {
162
+ return ("Could not reach the Metrik marketplace registry, so the set of available " +
163
+ "services is UNKNOWN — this is not the same as there being no services. " +
164
+ `Do not conclude nothing is hireable. Reason: ${error.message}`);
165
+ }
166
+ throw error;
167
+ }
152
168
  if (listings.length === 0) {
153
- return "No verified Metrik services discovered.";
169
+ // Reachable and genuinely empty, or everything filtered out — a real answer.
170
+ return "No verified Metrik services discovered (the registry was reachable and returned no listing that passed verification).";
154
171
  }
155
172
  const lines = listings.map((listing) => `- ${listing.serviceRef} operator=${listing.operator} verificationUrl=${listing.publicUrl} access=${listing.access} accessUrl=${listing.accessUrl}${listing.category ? ` category=${listing.category}` : ""}`);
156
173
  return (`Discovered ${listings.length} verified Metrik service${listings.length === 1 ? "" : "s"} ` +