@xona-labs/xpay 0.2.30 → 0.2.32

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/CHANGELOG.md CHANGED
@@ -6,6 +6,21 @@ versioning follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.31] – 2026-08-20
10
+
11
+ ### Added
12
+ - **SIWX free tier: sign in instead of paying.** When a 402 advertises a
13
+ Solana `sign-in-with-x` (CAIP-122) challenge - e.g. Xona's $XONA holder
14
+ perk (free daily image generations for wallets holding 50k+ $XONA) - the
15
+ live-challenge flow now signs the challenge with the Solana wallet and
16
+ retries with the `SIGN-IN-WITH-X` header before settling any payment. A
17
+ decline (not enough tokens, daily quota used) falls back to the normal
18
+ paid flow. `UseResult` gains `free` and `freeRemaining`, `xpay pay`
19
+ prints `FREE via wallet sign-in` with the remaining daily quota, and no
20
+ platform fee is charged on free calls. Catalog entries carrying a
21
+ `sign-in-with-x` extension are routed through the live flow so the free
22
+ tier is never skipped.
23
+
9
24
  ## [0.2.30] – 2026-08-19
10
25
 
11
26
  ### Added
@@ -1 +1 @@
1
- {"version":3,"file":"pay.d.ts","sourceRoot":"","sources":["../../src/cli/pay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0E5E"}
1
+ {"version":3,"file":"pay.d.ts","sourceRoot":"","sources":["../../src/cli/pay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiF5E"}
package/dist/cli/pay.js CHANGED
@@ -56,7 +56,15 @@ export async function runPay(url, opts) {
56
56
  const elapsed = Date.now() - t0;
57
57
  const amount = Number(result.amountPaid) / 1_000_000;
58
58
  console.log("");
59
- console.log(chalk.green(`✔ Paid ${formatUsd(amount)} on ${chalk.cyan(result.network)} in ${elapsed}ms`));
59
+ if (result.free) {
60
+ console.log(chalk.green(`✔ FREE via wallet sign-in (token holder tier) in ${elapsed}ms - $0.00 paid`));
61
+ if (result.freeRemaining !== undefined) {
62
+ console.log(` ${chalk.dim("free uses left today:")} ${result.freeRemaining}`);
63
+ }
64
+ }
65
+ else {
66
+ console.log(chalk.green(`✔ Paid ${formatUsd(amount)} on ${chalk.cyan(result.network)} in ${elapsed}ms`));
67
+ }
60
68
  if (result.txSig) {
61
69
  console.log(` ${chalk.dim("tx:")} ${result.txSig}`);
62
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pay.js","sourceRoot":"","sources":["../../src/cli/pay.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pay.js","sourceRoot":"","sources":["../../src/cli/pay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Agentic Market discovery client (agentic.market, Coinbase's x402 marketplace).
3
+ *
4
+ * Fast, purpose-built API (~1s responses as of Aug 2026):
5
+ * - `GET /v1/services?limit=N&offset=M` pages the full catalog (2.3k+ services)
6
+ * - `GET /v1/services/search?q=...` searches and ranks server-side
7
+ *
8
+ * Listings are service-centric (one service, many endpoints) and carry pricing
9
+ * but NOT payTo/asset settlement details - those come from the live 402
10
+ * challenge at call time. We flatten each endpoint into xpay's Resource shape;
11
+ * the synthesized `accepts[]` entry has enough for network filtering and
12
+ * balance ranking but deliberately lacks EVM domain params, so `use()` takes
13
+ * the live-challenge path instead of trusting the snapshot.
14
+ */
15
+ import type { Resource } from "../types.js";
16
+ export interface AgenticMarketClientOptions {
17
+ endpoint?: string;
18
+ /** Server-side search - omit to browse. */
19
+ query?: string;
20
+ /** Max SERVICES fetched in browse mode (each may yield several resources). */
21
+ maxServices?: number;
22
+ timeoutMs?: number;
23
+ fetch?: typeof fetch;
24
+ }
25
+ export declare function fetchAgenticMarketResources(opts?: AgenticMarketClientOptions): Promise<Resource[]>;
26
+ //# sourceMappingURL=agenticmarket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agenticmarket.d.ts","sourceRoot":"","sources":["../../src/discover/agenticmarket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAsB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAchE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAyCD,wBAAsB,2BAA2B,CAC/C,IAAI,GAAE,0BAA+B,GACpC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsCrB"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Agentic Market discovery client (agentic.market, Coinbase's x402 marketplace).
3
+ *
4
+ * Fast, purpose-built API (~1s responses as of Aug 2026):
5
+ * - `GET /v1/services?limit=N&offset=M` pages the full catalog (2.3k+ services)
6
+ * - `GET /v1/services/search?q=...` searches and ranks server-side
7
+ *
8
+ * Listings are service-centric (one service, many endpoints) and carry pricing
9
+ * but NOT payTo/asset settlement details - those come from the live 402
10
+ * challenge at call time. We flatten each endpoint into xpay's Resource shape;
11
+ * the synthesized `accepts[]` entry has enough for network filtering and
12
+ * balance ranking but deliberately lacks EVM domain params, so `use()` takes
13
+ * the live-challenge path instead of trusting the snapshot.
14
+ */
15
+ const DEFAULT_ENDPOINT = "https://api.agentic.market/v1/services";
16
+ const PAGE_SIZE = 100;
17
+ /** Browse-mode cap. The full catalog is 3MB+; one-to-few pages is plenty. */
18
+ const DEFAULT_MAX_SERVICES = 200;
19
+ const DEFAULT_TIMEOUT_MS = 15_000;
20
+ /** USDC contracts per network, used as the display asset in accepts[]. */
21
+ const USDC_BY_NETWORK = {
22
+ "eip155:8453": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
23
+ "solana:5eykt4usfv8p8njdtrepy1vzqkqzkvdp": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
24
+ };
25
+ export async function fetchAgenticMarketResources(opts = {}) {
26
+ const endpoint = opts.endpoint ?? DEFAULT_ENDPOINT;
27
+ const fetchImpl = opts.fetch ?? fetch;
28
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
29
+ const maxServices = opts.maxServices ?? DEFAULT_MAX_SERVICES;
30
+ const services = [];
31
+ if (opts.query) {
32
+ // Search endpoint ranks server-side and returns a small set - one call.
33
+ const url = new URL(endpoint.replace(/\/$/, "") + "/search");
34
+ url.searchParams.set("q", opts.query);
35
+ const body = await getJson(fetchImpl, url.toString(), timeoutMs);
36
+ services.push(...(body.services ?? []));
37
+ }
38
+ else {
39
+ let offset = 0;
40
+ let total = Infinity;
41
+ while (services.length < maxServices && offset < total) {
42
+ const url = new URL(endpoint);
43
+ url.searchParams.set("limit", String(Math.min(PAGE_SIZE, maxServices - services.length)));
44
+ url.searchParams.set("offset", String(offset));
45
+ const body = await getJson(fetchImpl, url.toString(), timeoutMs);
46
+ const page = body.services ?? [];
47
+ services.push(...page);
48
+ total = body.total ?? services.length;
49
+ offset += page.length;
50
+ if (page.length === 0)
51
+ break;
52
+ }
53
+ }
54
+ const out = [];
55
+ for (const svc of services) {
56
+ for (const ep of svc.endpoints ?? []) {
57
+ const r = toResource(svc, ep);
58
+ if (r)
59
+ out.push(r);
60
+ }
61
+ }
62
+ return out;
63
+ }
64
+ async function getJson(fetchImpl, url, timeoutMs) {
65
+ const res = await fetchImpl(url, {
66
+ headers: { accept: "application/json" },
67
+ signal: AbortSignal.timeout(timeoutMs),
68
+ });
69
+ if (!res.ok)
70
+ throw new Error(`Agentic Market discovery failed: ${res.status} ${res.statusText}`);
71
+ return (await res.json());
72
+ }
73
+ function toResource(svc, ep) {
74
+ if (!ep.url)
75
+ return null;
76
+ const accepts = [];
77
+ const network = normalizeNetwork(ep.pricing?.network ?? svc.networks?.[0]);
78
+ if (network) {
79
+ accepts.push({
80
+ asset: USDC_BY_NETWORK[network.toLowerCase()] ?? "USDC",
81
+ // The catalog doesn't publish settlement recipients; the live 402 does.
82
+ // An empty payTo (plus no EVM domain params) keeps use() on the
83
+ // live-challenge path rather than settling against the snapshot.
84
+ payTo: "",
85
+ amount: toAtomicUsdc(ep.pricing?.amount),
86
+ scheme: ep.pricing?.scheme || "exact",
87
+ network,
88
+ });
89
+ }
90
+ return {
91
+ resource: ep.url,
92
+ type: "http",
93
+ method: (ep.method || "POST").toUpperCase(),
94
+ accepts,
95
+ metadata: {
96
+ source: "agenticmarket",
97
+ name: svc.name,
98
+ description: [svc.description, ep.description].filter(Boolean).join(" - "),
99
+ category: svc.category,
100
+ provider: svc.provider,
101
+ providerUrl: svc.providerUrl,
102
+ tags: ep.tags ?? [],
103
+ quality: ep.quality ?? {},
104
+ },
105
+ inputSchema: toInputSchema(ep.parameters),
106
+ };
107
+ }
108
+ /** Agentic Market labels EVM networks by name ("Base"); map to CAIP-2. */
109
+ function normalizeNetwork(net) {
110
+ if (!net)
111
+ return undefined;
112
+ const lower = net.toLowerCase();
113
+ if (lower === "base")
114
+ return "eip155:8453";
115
+ return net;
116
+ }
117
+ /** Pricing amounts are decimal USDC strings ("0.003") - convert to 6dp atomic. */
118
+ function toAtomicUsdc(amount) {
119
+ if (!amount)
120
+ return undefined;
121
+ const n = Number(amount);
122
+ if (!Number.isFinite(n) || n < 0)
123
+ return undefined;
124
+ return String(Math.round(n * 1e6));
125
+ }
126
+ /** Rebuild a JSON Schema from the flat parameter list (body params only). */
127
+ function toInputSchema(params) {
128
+ const body = (params ?? []).filter((p) => p.name && (p.group ?? "body") === "body");
129
+ if (body.length === 0)
130
+ return undefined;
131
+ const properties = {};
132
+ const required = [];
133
+ for (const p of body) {
134
+ properties[p.name] = {
135
+ type: p.type || "string",
136
+ ...(p.description ? { description: p.description } : {}),
137
+ ...(Array.isArray(p.enumValues) && p.enumValues.length > 0 ? { enum: p.enumValues } : {}),
138
+ ...(p.default !== null && p.default !== undefined ? { default: p.default } : {}),
139
+ };
140
+ if (p.required)
141
+ required.push(p.name);
142
+ }
143
+ return {
144
+ type: "object",
145
+ properties,
146
+ ...(required.length > 0 ? { required } : {}),
147
+ };
148
+ }
149
+ //# sourceMappingURL=agenticmarket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agenticmarket.js","sourceRoot":"","sources":["../../src/discover/agenticmarket.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,10 @@ export declare function setCacheTtl(ms: number): void;
18
18
  * Concurrent calls during a cold load share the same in-flight promise.
19
19
  */
20
20
  export declare function cached(key: string, loader: Loader): Promise<Resource[]>;
21
+ /** Record that `source` is failing; callers should skip it for `ms`. */
22
+ export declare function markSourceDown(source: string, ms: number): void;
23
+ /** Whether `source` is inside a failure cooldown window. */
24
+ export declare function isSourceDown(source: string): boolean;
21
25
  /** Force-evict a cache entry (or all entries with no arg). */
22
26
  export declare function invalidate(key?: string): void;
23
27
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/discover/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,KAAK,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAmDxC,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA4B7E;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAG7C"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/discover/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,KAAK,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAmDxC,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoC7E;AAaD,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAU/D;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAYpD;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAG7C"}
@@ -24,13 +24,13 @@ function diskCachePath(key) {
24
24
  const safe = key.replace(/[^a-zA-Z0-9_-]+/g, "_");
25
25
  return join(diskCacheDir(), `${safe}.json`);
26
26
  }
27
- function readDisk(key) {
27
+ function readDisk(key, allowStale = false) {
28
28
  try {
29
29
  const file = diskCachePath(key);
30
30
  if (!existsSync(file))
31
31
  return null;
32
32
  const blob = JSON.parse(readFileSync(file, "utf8"));
33
- if (blob.expiresAt > Date.now())
33
+ if (allowStale || blob.expiresAt > Date.now())
34
34
  return blob.data;
35
35
  return null;
36
36
  }
@@ -79,11 +79,60 @@ export async function cached(key, loader) {
79
79
  return data;
80
80
  }, (err) => {
81
81
  store.delete(key);
82
+ // Stale-on-error: a snapshot past its TTL beats a hard failure when the
83
+ // upstream is down. Memory first (expired entries keep their data), then
84
+ // disk with staleness allowed. Not re-cached as fresh, so the next call
85
+ // retries the loader.
86
+ const staleMem = entry?.data;
87
+ if (staleMem)
88
+ return staleMem;
89
+ const staleDisk = readDisk(key, true);
90
+ if (staleDisk)
91
+ return staleDisk;
82
92
  throw err;
83
93
  });
84
94
  store.set(key, { expiresAt: 0, inflight });
85
95
  return inflight;
86
96
  }
97
+ // ── Source-down cooldown markers ─────────────────────────────────────────
98
+ // A failing catalog upstream (timeouts, 504s) should not re-charge its full
99
+ // timeout on every discover() call - especially from the CLI, where each
100
+ // invocation is a fresh process. Markers persist to the same disk dir.
101
+ const downStore = new Map();
102
+ function downMarkerPath(source) {
103
+ return join(diskCacheDir(), `down_${source.replace(/[^a-zA-Z0-9_-]+/g, "_")}.json`);
104
+ }
105
+ /** Record that `source` is failing; callers should skip it for `ms`. */
106
+ export function markSourceDown(source, ms) {
107
+ const until = Date.now() + ms;
108
+ downStore.set(source, until);
109
+ try {
110
+ const dir = diskCacheDir();
111
+ if (!existsSync(dir))
112
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
113
+ writeFileSync(downMarkerPath(source), JSON.stringify({ until }));
114
+ }
115
+ catch {
116
+ // Best-effort.
117
+ }
118
+ }
119
+ /** Whether `source` is inside a failure cooldown window. */
120
+ export function isSourceDown(source) {
121
+ const mem = downStore.get(source);
122
+ if (mem !== undefined)
123
+ return mem > Date.now();
124
+ try {
125
+ const file = downMarkerPath(source);
126
+ if (!existsSync(file))
127
+ return false;
128
+ const { until } = JSON.parse(readFileSync(file, "utf8"));
129
+ downStore.set(source, until);
130
+ return until > Date.now();
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ }
87
136
  /** Force-evict a cache entry (or all entries with no arg). */
88
137
  export function invalidate(key) {
89
138
  if (key)
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/discover/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/discover/cache.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,20 @@
1
1
  /**
2
2
  * Discovery - find paid services across catalogs.
3
3
  *
4
- * Two sources, merged:
4
+ * Three sources, merged:
5
5
  * - **OrbitX402** aggregates multiple x402 catalogs (its own probed
6
- * resources, PayAI, pay.sh) and searches/ranks server-side.
6
+ * resources, PayAI, pay.sh) and searches/ranks server-side. It has been
7
+ * slow lately (30-60s/page, queries 504ing), so it runs with tight
8
+ * timeouts and falls back to the PayAI facilitator directly (~2s for a
9
+ * 1000-item page) when it fails.
10
+ * - **Agentic Market** (agentic.market, Coinbase's x402 marketplace) with
11
+ * server-side search, live pricing, and usage-quality metrics.
7
12
  * - **AgenC** (agenc.ag) lists hireable on-chain agent services, priced in
8
13
  * SOL and executed as escrow hires rather than x402 calls. Its API has no
9
14
  * text search, so queries are matched locally (the catalog is small).
10
15
  *
11
16
  * One source failing never kills discovery - its error is stashed in
12
- * {@link lastDiscoverWarnings} and the other source's results are returned.
17
+ * {@link lastDiscoverWarnings} and the other sources' results are returned.
13
18
  */
14
19
  import type { DiscoverOptions, Resource } from "../types.js";
15
20
  export { setCacheTtl, invalidate as invalidateCache } from "./cache.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discover/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK7D,OAAO,EAAE,WAAW,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AAExE,UAAU,uBAAwB,SAAQ,eAAe;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2BD,4EAA4E;AAC5E,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,uBAA4B,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAoEtF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discover/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO7D,OAAO,EAAE,WAAW,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AAExE,UAAU,uBAAwB,SAAQ,eAAe;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAiDD,4EAA4E;AAC5E,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,uBAA4B,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAgFtF"}
@@ -1,21 +1,43 @@
1
1
  /**
2
2
  * Discovery - find paid services across catalogs.
3
3
  *
4
- * Two sources, merged:
4
+ * Three sources, merged:
5
5
  * - **OrbitX402** aggregates multiple x402 catalogs (its own probed
6
- * resources, PayAI, pay.sh) and searches/ranks server-side.
6
+ * resources, PayAI, pay.sh) and searches/ranks server-side. It has been
7
+ * slow lately (30-60s/page, queries 504ing), so it runs with tight
8
+ * timeouts and falls back to the PayAI facilitator directly (~2s for a
9
+ * 1000-item page) when it fails.
10
+ * - **Agentic Market** (agentic.market, Coinbase's x402 marketplace) with
11
+ * server-side search, live pricing, and usage-quality metrics.
7
12
  * - **AgenC** (agenc.ag) lists hireable on-chain agent services, priced in
8
13
  * SOL and executed as escrow hires rather than x402 calls. Its API has no
9
14
  * text search, so queries are matched locally (the catalog is small).
10
15
  *
11
16
  * One source failing never kills discovery - its error is stashed in
12
- * {@link lastDiscoverWarnings} and the other source's results are returned.
17
+ * {@link lastDiscoverWarnings} and the other sources' results are returned.
13
18
  */
14
19
  import { fetchOrbitX402Resources } from "./orbitx402.js";
20
+ import { fetchPayAIResources } from "./payai.js";
21
+ import { fetchAgenticMarketResources } from "./agenticmarket.js";
15
22
  import { fetchAgencResources } from "../agenc/api.js";
16
- import { cached } from "./cache.js";
23
+ import { cached, isSourceDown, markSourceDown } from "./cache.js";
17
24
  export { setCacheTtl, invalidate as invalidateCache } from "./cache.js";
18
- const DEFAULT_SOURCES = ["orbitx402", "agenc"];
25
+ const DEFAULT_SOURCES = ["orbitx402", "agenticmarket", "agenc"];
26
+ /**
27
+ * Cap on items pulled from OrbitX402. With a query the server ranks and
28
+ * returns a few dozen, so this never binds; without one it stops us from
29
+ * paging a 20k+ catalog through an upstream currently doing 30s/page.
30
+ */
31
+ const ORBIT_MAX_ITEMS = 600;
32
+ /** PayAI-fallback catalog size. Three 1000-item pages, ~6s cold. */
33
+ const PAYAI_FALLBACK_MAX_ITEMS = 3000;
34
+ /**
35
+ * Per-request budget for OrbitX402. Healthy responses land well under this;
36
+ * its gateway 504s at ~60s, so anything longer only delays the fallback.
37
+ */
38
+ const ORBIT_TIMEOUT_MS = 20_000;
39
+ /** How long a failed OrbitX402 call routes traffic straight to PayAI. */
40
+ const ORBIT_COOLDOWN_MS = 5 * 60 * 1000;
19
41
  /**
20
42
  * Above this many results for a query, assume the endpoint ignored the
21
43
  * `query` param (older/custom deployments return the full catalog) and fall
@@ -36,6 +58,9 @@ const NETWORK_ALIASES = {
36
58
  stable: "eip155:988",
37
59
  };
38
60
  let warnings = [];
61
+ /** Notes queued by in-flight source fetches (e.g. fallback used), folded into
62
+ * {@link warnings} once the call settles. */
63
+ let pendingNotes = [];
39
64
  /** Non-fatal source failures from the most recent {@link discover} call. */
40
65
  export function lastDiscoverWarnings() {
41
66
  return [...warnings];
@@ -45,12 +70,17 @@ export async function discover(opts = {}) {
45
70
  const sources = opts.sources ??
46
71
  process.env.XPAY_DISCOVERY_SOURCES?.split(",").map((s) => s.trim()).filter(Boolean) ??
47
72
  DEFAULT_SOURCES;
48
- // The query is sent to OrbitX402, which searches and ranks server-side -
49
- // a ~50KB response instead of the full multi-MB catalog download. AgenC's
50
- // catalog is small enough to fetch whole and filter locally.
51
- const [orbitSettled, agencSettled] = await Promise.allSettled([
73
+ pendingNotes = [];
74
+ // The query is sent to OrbitX402 and Agentic Market, which search and rank
75
+ // server-side - a small response instead of a full multi-MB catalog
76
+ // download. AgenC's catalog is small enough to fetch whole and filter
77
+ // locally.
78
+ const [orbitSettled, marketSettled, agencSettled] = await Promise.allSettled([
52
79
  sources.includes("orbitx402")
53
- ? cached(`orbitx402:${opts.endpoint ?? "default"}${query ? `:q=${query}` : ""}`, () => fetchOrbitX402Resources({ endpoint: opts.endpoint, query }))
80
+ ? fetchOrbitWithPayAIFallback(opts.endpoint, query)
81
+ : Promise.resolve([]),
82
+ sources.includes("agenticmarket")
83
+ ? cached(`agenticmarket${query ? `:q=${query}` : ""}`, () => fetchAgenticMarketResources({ query }))
54
84
  : Promise.resolve([]),
55
85
  sources.includes("agenc")
56
86
  ? cached("agenc:hireable", () => fetchAgencResources())
@@ -58,18 +88,23 @@ export async function discover(opts = {}) {
58
88
  ]);
59
89
  const failures = [];
60
90
  let orbit = unwrap(orbitSettled, "orbitx402", failures);
91
+ let market = unwrap(marketSettled, "agenticmarket", failures);
61
92
  let agenc = unwrap(agencSettled, "agenc", failures);
62
- warnings = failures;
93
+ warnings = [...failures, ...pendingNotes];
63
94
  const enabledCount = DEFAULT_SOURCES.filter((s) => sources.includes(s)).length;
64
95
  if (failures.length >= enabledCount && enabledCount > 0) {
65
96
  throw new Error(`xpay.discover: all discovery sources failed - ${failures.join("; ")}`);
66
97
  }
67
98
  if (query) {
68
99
  const terms = query.split(/\s+/).filter(Boolean);
69
- // OrbitX402: local filter + ranking only when the server didn't do it.
100
+ // Server-searched sources: local filter + ranking only when the server
101
+ // clearly didn't do it (full catalog came back).
70
102
  if (orbit.length > SERVER_QUERY_MAX) {
71
103
  orbit = rankByScore(orbit, terms);
72
104
  }
105
+ if (market.length > SERVER_QUERY_MAX) {
106
+ market = rankByScore(market, terms);
107
+ }
73
108
  // AgenC: no server-side query param - always match locally.
74
109
  agenc = rankByScore(agenc, terms);
75
110
  }
@@ -79,21 +114,83 @@ export async function discover(opts = {}) {
79
114
  const wanted = opts.networks.map((n) => NETWORK_ALIASES[n] ?? n);
80
115
  const matchesNet = (r) => r.accepts.some((a) => wanted.some((n) => a.network === n || a.network.startsWith(n + ":")));
81
116
  orbit = orbit.filter(matchesNet);
117
+ market = market.filter(matchesNet);
82
118
  agenc = agenc.filter(matchesNet);
83
119
  }
84
120
  // Merge. When a limit would otherwise be filled entirely from the 20k+ x402
85
121
  // catalog, reserve up to a third of the slots for AgenC matches so
86
- // marketplace listings are never silently drowned out.
87
- if (opts.limit && orbit.length > 0 && agenc.length > 0) {
122
+ // marketplace listings are never silently drowned out; the remaining slots
123
+ // are split between the two x402 catalogs so neither drowns the other.
124
+ if (opts.limit && agenc.length > 0 && orbit.length + market.length > 0) {
88
125
  const agencSlots = Math.min(agenc.length, Math.max(1, Math.ceil(opts.limit / 3)));
89
- const orbitSlots = Math.max(0, opts.limit - agencSlots);
90
- return [...orbit.slice(0, orbitSlots), ...agenc.slice(0, agencSlots)];
126
+ const x402Slots = Math.max(0, opts.limit - agencSlots);
127
+ return [...mergeX402(orbit, market, x402Slots), ...agenc.slice(0, agencSlots)];
91
128
  }
92
- let results = [...orbit, ...agenc];
129
+ let results = [...mergeX402(orbit, market, opts.limit ?? Infinity), ...agenc];
93
130
  if (opts.limit)
94
131
  results = results.slice(0, opts.limit);
95
132
  return results;
96
133
  }
134
+ /**
135
+ * OrbitX402 with a direct-PayAI safety net. Orbit aggregates PayAI anyway, so
136
+ * when it's down or timing out, PayAI's facilitator gives us most of the same
137
+ * catalog at a fraction of the latency (query is then ranked locally).
138
+ */
139
+ async function fetchOrbitWithPayAIFallback(endpoint, query) {
140
+ // A recent orbit failure puts it in a cooldown window (persisted to disk, so
141
+ // fresh CLI processes benefit too) - go straight to PayAI instead of
142
+ // re-paying the timeout on every call.
143
+ if (!isSourceDown("orbitx402")) {
144
+ try {
145
+ return await cached(`orbitx402:${endpoint ?? "default"}${query ? `:q=${query}` : ""}`, () => fetchOrbitX402Resources({
146
+ endpoint,
147
+ query,
148
+ maxItems: ORBIT_MAX_ITEMS,
149
+ timeoutMs: ORBIT_TIMEOUT_MS,
150
+ }));
151
+ }
152
+ catch (orbitErr) {
153
+ markSourceDown("orbitx402", ORBIT_COOLDOWN_MS);
154
+ return payAIDirect(query, orbitErr);
155
+ }
156
+ }
157
+ return payAIDirect(query, new Error("orbitx402 in failure cooldown"));
158
+ }
159
+ async function payAIDirect(query, orbitErr) {
160
+ try {
161
+ const catalog = await cached("payai:fallback", () => fetchPayAIResources({ maxItems: PAYAI_FALLBACK_MAX_ITEMS }));
162
+ pendingNotes.push("orbitx402 unavailable, served from PayAI facilitator directly");
163
+ if (!query)
164
+ return catalog;
165
+ return rankByScore(catalog, query.split(/\s+/).filter(Boolean));
166
+ }
167
+ catch {
168
+ throw orbitErr;
169
+ }
170
+ }
171
+ /**
172
+ * Interleave the two x402 catalogs' top results (orbit first - it ranks
173
+ * server-side across more sources) up to `limit` combined items.
174
+ */
175
+ function mergeX402(orbit, market, limit) {
176
+ const out = [];
177
+ const seen = new Set();
178
+ let i = 0;
179
+ while (out.length < limit && (i < orbit.length || i < market.length)) {
180
+ for (const r of [orbit[i], market[i]]) {
181
+ if (!r || out.length >= limit)
182
+ continue;
183
+ // Both catalogs can list the same underlying resource URL.
184
+ const key = `${r.method} ${r.resource}`;
185
+ if (seen.has(key))
186
+ continue;
187
+ seen.add(key);
188
+ out.push(r);
189
+ }
190
+ i++;
191
+ }
192
+ return out;
193
+ }
97
194
  function unwrap(settled, source, failures) {
98
195
  if (settled.status === "fulfilled")
99
196
  return settled.value;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discover/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discover/index.ts"],"names":[],"mappings":"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"}