@xona-labs/xpay 0.2.31 → 0.2.33

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.
@@ -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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"}
@@ -4,6 +4,13 @@
4
4
  * Fetches from api.orbitx402.com/api/x402-discovery which combines
5
5
  * orbitx402's own probed resources, PayAI catalog, and pay.sh catalog -
6
6
  * all in xpay's Resource shape. Pagination matches PayAI's format.
7
+ *
8
+ * The upstream does per-item work server-side, so latency scales with page
9
+ * size: as of Aug 2026, limit=500 exceeds its gateway's 60s timeout (504)
10
+ * while limit=100 completes. We therefore use small pages, a per-request
11
+ * timeout, and parallel page fetches once the first page reveals the total.
12
+ * Later-page failures degrade to a partial result instead of throwing - the
13
+ * caller caches whatever we got.
7
14
  */
8
15
  import { type Resource } from "../types.js";
9
16
  export interface OrbitX402ClientOptions {
@@ -12,6 +19,8 @@ export interface OrbitX402ClientOptions {
12
19
  limit?: number;
13
20
  /** Server-side search - the API ranks and returns only matching resources. */
14
21
  query?: string;
22
+ /** Per-request timeout. The upstream 504s around 60s, so waiting longer is pointless. */
23
+ timeoutMs?: number;
15
24
  fetch?: typeof fetch;
16
25
  }
17
26
  export declare function fetchOrbitX402Resources(opts?: OrbitX402ClientOptions): Promise<Resource[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"orbitx402.d.ts","sourceRoot":"","sources":["../../src/discover/orbitx402.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK5D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAOD,wBAAsB,uBAAuB,CAAC,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAwCpG"}
1
+ {"version":3,"file":"orbitx402.d.ts","sourceRoot":"","sources":["../../src/discover/orbitx402.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAU5D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAOD,wBAAsB,uBAAuB,CAAC,IAAI,GAAE,sBAA2B,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA0EpG"}
@@ -4,19 +4,29 @@
4
4
  * Fetches from api.orbitx402.com/api/x402-discovery which combines
5
5
  * orbitx402's own probed resources, PayAI catalog, and pay.sh catalog -
6
6
  * all in xpay's Resource shape. Pagination matches PayAI's format.
7
+ *
8
+ * The upstream does per-item work server-side, so latency scales with page
9
+ * size: as of Aug 2026, limit=500 exceeds its gateway's 60s timeout (504)
10
+ * while limit=100 completes. We therefore use small pages, a per-request
11
+ * timeout, and parallel page fetches once the first page reveals the total.
12
+ * Later-page failures degrade to a partial result instead of throwing - the
13
+ * caller caches whatever we got.
7
14
  */
8
15
  import { ResourceSchema } from "../types.js";
9
16
  const DEFAULT_ENDPOINT = "https://api.orbitx402.com/api/x402-discovery";
10
- const PAGE_SIZE = 500;
17
+ const PAGE_SIZE = 100;
18
+ const DEFAULT_TIMEOUT_MS = 45_000;
19
+ /** Concurrent page fetches after the first page. */
20
+ const PAGE_CONCURRENCY = 4;
21
+ /** Defensive cap on total pages fetched. */
22
+ const MAX_PAGES = 100;
11
23
  export async function fetchOrbitX402Resources(opts = {}) {
12
24
  const endpoint = opts.endpoint ?? DEFAULT_ENDPOINT;
13
25
  const limit = Math.min(opts.limit ?? PAGE_SIZE, PAGE_SIZE);
14
26
  const maxItems = opts.maxItems ?? Infinity;
27
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
15
28
  const fetchImpl = opts.fetch ?? fetch;
16
- const all = [];
17
- let offset = 0;
18
- let total = Infinity;
19
- for (let page = 0; page < 100 && offset < total && all.length < maxItems; page++) {
29
+ const fetchPage = async (offset) => {
20
30
  const url = new URL(endpoint);
21
31
  url.searchParams.set("limit", String(limit));
22
32
  url.searchParams.set("offset", String(offset));
@@ -24,27 +34,62 @@ export async function fetchOrbitX402Resources(opts = {}) {
24
34
  url.searchParams.set("query", opts.query);
25
35
  const res = await fetchImpl(url.toString(), {
26
36
  headers: { accept: "application/json" },
37
+ signal: AbortSignal.timeout(timeoutMs),
27
38
  });
28
39
  if (!res.ok)
29
40
  throw new Error(`OrbitX402 discovery failed: ${res.status} ${res.statusText}`);
30
- const body = (await res.json());
31
- const rawItems = body.items ?? [];
41
+ return (await res.json());
42
+ };
43
+ const parseInto = (all, rawItems) => {
32
44
  for (const raw of rawItems) {
45
+ if (all.length >= maxItems)
46
+ return;
33
47
  const parsed = ResourceSchema.safeParse(raw);
34
48
  if (parsed.success)
35
49
  all.push(parsed.data);
36
- if (all.length >= maxItems)
37
- return all;
38
- }
39
- if (body.pagination) {
40
- total = body.pagination.total;
41
- offset = body.pagination.offset + rawItems.length;
42
50
  }
43
- else {
44
- break;
51
+ };
52
+ // First page sequentially - it tells us the total (and whether the server
53
+ // paginates at all).
54
+ const first = await fetchPage(0);
55
+ const all = [];
56
+ const firstItems = first.items ?? [];
57
+ parseInto(all, firstItems);
58
+ if (!first.pagination || firstItems.length < limit || all.length >= maxItems) {
59
+ return all;
60
+ }
61
+ const total = Math.min(first.pagination.total, maxItems);
62
+ const offsets = [];
63
+ for (let off = firstItems.length; off < total && offsets.length < MAX_PAGES; off += limit) {
64
+ offsets.push(off);
65
+ }
66
+ // Remaining pages in parallel. A page failure (timeout, 504) stops its lane
67
+ // but keeps everything already fetched - partial catalog beats no catalog.
68
+ const pages = [];
69
+ let cursor = 0;
70
+ let failed = false;
71
+ const worker = async () => {
72
+ while (!failed) {
73
+ const i = cursor++;
74
+ if (i >= offsets.length)
75
+ return;
76
+ try {
77
+ const body = await fetchPage(offsets[i]);
78
+ pages.push({ offset: offsets[i], items: body.items ?? [] });
79
+ }
80
+ catch {
81
+ failed = true;
82
+ return;
83
+ }
45
84
  }
46
- if (rawItems.length < limit)
85
+ };
86
+ await Promise.all(Array.from({ length: PAGE_CONCURRENCY }, worker));
87
+ // Reassemble in offset order so results stay deterministic.
88
+ pages.sort((a, b) => a.offset - b.offset);
89
+ for (const page of pages) {
90
+ if (all.length >= maxItems)
47
91
  break;
92
+ parseInto(all, page.items);
48
93
  }
49
94
  return all;
50
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orbitx402.js","sourceRoot":"","sources":["../../src/discover/orbitx402.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAE5D,MAAM,gBAAgB,GAAG,8CAA8C,CAAC;AACxE,MAAM,SAAS,GAAG,GAAG,CAAC;AAgBtB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAA+B,EAAE;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAEtC,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,KAAK,GAAG,QAAQ,CAAC;IAErB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,IAAI,MAAM,GAAG,KAAK,IAAI,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QACjF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,KAAK;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC1C,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAE5F,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAElC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,OAAO;gBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;gBAAE,OAAO,GAAG,CAAC;QACzC,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAC9B,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK;YAAE,MAAM;IACrC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"orbitx402.js","sourceRoot":"","sources":["../../src/discover/orbitx402.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAE5D,MAAM,gBAAgB,GAAG,8CAA8C,CAAC;AACxE,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,oDAAoD;AACpD,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,4CAA4C;AAC5C,MAAM,SAAS,GAAG,GAAG,CAAC;AAkBtB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAA+B,EAAE;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;IAEtC,MAAM,SAAS,GAAG,KAAK,EAAE,MAAc,EAA8B,EAAE;QACrE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,KAAK;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC1C,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5F,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,GAAe,EAAE,QAAmB,EAAQ,EAAE;QAC/D,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;gBAAE,OAAO;YACnC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,OAAO;gBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC;IAEF,0EAA0E;IAC1E,qBAAqB;IACrB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IACrC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAE3B,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC7E,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,KAAK,GAAgD,EAAE,CAAC;IAC9D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM;gBAAE,OAAO;YAChC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpE,4DAA4D;IAC5D,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;YAAE,MAAM;QAClC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Tokenized stock quotes on Solana - Jupiter Price API v3.
3
+ *
4
+ * Builds on the RWA sweep (token/rwa.ts) for the universe of tradable
5
+ * tokenized stocks/ETFs (Backed xStocks, Ondo Global Markets, Remora,
6
+ * Backpack Securities), then enriches each with the stock-specific data
7
+ * Jupiter bundles in Price v3 for these mints:
8
+ *
9
+ * - on-chain price vs the underlying reference share price
10
+ * - premium/discount % (the on-chain token can trade rich or cheap,
11
+ * especially while the underlying market is closed)
12
+ * - 24h on-chain price change and DEX liquidity
13
+ *
14
+ * Free, read-only, no wallet. Price v3 lives on a different host than the
15
+ * Token API: lite-api.jup.ag keyless, api.jup.ag with an API key.
16
+ */
17
+ import { type TokenApiOptions } from "./index.js";
18
+ export type UsMarketStatus = "open" | "closed" | "pre_market" | "after_hours";
19
+ export interface StockQuote {
20
+ mint: string;
21
+ symbol: string;
22
+ name: string;
23
+ /** Issuing platform (Backed xStocks, Ondo Global Markets, ...). */
24
+ issuer: string;
25
+ verified: boolean;
26
+ /** Live DEX price of the tokenized stock, USD. */
27
+ onchainPrice?: number;
28
+ /** Reference price of the underlying share, USD (bundled by Jupiter). */
29
+ underlyingPrice?: number;
30
+ /** (onchain - underlying) / underlying, in percent. Positive = premium. */
31
+ premiumDiscountPct?: number;
32
+ /** 24h on-chain price change, percent. */
33
+ priceChange24hPct?: number;
34
+ /** On-chain DEX liquidity, USD. Thin liquidity makes any premium untradable. */
35
+ liquidityUsd?: number;
36
+ /** Market cap of the underlying company/fund, USD. */
37
+ underlyingMcapUsd?: number;
38
+ /** Scaled-UI multiplier (stock splits are applied via this, not rebases). */
39
+ uiMultiplier?: number;
40
+ /** When Jupiter last refreshed the underlying reference price. */
41
+ referenceUpdatedAt?: string;
42
+ }
43
+ export interface StockFindOptions extends TokenApiOptions {
44
+ /** Substring filter on symbol/name: "AAPL" and "tesla" both work. */
45
+ query?: string;
46
+ /** Max results. Default 20. */
47
+ limit?: number;
48
+ }
49
+ export interface StockFindResult {
50
+ /** US equity market session right now (weekends yes, holidays not modeled). */
51
+ marketStatus: UsMarketStatus;
52
+ stocks: StockQuote[];
53
+ /** Set when live quote enrichment failed and only static listings are returned. */
54
+ note?: string;
55
+ }
56
+ /**
57
+ * List tokenized stocks on Solana with live on-chain vs underlying pricing,
58
+ * ranked by liquidity. The universe comes from the cached RWA sweep; quotes
59
+ * are one batched Price v3 call per 50 mints. Quote enrichment degrades
60
+ * gracefully: a Price v3 failure returns the listing without live fields.
61
+ */
62
+ export declare function findStocks(opts?: StockFindOptions): Promise<StockFindResult>;
63
+ /**
64
+ * US equity market session in America/New_York, DST handled by Intl.
65
+ * Weekends are closed; exchange holidays are NOT modeled, so treat "open"
66
+ * as best-effort. Premium/discount risk is highest outside regular hours.
67
+ */
68
+ export declare function usEquityMarketStatus(now?: Date): UsMarketStatus;
69
+ //# sourceMappingURL=stock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock.d.ts","sourceRoot":"","sources":["../../src/token/stock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAShE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,YAAY,EAAE,cAAc,CAAC;IAC7B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CA0BtF;AAiED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,OAAa,GAAG,cAAc,CAkBrE"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Tokenized stock quotes on Solana - Jupiter Price API v3.
3
+ *
4
+ * Builds on the RWA sweep (token/rwa.ts) for the universe of tradable
5
+ * tokenized stocks/ETFs (Backed xStocks, Ondo Global Markets, Remora,
6
+ * Backpack Securities), then enriches each with the stock-specific data
7
+ * Jupiter bundles in Price v3 for these mints:
8
+ *
9
+ * - on-chain price vs the underlying reference share price
10
+ * - premium/discount % (the on-chain token can trade rich or cheap,
11
+ * especially while the underlying market is closed)
12
+ * - 24h on-chain price change and DEX liquidity
13
+ *
14
+ * Free, read-only, no wallet. Price v3 lives on a different host than the
15
+ * Token API: lite-api.jup.ag keyless, api.jup.ag with an API key.
16
+ */
17
+ import { findRwaTokens } from "./rwa.js";
18
+ import { jupiterFetch } from "./index.js";
19
+ /** Keyless Price v3 host. With JUPITER_API_KEY the api.jup.ag mirror is used. */
20
+ const LITE_PRICE_URL = "https://lite-api.jup.ag/price/v3";
21
+ const KEYED_PRICE_URL = "https://api.jup.ag/price/v3";
22
+ /** Price v3 accepts comma-separated ids; stay under the documented cap. */
23
+ const PRICE_BATCH_SIZE = 50;
24
+ /**
25
+ * List tokenized stocks on Solana with live on-chain vs underlying pricing,
26
+ * ranked by liquidity. The universe comes from the cached RWA sweep; quotes
27
+ * are one batched Price v3 call per 50 mints. Quote enrichment degrades
28
+ * gracefully: a Price v3 failure returns the listing without live fields.
29
+ */
30
+ export async function findStocks(opts = {}) {
31
+ const tokens = await findRwaTokens({
32
+ ...opts,
33
+ query: opts.query,
34
+ category: "stocks",
35
+ limit: opts.limit ?? 20,
36
+ });
37
+ const marketStatus = usEquityMarketStatus();
38
+ if (tokens.length === 0)
39
+ return { marketStatus, stocks: [] };
40
+ let priced;
41
+ try {
42
+ priced = await fetchPrices(tokens.map((t) => t.mint), opts);
43
+ }
44
+ catch (err) {
45
+ return {
46
+ marketStatus,
47
+ stocks: tokens.map((t) => baseQuote(t)),
48
+ note: `Live quote lookup failed (${err.message}) - listing without premium/discount data.`,
49
+ };
50
+ }
51
+ return {
52
+ marketStatus,
53
+ stocks: tokens.map((t) => enrich(baseQuote(t), priced.get(t.mint))),
54
+ };
55
+ }
56
+ function baseQuote(t) {
57
+ return {
58
+ mint: t.mint,
59
+ symbol: t.symbol,
60
+ name: t.name,
61
+ issuer: t.issuer,
62
+ verified: t.verified,
63
+ onchainPrice: t.usdPrice,
64
+ liquidityUsd: t.liquidity,
65
+ };
66
+ }
67
+ function enrich(q, entry) {
68
+ if (!entry || typeof entry.usdPrice !== "number")
69
+ return q;
70
+ const onchain = entry.usdPrice;
71
+ const underlying = typeof entry.stockData?.price === "number" ? entry.stockData.price : undefined;
72
+ const premiumPct = underlying !== undefined && underlying > 0
73
+ ? Math.round(((onchain - underlying) / underlying) * 10_000) / 100
74
+ : undefined;
75
+ return {
76
+ ...q,
77
+ onchainPrice: round2(onchain),
78
+ underlyingPrice: underlying !== undefined ? round2(underlying) : undefined,
79
+ premiumDiscountPct: premiumPct,
80
+ priceChange24hPct: typeof entry.priceChange24h === "number" ? round2(entry.priceChange24h) : undefined,
81
+ liquidityUsd: typeof entry.liquidity === "number" ? Math.round(entry.liquidity) : q.liquidityUsd,
82
+ underlyingMcapUsd: typeof entry.stockData?.mcap === "number" ? Math.round(entry.stockData.mcap) : undefined,
83
+ uiMultiplier: typeof entry.scaledUiConfig?.multiplier === "number" ? entry.scaledUiConfig.multiplier : undefined,
84
+ referenceUpdatedAt: entry.stockData?.updatedAt,
85
+ };
86
+ }
87
+ /** Batched Price v3 lookup. Returns whatever Jupiter priced; missing mints are simply absent. */
88
+ async function fetchPrices(mints, opts) {
89
+ const apiKey = opts.apiKey ?? process.env.JUPITER_API_KEY;
90
+ const base = process.env.XPAY_JUPITER_PRICE_URL ?? (apiKey ? KEYED_PRICE_URL : LITE_PRICE_URL);
91
+ const out = new Map();
92
+ for (let i = 0; i < mints.length; i += PRICE_BATCH_SIZE) {
93
+ const batch = mints.slice(i, i + PRICE_BATCH_SIZE);
94
+ const url = new URL(base);
95
+ url.searchParams.set("ids", batch.join(","));
96
+ const body = (await jupiterFetch(url.toString(), apiKey));
97
+ if (body && typeof body === "object") {
98
+ for (const [mint, entry] of Object.entries(body))
99
+ out.set(mint, entry);
100
+ }
101
+ }
102
+ return out;
103
+ }
104
+ /**
105
+ * US equity market session in America/New_York, DST handled by Intl.
106
+ * Weekends are closed; exchange holidays are NOT modeled, so treat "open"
107
+ * as best-effort. Premium/discount risk is highest outside regular hours.
108
+ */
109
+ export function usEquityMarketStatus(now = new Date()) {
110
+ const parts = new Intl.DateTimeFormat("en-US", {
111
+ timeZone: "America/New_York",
112
+ weekday: "short",
113
+ hour: "numeric",
114
+ minute: "numeric",
115
+ hour12: false,
116
+ }).formatToParts(now);
117
+ const get = (type) => parts.find((p) => p.type === type)?.value ?? "";
118
+ const weekday = get("weekday");
119
+ if (weekday === "Sat" || weekday === "Sun")
120
+ return "closed";
121
+ const minutes = Number(get("hour")) * 60 + Number(get("minute"));
122
+ if (minutes >= 9 * 60 + 30 && minutes < 16 * 60)
123
+ return "open";
124
+ if (minutes >= 4 * 60 && minutes < 9 * 60 + 30)
125
+ return "pre_market";
126
+ if (minutes >= 16 * 60 && minutes < 20 * 60)
127
+ return "after_hours";
128
+ return "closed";
129
+ }
130
+ function round2(n) {
131
+ return Math.round(n * 100) / 100;
132
+ }
133
+ //# sourceMappingURL=stock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stock.js","sourceRoot":"","sources":["../../src/token/stock.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AA6BxC,MAAM,WAAW,UAAU,CAAC,IAAI;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;CAC1B;AASD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CA4B5D,CAAC;AAEF,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,CAm0BvF;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;;qCAx4BD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EAq5B9E;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;qCAx5BD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EAs6B9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AA8BxC,MAAM,WAAW,UAAU,CAAC,IAAI;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;CAC1B;AASD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CA6B5D,CAAC;AAEF,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,CAo2BvF;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;;qCA16BD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EAu7B9E;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI;;;;;;;;qCA17BD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC;EAw8B9E"}