threenative-asset-mcp 0.4.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 (150) hide show
  1. package/README.md +441 -0
  2. package/dist/ambientcg/client.d.ts +61 -0
  3. package/dist/ambientcg/client.d.ts.map +1 -0
  4. package/dist/ambientcg/client.js +234 -0
  5. package/dist/ambientcg/client.js.map +1 -0
  6. package/dist/audio/catalog.d.ts +36 -0
  7. package/dist/audio/catalog.d.ts.map +1 -0
  8. package/dist/audio/catalog.js +169 -0
  9. package/dist/audio/catalog.js.map +1 -0
  10. package/dist/audio/client.d.ts +46 -0
  11. package/dist/audio/client.d.ts.map +1 -0
  12. package/dist/audio/client.js +196 -0
  13. package/dist/audio/client.js.map +1 -0
  14. package/dist/bundle/client.d.ts +89 -0
  15. package/dist/bundle/client.d.ts.map +1 -0
  16. package/dist/bundle/client.js +324 -0
  17. package/dist/bundle/client.js.map +1 -0
  18. package/dist/config.d.ts +20 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +130 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/download/direct-asset-downloader.d.ts +41 -0
  23. package/dist/download/direct-asset-downloader.d.ts.map +1 -0
  24. package/dist/download/direct-asset-downloader.js +232 -0
  25. package/dist/download/direct-asset-downloader.js.map +1 -0
  26. package/dist/fab/api-download.d.ts +30 -0
  27. package/dist/fab/api-download.d.ts.map +1 -0
  28. package/dist/fab/api-download.js +200 -0
  29. package/dist/fab/api-download.js.map +1 -0
  30. package/dist/fab/browser-transport.d.ts +79 -0
  31. package/dist/fab/browser-transport.d.ts.map +1 -0
  32. package/dist/fab/browser-transport.js +492 -0
  33. package/dist/fab/browser-transport.js.map +1 -0
  34. package/dist/fab/cache.d.ts +22 -0
  35. package/dist/fab/cache.d.ts.map +1 -0
  36. package/dist/fab/cache.js +55 -0
  37. package/dist/fab/cache.js.map +1 -0
  38. package/dist/fab/client.d.ts +61 -0
  39. package/dist/fab/client.d.ts.map +1 -0
  40. package/dist/fab/client.js +868 -0
  41. package/dist/fab/client.js.map +1 -0
  42. package/dist/fab/direct-transport.d.ts +68 -0
  43. package/dist/fab/direct-transport.d.ts.map +1 -0
  44. package/dist/fab/direct-transport.js +184 -0
  45. package/dist/fab/direct-transport.js.map +1 -0
  46. package/dist/fab/download-store.d.ts +21 -0
  47. package/dist/fab/download-store.d.ts.map +1 -0
  48. package/dist/fab/download-store.js +93 -0
  49. package/dist/fab/download-store.js.map +1 -0
  50. package/dist/fab/errors.d.ts +20 -0
  51. package/dist/fab/errors.d.ts.map +1 -0
  52. package/dist/fab/errors.js +65 -0
  53. package/dist/fab/errors.js.map +1 -0
  54. package/dist/fab/impersonate-fetch.d.ts +48 -0
  55. package/dist/fab/impersonate-fetch.d.ts.map +1 -0
  56. package/dist/fab/impersonate-fetch.js +228 -0
  57. package/dist/fab/impersonate-fetch.js.map +1 -0
  58. package/dist/fab/normalize.d.ts +3 -0
  59. package/dist/fab/normalize.d.ts.map +1 -0
  60. package/dist/fab/normalize.js +285 -0
  61. package/dist/fab/normalize.js.map +1 -0
  62. package/dist/fab/schemas.d.ts +10 -0
  63. package/dist/fab/schemas.d.ts.map +1 -0
  64. package/dist/fab/schemas.js +105 -0
  65. package/dist/fab/schemas.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +58 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/itch/catalog.d.ts +13 -0
  71. package/dist/itch/catalog.d.ts.map +1 -0
  72. package/dist/itch/catalog.js +50 -0
  73. package/dist/itch/catalog.js.map +1 -0
  74. package/dist/itch/client.d.ts +46 -0
  75. package/dist/itch/client.d.ts.map +1 -0
  76. package/dist/itch/client.js +175 -0
  77. package/dist/itch/client.js.map +1 -0
  78. package/dist/polyhaven/client.d.ts +55 -0
  79. package/dist/polyhaven/client.d.ts.map +1 -0
  80. package/dist/polyhaven/client.js +210 -0
  81. package/dist/polyhaven/client.js.map +1 -0
  82. package/dist/server.d.ts +25 -0
  83. package/dist/server.d.ts.map +1 -0
  84. package/dist/server.js +448 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/sketchfab/client.d.ts +70 -0
  87. package/dist/sketchfab/client.d.ts.map +1 -0
  88. package/dist/sketchfab/client.js +255 -0
  89. package/dist/sketchfab/client.js.map +1 -0
  90. package/dist/smithsonian/client.d.ts +32 -0
  91. package/dist/smithsonian/client.d.ts.map +1 -0
  92. package/dist/smithsonian/client.js +142 -0
  93. package/dist/smithsonian/client.js.map +1 -0
  94. package/dist/tools/ambientcg.d.ts +296 -0
  95. package/dist/tools/ambientcg.d.ts.map +1 -0
  96. package/dist/tools/ambientcg.js +183 -0
  97. package/dist/tools/ambientcg.js.map +1 -0
  98. package/dist/tools/audio.d.ts +211 -0
  99. package/dist/tools/audio.d.ts.map +1 -0
  100. package/dist/tools/audio.js +156 -0
  101. package/dist/tools/audio.js.map +1 -0
  102. package/dist/tools/bundle.d.ts +237 -0
  103. package/dist/tools/bundle.d.ts.map +1 -0
  104. package/dist/tools/bundle.js +206 -0
  105. package/dist/tools/bundle.js.map +1 -0
  106. package/dist/tools/direct-download.d.ts +53 -0
  107. package/dist/tools/direct-download.d.ts.map +1 -0
  108. package/dist/tools/direct-download.js +68 -0
  109. package/dist/tools/direct-download.js.map +1 -0
  110. package/dist/tools/download-free-asset.d.ts +66 -0
  111. package/dist/tools/download-free-asset.d.ts.map +1 -0
  112. package/dist/tools/download-free-asset.js +60 -0
  113. package/dist/tools/download-free-asset.js.map +1 -0
  114. package/dist/tools/get-asset.d.ts +161 -0
  115. package/dist/tools/get-asset.d.ts.map +1 -0
  116. package/dist/tools/get-asset.js +131 -0
  117. package/dist/tools/get-asset.js.map +1 -0
  118. package/dist/tools/itch.d.ts +120 -0
  119. package/dist/tools/itch.d.ts.map +1 -0
  120. package/dist/tools/itch.js +120 -0
  121. package/dist/tools/itch.js.map +1 -0
  122. package/dist/tools/list-filters.d.ts +127 -0
  123. package/dist/tools/list-filters.d.ts.map +1 -0
  124. package/dist/tools/list-filters.js +68 -0
  125. package/dist/tools/list-filters.js.map +1 -0
  126. package/dist/tools/list-limited-time-free.d.ts +57 -0
  127. package/dist/tools/list-limited-time-free.d.ts.map +1 -0
  128. package/dist/tools/list-limited-time-free.js +47 -0
  129. package/dist/tools/list-limited-time-free.js.map +1 -0
  130. package/dist/tools/polyhaven.d.ts +266 -0
  131. package/dist/tools/polyhaven.d.ts.map +1 -0
  132. package/dist/tools/polyhaven.js +233 -0
  133. package/dist/tools/polyhaven.js.map +1 -0
  134. package/dist/tools/search-assets.d.ts +176 -0
  135. package/dist/tools/search-assets.d.ts.map +1 -0
  136. package/dist/tools/search-assets.js +172 -0
  137. package/dist/tools/search-assets.js.map +1 -0
  138. package/dist/tools/sketchfab.d.ts +325 -0
  139. package/dist/tools/sketchfab.d.ts.map +1 -0
  140. package/dist/tools/sketchfab.js +203 -0
  141. package/dist/tools/sketchfab.js.map +1 -0
  142. package/dist/tools/smithsonian.d.ts +189 -0
  143. package/dist/tools/smithsonian.d.ts.map +1 -0
  144. package/dist/tools/smithsonian.js +189 -0
  145. package/dist/tools/smithsonian.js.map +1 -0
  146. package/dist/tools/source-directory.d.ts +226 -0
  147. package/dist/tools/source-directory.d.ts.map +1 -0
  148. package/dist/tools/source-directory.js +583 -0
  149. package/dist/tools/source-directory.js.map +1 -0
  150. package/package.json +69 -0
@@ -0,0 +1,228 @@
1
+ import { execFile } from "node:child_process";
2
+ import { mkdtemp, readFile, rm, stat } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { accessSync, constants as fsConstants } from "node:fs";
7
+ import { FabClientError, nullFabLogger } from "./errors.js";
8
+ const execFileAsync = promisify(execFile);
9
+ /**
10
+ * Ordered wrapper preference: newest Chrome first, then Firefox, then the
11
+ * generic curl-impersonate binaries. The first match on PATH wins.
12
+ */
13
+ const KNOWN_WRAPPERS = [
14
+ "curl_chrome146",
15
+ "curl_chrome145",
16
+ "curl_chrome142",
17
+ "curl_chrome136",
18
+ "curl_chrome133a",
19
+ "curl_chrome131",
20
+ "curl_chrome124",
21
+ "curl_chrome123",
22
+ "curl_chrome120",
23
+ "curl_chrome119",
24
+ "curl_chrome116",
25
+ "curl_chrome110",
26
+ "curl_chrome107",
27
+ "curl_chrome104",
28
+ "curl_chrome101",
29
+ "curl_chrome100",
30
+ "curl_chrome99",
31
+ "curl_firefox147",
32
+ "curl_firefox144",
33
+ "curl_firefox135",
34
+ "curl_firefox133",
35
+ "curl-impersonate-chrome",
36
+ "curl-impersonate",
37
+ ];
38
+ function isExecutable(path) {
39
+ try {
40
+ accessSync(path, fsConstants.X_OK);
41
+ return true;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ /**
48
+ * Resolves the curl-impersonate command to use, or undefined when the host
49
+ * has none. `FAB_CURL_IMPERSONATE` accepts an explicit wrapper name/path, or
50
+ * "0"/"off"/"false" to disable impersonation entirely.
51
+ */
52
+ export function resolveImpersonateCommand(environment = process.env) {
53
+ const explicit = environment.FAB_CURL_IMPERSONATE?.trim();
54
+ if (explicit) {
55
+ if (/^(0|off|false)$/i.test(explicit))
56
+ return undefined;
57
+ return explicit;
58
+ }
59
+ const pathValue = environment.PATH ?? "";
60
+ for (const directory of pathValue.split(":")) {
61
+ if (!directory)
62
+ continue;
63
+ for (const wrapper of KNOWN_WRAPPERS) {
64
+ const candidate = join(directory, wrapper);
65
+ if (isExecutable(candidate))
66
+ return candidate;
67
+ }
68
+ }
69
+ return undefined;
70
+ }
71
+ function parseHeaderBlock(raw) {
72
+ // A dump can hold multiple blocks (redirects, HTTP/1.1 100); the last
73
+ // block belongs to the final response.
74
+ const blocks = raw
75
+ .split(/\r?\n\r?\n/)
76
+ .map((block) => block.trim())
77
+ .filter((block) => block.length > 0);
78
+ const last = blocks.at(-1) ?? "";
79
+ const lines = last.split(/\r?\n/);
80
+ const statusLine = lines.shift() ?? "";
81
+ const statusMatch = /(\d{3})/.exec(statusLine);
82
+ const status = statusMatch ? Number(statusMatch[1]) : 0;
83
+ const headers = new Headers();
84
+ for (const line of lines) {
85
+ const separator = line.indexOf(":");
86
+ if (separator <= 0)
87
+ continue;
88
+ const name = line.slice(0, separator).trim();
89
+ const value = line.slice(separator + 1).trim();
90
+ if (name)
91
+ headers.append(name, value);
92
+ }
93
+ return { status, headers };
94
+ }
95
+ export function isChallengeResponse(status, headers) {
96
+ return (status === 403 &&
97
+ (headers.get("cf-mitigated")?.toLowerCase() === "challenge" ||
98
+ (headers.get("content-type") ?? "").toLowerCase().includes("text/html")));
99
+ }
100
+ /**
101
+ * A `fetch`-compatible function backed by a curl-impersonate subprocess so
102
+ * Fab sees a real browser TLS/HTTP fingerprint. Cloudflare challenge 403s
103
+ * are retried with backoff inside the wrapper; the final response (possibly
104
+ * still a challenge) is returned for the caller to classify.
105
+ */
106
+ export function createImpersonateFetch(options) {
107
+ const maxChallengeRetries = options.maxChallengeRetries ?? 3;
108
+ const challengeWaitsMs = options.challengeWaitsMs ?? [5_000, 15_000, 40_000];
109
+ const sleep = options.sleep ??
110
+ ((milliseconds) => new Promise((resolve) => {
111
+ setTimeout(resolve, milliseconds);
112
+ }));
113
+ const random = options.random ?? Math.random;
114
+ const logger = options.logger ?? nullFabLogger;
115
+ const runCommand = options.runCommand ?? execFileAsync;
116
+ const timeoutSeconds = Math.max(1, Math.ceil(options.timeoutMs / 1_000));
117
+ const fetchImpl = (async (input, init) => {
118
+ const url = typeof input === "string"
119
+ ? input
120
+ : input instanceof URL
121
+ ? input.toString()
122
+ : input.url;
123
+ if (init?.method && init.method !== "GET") {
124
+ throw new FabClientError("FAB_INTERNAL", "The impersonated transport only performs anonymous GET reads.");
125
+ }
126
+ for (let challengeAttempt = 0;; challengeAttempt += 1) {
127
+ const scratch = await mkdtemp(join(tmpdir(), "threenative-asset-mcp-fab-curl-"));
128
+ const headersPath = join(scratch, "headers.txt");
129
+ const bodyPath = join(scratch, "body.bin");
130
+ try {
131
+ try {
132
+ await runCommand(options.command, [
133
+ "-sS",
134
+ "-b",
135
+ options.cookieJarPath,
136
+ "-c",
137
+ options.cookieJarPath,
138
+ "-D",
139
+ headersPath,
140
+ "-o",
141
+ bodyPath,
142
+ "--max-time",
143
+ String(timeoutSeconds),
144
+ url,
145
+ ]);
146
+ }
147
+ catch (error) {
148
+ const failure = error;
149
+ // curl exit 28 is a timeout; other non-zero exits still may have
150
+ // written partial header data we must not trust.
151
+ if (failure.code === 28) {
152
+ throw new FabClientError("FAB_TIMEOUT", "Fab did not respond before the request timeout.", true);
153
+ }
154
+ throw new FabClientError("FAB_UPSTREAM_UNAVAILABLE", "Fab could not be reached.", true);
155
+ }
156
+ const { status, headers } = parseHeaderBlock(await readFile(headersPath, "utf8").catch(() => ""));
157
+ if (status === 0) {
158
+ throw new FabClientError("FAB_UPSTREAM_UNAVAILABLE", "Fab could not be reached.", true);
159
+ }
160
+ if (isChallengeResponse(status, headers)) {
161
+ logger.log("debug", "fab_upstream_response", {
162
+ transport: "direct",
163
+ status,
164
+ challenge: true,
165
+ challengeAttempt,
166
+ });
167
+ if (challengeAttempt < maxChallengeRetries) {
168
+ const base = challengeWaitsMs[Math.min(challengeAttempt, challengeWaitsMs.length - 1)] ?? 5_000;
169
+ const jitter = Math.floor(random() * 2_000);
170
+ await sleep(base + jitter);
171
+ continue;
172
+ }
173
+ }
174
+ const body = await readFile(bodyPath);
175
+ return new Response(new Uint8Array(body), { status, headers });
176
+ }
177
+ finally {
178
+ await rm(scratch, { recursive: true, force: true }).catch(() => undefined);
179
+ }
180
+ }
181
+ });
182
+ return fetchImpl;
183
+ }
184
+ /**
185
+ * Streams a validated download URL to disk via curl-impersonate. Aborts when
186
+ * the server announces a body larger than maxBytes (curl exit 63) and
187
+ * re-checks the written size afterwards.
188
+ */
189
+ export async function impersonateDownloadToFile(options) {
190
+ const runCommand = options.runCommand ?? execFileAsync;
191
+ const timeoutSeconds = Math.max(1, Math.ceil(options.timeoutMs / 1_000));
192
+ try {
193
+ await runCommand(options.command, [
194
+ "-sS",
195
+ "-L",
196
+ "-b",
197
+ options.cookieJarPath,
198
+ "-c",
199
+ options.cookieJarPath,
200
+ "-o",
201
+ options.destinationPath,
202
+ "--max-time",
203
+ String(timeoutSeconds),
204
+ "--max-filesize",
205
+ String(options.maxBytes),
206
+ options.url,
207
+ ]);
208
+ }
209
+ catch (error) {
210
+ const failure = error;
211
+ if (failure.code === 63) {
212
+ throw new FabClientError("FAB_DOWNLOAD_TOO_LARGE", "The downloaded file exceeds FAB_MAX_DOWNLOAD_BYTES.");
213
+ }
214
+ if (failure.code === 28) {
215
+ throw new FabClientError("FAB_TIMEOUT", "Fab did not finish the download before the timeout.", true);
216
+ }
217
+ throw new FabClientError("FAB_DOWNLOAD_FAILED", "Fab could not complete the requested file download.", true);
218
+ }
219
+ const metadata = await stat(options.destinationPath);
220
+ if (!metadata.isFile()) {
221
+ throw new FabClientError("FAB_DOWNLOAD_FAILED", "The downloaded file could not be saved safely.", true);
222
+ }
223
+ if (metadata.size > options.maxBytes) {
224
+ throw new FabClientError("FAB_DOWNLOAD_TOO_LARGE", "The downloaded file exceeds FAB_MAX_DOWNLOAD_BYTES.");
225
+ }
226
+ return { sizeBytes: metadata.size };
227
+ }
228
+ //# sourceMappingURL=impersonate-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impersonate-fetch.js","sourceRoot":"","sources":["../../src/fab/impersonate-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AssetOutput } from "../tools/get-asset.js";
2
+ export declare function normalizeListing(raw: unknown, currency: string, transport: "direct" | "browser"): AssetOutput;
3
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/fab/normalize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAmNzD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,SAAS,GAC9B,WAAW,CA6Hb"}
@@ -0,0 +1,285 @@
1
+ import { FabClientError } from "./client.js";
2
+ import { UpstreamListingSchema } from "./schemas.js";
3
+ function record(value) {
4
+ return typeof value === "object" && value !== null && !Array.isArray(value)
5
+ ? value
6
+ : undefined;
7
+ }
8
+ function text(value, maxLength = 500) {
9
+ return typeof value === "string" && value.length > 0
10
+ ? value.slice(0, maxLength)
11
+ : undefined;
12
+ }
13
+ function rawText(value) {
14
+ return typeof value === "string" && value.length > 0 ? value : undefined;
15
+ }
16
+ function number(value) {
17
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
18
+ }
19
+ function firstText(value, ...keys) {
20
+ for (const key of keys) {
21
+ const result = text(value?.[key]);
22
+ if (result)
23
+ return result;
24
+ }
25
+ return undefined;
26
+ }
27
+ function httpsUrl(value) {
28
+ const candidate = text(value, 2_048);
29
+ if (!candidate)
30
+ return undefined;
31
+ try {
32
+ const parsed = new URL(candidate);
33
+ return parsed.protocol === "https:" ? parsed.toString() : undefined;
34
+ }
35
+ catch {
36
+ return undefined;
37
+ }
38
+ }
39
+ function stringValues(value, limit = 100) {
40
+ if (!Array.isArray(value))
41
+ return [];
42
+ return [
43
+ ...new Set(value.flatMap((entry) => {
44
+ if (typeof entry === "string")
45
+ return [entry.slice(0, 200)];
46
+ const item = record(entry);
47
+ const candidate = firstText(item, "slug", "name", "label", "code");
48
+ return candidate ? [candidate] : [];
49
+ })),
50
+ ].slice(0, limit);
51
+ }
52
+ function normalizeNamedValues(value, limit = 100) {
53
+ if (!Array.isArray(value))
54
+ return [];
55
+ return value
56
+ .flatMap((entry) => {
57
+ if (typeof entry === "string")
58
+ return [{ name: entry.slice(0, 200) }];
59
+ const item = record(entry);
60
+ const name = firstText(item, "name", "label", "slug")?.slice(0, 200);
61
+ if (!name)
62
+ return [];
63
+ const slug = firstText(item, "slug", "code")?.slice(0, 200);
64
+ return [{ name, ...(slug ? { slug } : {}) }];
65
+ })
66
+ .slice(0, limit);
67
+ }
68
+ function normalizeMoney(value, fallbackCurrency) {
69
+ const item = record(value);
70
+ if (!item)
71
+ return undefined;
72
+ const effectiveAmount = number(item.effectiveAmount ?? item.discountedAmount ?? item.discountPrice);
73
+ const amount = number(item.amount ?? item.price ?? item.value) ?? effectiveAmount;
74
+ if (amount === undefined)
75
+ return undefined;
76
+ return {
77
+ amount,
78
+ currency: firstText(item, "currency", "currencyCode") ?? fallbackCurrency,
79
+ ...(effectiveAmount === undefined ? {} : { effectiveAmount }),
80
+ };
81
+ }
82
+ function normalizeLicenses(value, fallbackCurrency) {
83
+ if (!Array.isArray(value))
84
+ return [];
85
+ return value
86
+ .flatMap((entry) => {
87
+ const item = record(entry);
88
+ if (!item)
89
+ return [];
90
+ const slug = firstText(item, "slug", "code", "id")?.slice(0, 200);
91
+ const name = firstText(item, "name", "label", "slug")?.slice(0, 200);
92
+ if (!slug || !name)
93
+ return [];
94
+ const baseMoney = normalizeMoney(item.price, fallbackCurrency) ??
95
+ normalizeMoney(item.basePrice, fallbackCurrency) ??
96
+ normalizeMoney(item.pricing, fallbackCurrency);
97
+ const explicitEffective = normalizeMoney(item.discountedPrice, fallbackCurrency) ??
98
+ normalizeMoney(item.effectivePrice, fallbackCurrency) ??
99
+ normalizeMoney(item.salePrice, fallbackCurrency);
100
+ const basePrice = baseMoney
101
+ ? { amount: baseMoney.amount, currency: baseMoney.currency }
102
+ : undefined;
103
+ const effectivePrice = explicitEffective
104
+ ? {
105
+ amount: explicitEffective.effectiveAmount ?? explicitEffective.amount,
106
+ currency: explicitEffective.currency,
107
+ }
108
+ : baseMoney?.effectiveAmount === undefined
109
+ ? undefined
110
+ : {
111
+ amount: baseMoney.effectiveAmount,
112
+ currency: baseMoney.currency,
113
+ };
114
+ const effectiveAmount = effectivePrice?.amount ?? basePrice?.amount ?? Number.NaN;
115
+ return [
116
+ {
117
+ slug,
118
+ name,
119
+ ...(firstText(item, "offerId", "offer_id", "offer")
120
+ ? {
121
+ offerId: firstText(item, "offerId", "offer_id", "offer")?.slice(0, 200),
122
+ }
123
+ : {}),
124
+ ...(basePrice ? { basePrice } : {}),
125
+ ...(effectivePrice ? { effectivePrice } : {}),
126
+ isFree: effectiveAmount === 0,
127
+ },
128
+ ];
129
+ })
130
+ .slice(0, 30);
131
+ }
132
+ function normalizeFiles(value) {
133
+ if (!Array.isArray(value))
134
+ return [];
135
+ return value
136
+ .flatMap((entry) => {
137
+ if (typeof entry === "string") {
138
+ return [{ name: entry.slice(0, 300) }];
139
+ }
140
+ const item = record(entry);
141
+ if (!item)
142
+ return [];
143
+ const name = firstText(item, "name", "filename", "label")?.slice(0, 300);
144
+ const url = httpsUrl(item.url ?? item.downloadUrl);
145
+ const sizeBytes = number(item.sizeBytes ?? item.size);
146
+ const format = firstText(item, "format", "extension", "type")?.slice(0, 100);
147
+ if (!name && !url && sizeBytes === undefined && !format)
148
+ return [];
149
+ return [
150
+ {
151
+ ...(name ? { name } : {}),
152
+ ...(url ? { url } : {}),
153
+ ...(sizeBytes === undefined ? {} : { sizeBytes }),
154
+ ...(format ? { format } : {}),
155
+ },
156
+ ];
157
+ })
158
+ .slice(0, 100);
159
+ }
160
+ function normalizeCompatibility(value) {
161
+ if (!Array.isArray(value))
162
+ return [];
163
+ return value
164
+ .flatMap((entry) => {
165
+ if (typeof entry === "string") {
166
+ return [{ name: entry.slice(0, 200) }];
167
+ }
168
+ const item = record(entry);
169
+ const name = firstText(item, "name", "label", "engine", "platform");
170
+ if (!name)
171
+ return [];
172
+ const version = firstText(item, "version", "engineVersion");
173
+ const platform = firstText(item, "platform", "platformName");
174
+ return [
175
+ {
176
+ name: name.slice(0, 200),
177
+ ...(version ? { version: version.slice(0, 100) } : {}),
178
+ ...(platform ? { platform: platform.slice(0, 100) } : {}),
179
+ },
180
+ ];
181
+ })
182
+ .slice(0, 50);
183
+ }
184
+ export function normalizeListing(raw, currency, transport) {
185
+ const parsed = UpstreamListingSchema.safeParse(raw);
186
+ if (!parsed.success) {
187
+ throw new FabClientError("FAB_UPSTREAM_CHANGED", "Fab's listing response no longer matches the expected contract.");
188
+ }
189
+ const value = parsed.data;
190
+ const id = firstText(value, "uid", "id", "uuid");
191
+ const title = firstText(value, "title", "name").slice(0, 500);
192
+ const descriptionSource = rawText(value.description ?? value.longDescription ?? value.shortDescription) ?? "";
193
+ const descriptionTruncated = descriptionSource.length > 12_000;
194
+ const description = descriptionSource.slice(0, 12_000);
195
+ const seller = record(value.seller ?? value.publisher);
196
+ const sellerName = firstText(seller, "name", "displayName", "username")?.slice(0, 200);
197
+ const categories = normalizeNamedValues(value.categories ?? (value.category ? [value.category] : []), 20);
198
+ const licenses = normalizeLicenses(value.licenses ?? value.offers, currency);
199
+ const rawMedia = Array.isArray(value.media)
200
+ ? value.media
201
+ : Array.isArray(value.images)
202
+ ? value.images
203
+ : [];
204
+ const media = rawMedia
205
+ .flatMap((entry) => {
206
+ if (typeof entry === "string") {
207
+ const url = httpsUrl(entry);
208
+ return url ? [{ type: "image", url }] : [];
209
+ }
210
+ const item = record(entry);
211
+ const url = httpsUrl(item?.url ?? item?.src);
212
+ if (!url)
213
+ return [];
214
+ return [
215
+ {
216
+ type: firstText(item, "type", "mediaType")?.slice(0, 50) ?? "image",
217
+ url,
218
+ ...(httpsUrl(item?.thumbnailUrl)
219
+ ? { thumbnailUrl: httpsUrl(item?.thumbnailUrl) }
220
+ : {}),
221
+ },
222
+ ];
223
+ })
224
+ .slice(0, 50);
225
+ return {
226
+ id,
227
+ title,
228
+ url: `https://www.fab.com/listings/${id}`,
229
+ ...(httpsUrl(value.thumbnailUrl ?? record(value.thumbnail)?.url)
230
+ ? {
231
+ thumbnailUrl: httpsUrl(value.thumbnailUrl ?? record(value.thumbnail)?.url),
232
+ }
233
+ : {}),
234
+ ...(sellerName
235
+ ? {
236
+ publisher: {
237
+ name: sellerName,
238
+ ...(firstText(seller, "uid", "id")
239
+ ? { id: firstText(seller, "uid", "id") }
240
+ : {}),
241
+ },
242
+ }
243
+ : {}),
244
+ ...(description ? { description } : {}),
245
+ descriptionTruncated,
246
+ ...(categories[0] ? { category: categories[0] } : {}),
247
+ breadcrumb: categories,
248
+ tags: normalizeNamedValues(value.tags, 100),
249
+ media,
250
+ formats: stringValues(value.assetFormats ?? value.asset_formats ?? value.formats, 50),
251
+ files: normalizeFiles(value.files),
252
+ compatibility: normalizeCompatibility(value.compatibleApps ??
253
+ value.compatible_apps ??
254
+ value.engineCompatibility ??
255
+ value.platforms),
256
+ licenses,
257
+ freeLicenseSlugs: licenses
258
+ .filter((license) => license.isFree)
259
+ .map((license) => license.slug),
260
+ ...(firstText(value, "firstPublishedAt", "publishedAt")
261
+ ? {
262
+ publishedAt: firstText(value, "firstPublishedAt", "publishedAt"),
263
+ }
264
+ : {}),
265
+ ...(firstText(value, "updatedAt", "publishedAt")
266
+ ? { updatedAt: firstText(value, "updatedAt", "publishedAt") }
267
+ : {}),
268
+ ...(typeof value.hasChangelog === "boolean"
269
+ ? { hasChangelog: value.hasChangelog }
270
+ : {}),
271
+ ...(typeof value.isMature === "boolean"
272
+ ? { isMature: value.isMature }
273
+ : {}),
274
+ ...(typeof value.isAiGenerated === "boolean"
275
+ ? { isAiGenerated: value.isAiGenerated }
276
+ : {}),
277
+ ...(typeof value.isAiForbidden === "boolean"
278
+ ? { allowsAiUse: !value.isAiForbidden }
279
+ : {}),
280
+ transport,
281
+ warnings: [],
282
+ rawContractVersion: "fab-public-2026-07-28",
283
+ };
284
+ }
285
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/fab/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ export declare const UpstreamSearchSchema: z.ZodObject<{
3
+ results: z.ZodArray<z.ZodUnknown>;
4
+ cursors: z.ZodOptional<z.ZodObject<{
5
+ next: z.ZodOptional<z.ZodNullable<z.ZodString>>;
6
+ previous: z.ZodOptional<z.ZodNullable<z.ZodString>>;
7
+ }, z.core.$loose>>;
8
+ }, z.core.$loose>;
9
+ export declare const UpstreamListingSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
10
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/fab/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB;;;;;;iBAWjB,CAAC;AAEjB,eAAO,MAAM,qBAAqB,wCAgG9B,CAAC"}