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.
- package/README.md +441 -0
- package/dist/ambientcg/client.d.ts +61 -0
- package/dist/ambientcg/client.d.ts.map +1 -0
- package/dist/ambientcg/client.js +234 -0
- package/dist/ambientcg/client.js.map +1 -0
- package/dist/audio/catalog.d.ts +36 -0
- package/dist/audio/catalog.d.ts.map +1 -0
- package/dist/audio/catalog.js +169 -0
- package/dist/audio/catalog.js.map +1 -0
- package/dist/audio/client.d.ts +46 -0
- package/dist/audio/client.d.ts.map +1 -0
- package/dist/audio/client.js +196 -0
- package/dist/audio/client.js.map +1 -0
- package/dist/bundle/client.d.ts +89 -0
- package/dist/bundle/client.d.ts.map +1 -0
- package/dist/bundle/client.js +324 -0
- package/dist/bundle/client.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +130 -0
- package/dist/config.js.map +1 -0
- package/dist/download/direct-asset-downloader.d.ts +41 -0
- package/dist/download/direct-asset-downloader.d.ts.map +1 -0
- package/dist/download/direct-asset-downloader.js +232 -0
- package/dist/download/direct-asset-downloader.js.map +1 -0
- package/dist/fab/api-download.d.ts +30 -0
- package/dist/fab/api-download.d.ts.map +1 -0
- package/dist/fab/api-download.js +200 -0
- package/dist/fab/api-download.js.map +1 -0
- package/dist/fab/browser-transport.d.ts +79 -0
- package/dist/fab/browser-transport.d.ts.map +1 -0
- package/dist/fab/browser-transport.js +492 -0
- package/dist/fab/browser-transport.js.map +1 -0
- package/dist/fab/cache.d.ts +22 -0
- package/dist/fab/cache.d.ts.map +1 -0
- package/dist/fab/cache.js +55 -0
- package/dist/fab/cache.js.map +1 -0
- package/dist/fab/client.d.ts +61 -0
- package/dist/fab/client.d.ts.map +1 -0
- package/dist/fab/client.js +868 -0
- package/dist/fab/client.js.map +1 -0
- package/dist/fab/direct-transport.d.ts +68 -0
- package/dist/fab/direct-transport.d.ts.map +1 -0
- package/dist/fab/direct-transport.js +184 -0
- package/dist/fab/direct-transport.js.map +1 -0
- package/dist/fab/download-store.d.ts +21 -0
- package/dist/fab/download-store.d.ts.map +1 -0
- package/dist/fab/download-store.js +93 -0
- package/dist/fab/download-store.js.map +1 -0
- package/dist/fab/errors.d.ts +20 -0
- package/dist/fab/errors.d.ts.map +1 -0
- package/dist/fab/errors.js +65 -0
- package/dist/fab/errors.js.map +1 -0
- package/dist/fab/impersonate-fetch.d.ts +48 -0
- package/dist/fab/impersonate-fetch.d.ts.map +1 -0
- package/dist/fab/impersonate-fetch.js +228 -0
- package/dist/fab/impersonate-fetch.js.map +1 -0
- package/dist/fab/normalize.d.ts +3 -0
- package/dist/fab/normalize.d.ts.map +1 -0
- package/dist/fab/normalize.js +285 -0
- package/dist/fab/normalize.js.map +1 -0
- package/dist/fab/schemas.d.ts +10 -0
- package/dist/fab/schemas.d.ts.map +1 -0
- package/dist/fab/schemas.js +105 -0
- package/dist/fab/schemas.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/itch/catalog.d.ts +13 -0
- package/dist/itch/catalog.d.ts.map +1 -0
- package/dist/itch/catalog.js +50 -0
- package/dist/itch/catalog.js.map +1 -0
- package/dist/itch/client.d.ts +46 -0
- package/dist/itch/client.d.ts.map +1 -0
- package/dist/itch/client.js +175 -0
- package/dist/itch/client.js.map +1 -0
- package/dist/polyhaven/client.d.ts +55 -0
- package/dist/polyhaven/client.d.ts.map +1 -0
- package/dist/polyhaven/client.js +210 -0
- package/dist/polyhaven/client.js.map +1 -0
- package/dist/server.d.ts +25 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +448 -0
- package/dist/server.js.map +1 -0
- package/dist/sketchfab/client.d.ts +70 -0
- package/dist/sketchfab/client.d.ts.map +1 -0
- package/dist/sketchfab/client.js +255 -0
- package/dist/sketchfab/client.js.map +1 -0
- package/dist/smithsonian/client.d.ts +32 -0
- package/dist/smithsonian/client.d.ts.map +1 -0
- package/dist/smithsonian/client.js +142 -0
- package/dist/smithsonian/client.js.map +1 -0
- package/dist/tools/ambientcg.d.ts +296 -0
- package/dist/tools/ambientcg.d.ts.map +1 -0
- package/dist/tools/ambientcg.js +183 -0
- package/dist/tools/ambientcg.js.map +1 -0
- package/dist/tools/audio.d.ts +211 -0
- package/dist/tools/audio.d.ts.map +1 -0
- package/dist/tools/audio.js +156 -0
- package/dist/tools/audio.js.map +1 -0
- package/dist/tools/bundle.d.ts +237 -0
- package/dist/tools/bundle.d.ts.map +1 -0
- package/dist/tools/bundle.js +206 -0
- package/dist/tools/bundle.js.map +1 -0
- package/dist/tools/direct-download.d.ts +53 -0
- package/dist/tools/direct-download.d.ts.map +1 -0
- package/dist/tools/direct-download.js +68 -0
- package/dist/tools/direct-download.js.map +1 -0
- package/dist/tools/download-free-asset.d.ts +66 -0
- package/dist/tools/download-free-asset.d.ts.map +1 -0
- package/dist/tools/download-free-asset.js +60 -0
- package/dist/tools/download-free-asset.js.map +1 -0
- package/dist/tools/get-asset.d.ts +161 -0
- package/dist/tools/get-asset.d.ts.map +1 -0
- package/dist/tools/get-asset.js +131 -0
- package/dist/tools/get-asset.js.map +1 -0
- package/dist/tools/itch.d.ts +120 -0
- package/dist/tools/itch.d.ts.map +1 -0
- package/dist/tools/itch.js +120 -0
- package/dist/tools/itch.js.map +1 -0
- package/dist/tools/list-filters.d.ts +127 -0
- package/dist/tools/list-filters.d.ts.map +1 -0
- package/dist/tools/list-filters.js +68 -0
- package/dist/tools/list-filters.js.map +1 -0
- package/dist/tools/list-limited-time-free.d.ts +57 -0
- package/dist/tools/list-limited-time-free.d.ts.map +1 -0
- package/dist/tools/list-limited-time-free.js +47 -0
- package/dist/tools/list-limited-time-free.js.map +1 -0
- package/dist/tools/polyhaven.d.ts +266 -0
- package/dist/tools/polyhaven.d.ts.map +1 -0
- package/dist/tools/polyhaven.js +233 -0
- package/dist/tools/polyhaven.js.map +1 -0
- package/dist/tools/search-assets.d.ts +176 -0
- package/dist/tools/search-assets.d.ts.map +1 -0
- package/dist/tools/search-assets.js +172 -0
- package/dist/tools/search-assets.js.map +1 -0
- package/dist/tools/sketchfab.d.ts +325 -0
- package/dist/tools/sketchfab.d.ts.map +1 -0
- package/dist/tools/sketchfab.js +203 -0
- package/dist/tools/sketchfab.js.map +1 -0
- package/dist/tools/smithsonian.d.ts +189 -0
- package/dist/tools/smithsonian.d.ts.map +1 -0
- package/dist/tools/smithsonian.js +189 -0
- package/dist/tools/smithsonian.js.map +1 -0
- package/dist/tools/source-directory.d.ts +226 -0
- package/dist/tools/source-directory.d.ts.map +1 -0
- package/dist/tools/source-directory.js +583 -0
- package/dist/tools/source-directory.js.map +1 -0
- package/package.json +69 -0
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface FabConfig {
|
|
2
|
+
directTimeoutMs: number;
|
|
3
|
+
browserTimeoutMs: number;
|
|
4
|
+
browserManualTimeoutMs: number;
|
|
5
|
+
browserHeadless: boolean;
|
|
6
|
+
browserProfileDir: string;
|
|
7
|
+
downloadDir: string;
|
|
8
|
+
maxDownloadBytes: number;
|
|
9
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
10
|
+
logQueries: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Explicit curl-impersonate wrapper override; "0"/"off"/"false" disables
|
|
13
|
+
* impersonation. Resolution against PATH happens in the client.
|
|
14
|
+
*/
|
|
15
|
+
curlImpersonate?: string;
|
|
16
|
+
minRequestIntervalMs: number;
|
|
17
|
+
downloadTimeoutMs: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function loadFabConfig(environment?: NodeJS.ProcessEnv): FabConfig;
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAyDA,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,UAAU,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAwDD,wBAAgB,aAAa,CAC3B,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,SAAS,CAgDX"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
const BooleanEnvironmentValue = z
|
|
6
|
+
.enum(["0", "1", "false", "true"])
|
|
7
|
+
.transform((value) => value === "1" || value === "true");
|
|
8
|
+
const EnvironmentSchema = z.object({
|
|
9
|
+
FAB_DIRECT_TIMEOUT_MS: z.coerce.number().int().min(1_000).max(120_000).default(20_000),
|
|
10
|
+
FAB_BROWSER_TIMEOUT_MS: z.coerce
|
|
11
|
+
.number()
|
|
12
|
+
.int()
|
|
13
|
+
.min(1_000)
|
|
14
|
+
.max(180_000)
|
|
15
|
+
.default(30_000),
|
|
16
|
+
FAB_BROWSER_MANUAL_TIMEOUT_MS: z.coerce
|
|
17
|
+
.number()
|
|
18
|
+
.int()
|
|
19
|
+
.min(1_000)
|
|
20
|
+
.max(120_000)
|
|
21
|
+
.default(10_000),
|
|
22
|
+
FAB_BROWSER_HEADLESS: BooleanEnvironmentValue.default(true),
|
|
23
|
+
FAB_BROWSER_PROFILE_DIR: z.string().trim().min(1).optional(),
|
|
24
|
+
FAB_DOWNLOAD_DIR: z.string().trim().min(1).optional(),
|
|
25
|
+
FAB_MAX_DOWNLOAD_BYTES: z.coerce
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.min(1_048_576)
|
|
29
|
+
.max(21_474_836_480)
|
|
30
|
+
.default(2_147_483_648),
|
|
31
|
+
FAB_LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("warn"),
|
|
32
|
+
FAB_LOG_QUERIES: BooleanEnvironmentValue.default(false),
|
|
33
|
+
FAB_CURL_IMPERSONATE: z.string().trim().min(1).optional(),
|
|
34
|
+
FAB_MIN_REQUEST_INTERVAL_MS: z.coerce
|
|
35
|
+
.number()
|
|
36
|
+
.int()
|
|
37
|
+
.min(0)
|
|
38
|
+
.max(10_000)
|
|
39
|
+
.default(1_000),
|
|
40
|
+
FAB_DOWNLOAD_TIMEOUT_MS: z.coerce
|
|
41
|
+
.number()
|
|
42
|
+
.int()
|
|
43
|
+
.min(10_000)
|
|
44
|
+
.max(3_600_000)
|
|
45
|
+
.default(600_000),
|
|
46
|
+
});
|
|
47
|
+
function isInside(path, parent) {
|
|
48
|
+
const child = relative(parent, path);
|
|
49
|
+
return child === "" || (!child.startsWith("..") && !isAbsolute(child));
|
|
50
|
+
}
|
|
51
|
+
function canonicalPath(input) {
|
|
52
|
+
let candidate = resolve(input);
|
|
53
|
+
const missingSegments = [];
|
|
54
|
+
while (true) {
|
|
55
|
+
try {
|
|
56
|
+
return resolve(realpathSync.native(candidate), ...missingSegments);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
const parent = dirname(candidate);
|
|
60
|
+
if (parent === candidate)
|
|
61
|
+
return resolve(input);
|
|
62
|
+
missingSegments.unshift(basename(candidate));
|
|
63
|
+
candidate = parent;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function normalBrowserProfileRoots(environment) {
|
|
68
|
+
const userHome = homedir();
|
|
69
|
+
if (process.platform === "darwin") {
|
|
70
|
+
return [
|
|
71
|
+
join(userHome, "Library", "Application Support", "Google", "Chrome"),
|
|
72
|
+
join(userHome, "Library", "Application Support", "Google", "Chrome Beta"),
|
|
73
|
+
join(userHome, "Library", "Application Support", "Google", "Chrome Canary"),
|
|
74
|
+
join(userHome, "Library", "Application Support", "Chromium"),
|
|
75
|
+
join(userHome, "Library", "Application Support", "Microsoft Edge"),
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
if (process.platform === "win32") {
|
|
79
|
+
const localData = environment.LOCALAPPDATA?.trim();
|
|
80
|
+
return localData
|
|
81
|
+
? [
|
|
82
|
+
join(localData, "Google", "Chrome", "User Data"),
|
|
83
|
+
join(localData, "Google", "Chrome Beta", "User Data"),
|
|
84
|
+
join(localData, "Google", "Chrome SxS", "User Data"),
|
|
85
|
+
join(localData, "Chromium", "User Data"),
|
|
86
|
+
join(localData, "Microsoft", "Edge", "User Data"),
|
|
87
|
+
]
|
|
88
|
+
: [];
|
|
89
|
+
}
|
|
90
|
+
return [
|
|
91
|
+
join(userHome, ".config", "google-chrome"),
|
|
92
|
+
join(userHome, ".config", "google-chrome-beta"),
|
|
93
|
+
join(userHome, ".config", "google-chrome-unstable"),
|
|
94
|
+
join(userHome, ".config", "chromium"),
|
|
95
|
+
join(userHome, ".config", "microsoft-edge"),
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
export function loadFabConfig(environment = process.env) {
|
|
99
|
+
const parsed = EnvironmentSchema.parse(environment);
|
|
100
|
+
const stateRoot = environment.XDG_STATE_HOME?.trim() ||
|
|
101
|
+
join(homedir(), ".local", "state");
|
|
102
|
+
const browserProfileDir = canonicalPath(parsed.FAB_BROWSER_PROFILE_DIR ??
|
|
103
|
+
join(stateRoot, "threenative-asset-mcp", "fab-browser-profile"));
|
|
104
|
+
if (normalBrowserProfileRoots(environment).some((root) => isInside(browserProfileDir, canonicalPath(root)))) {
|
|
105
|
+
throw new Error("FAB_BROWSER_PROFILE_DIR must be an MCP-owned directory, not a normal browser profile.");
|
|
106
|
+
}
|
|
107
|
+
const downloadDir = canonicalPath(parsed.FAB_DOWNLOAD_DIR ??
|
|
108
|
+
join(homedir(), "Downloads", "threenative-asset-mcp", "fab"));
|
|
109
|
+
if (downloadDir === canonicalPath(homedir()) ||
|
|
110
|
+
dirname(downloadDir) === downloadDir) {
|
|
111
|
+
throw new Error("FAB_DOWNLOAD_DIR must be a dedicated asset directory, not a filesystem or home root.");
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
directTimeoutMs: parsed.FAB_DIRECT_TIMEOUT_MS,
|
|
115
|
+
browserTimeoutMs: parsed.FAB_BROWSER_TIMEOUT_MS,
|
|
116
|
+
browserManualTimeoutMs: parsed.FAB_BROWSER_MANUAL_TIMEOUT_MS,
|
|
117
|
+
browserHeadless: parsed.FAB_BROWSER_HEADLESS,
|
|
118
|
+
browserProfileDir,
|
|
119
|
+
downloadDir,
|
|
120
|
+
maxDownloadBytes: parsed.FAB_MAX_DOWNLOAD_BYTES,
|
|
121
|
+
logLevel: parsed.FAB_LOG_LEVEL,
|
|
122
|
+
logQueries: parsed.FAB_LOG_QUERIES,
|
|
123
|
+
...(parsed.FAB_CURL_IMPERSONATE
|
|
124
|
+
? { curlImpersonate: parsed.FAB_CURL_IMPERSONATE }
|
|
125
|
+
: {}),
|
|
126
|
+
minRequestIntervalMs: parsed.FAB_MIN_REQUEST_INTERVAL_MS,
|
|
127
|
+
downloadTimeoutMs: parsed.FAB_DOWNLOAD_TIMEOUT_MS,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type DirectAssetProvider = "polyhaven" | "ambientcg" | "smithsonian" | "game-icons" | "kenney" | "itch";
|
|
2
|
+
export type DirectAssetDownloadErrorCode = "ASSET_DOWNLOAD_URL_REJECTED" | "ASSET_DOWNLOAD_TOO_LARGE" | "ASSET_DOWNLOAD_UPSTREAM_DENIED" | "ASSET_DOWNLOAD_FAILED";
|
|
3
|
+
export declare class DirectAssetDownloadError extends Error {
|
|
4
|
+
readonly code: DirectAssetDownloadErrorCode;
|
|
5
|
+
readonly retryable: boolean;
|
|
6
|
+
constructor(code: DirectAssetDownloadErrorCode, message: string, retryable?: boolean);
|
|
7
|
+
}
|
|
8
|
+
export interface DirectAssetDownloadResult {
|
|
9
|
+
provider: DirectAssetProvider;
|
|
10
|
+
fileName: string;
|
|
11
|
+
path: string;
|
|
12
|
+
sizeBytes: number;
|
|
13
|
+
sha256: string;
|
|
14
|
+
alreadyExisted: boolean;
|
|
15
|
+
sourceUrl: string;
|
|
16
|
+
licenseAcknowledged: true;
|
|
17
|
+
}
|
|
18
|
+
export interface DirectAssetDownloaderOptions {
|
|
19
|
+
fetch?: typeof globalThis.fetch;
|
|
20
|
+
downloadDir?: string;
|
|
21
|
+
maxDownloadBytes?: number;
|
|
22
|
+
downloadTimeoutMs?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class DirectAssetDownloader {
|
|
25
|
+
private readonly fetch;
|
|
26
|
+
private readonly downloadDir;
|
|
27
|
+
private readonly maxDownloadBytes;
|
|
28
|
+
private readonly downloadTimeoutMs;
|
|
29
|
+
constructor(options?: DirectAssetDownloaderOptions);
|
|
30
|
+
download(input: {
|
|
31
|
+
provider: DirectAssetProvider;
|
|
32
|
+
url: string;
|
|
33
|
+
fileName: string;
|
|
34
|
+
identity?: string;
|
|
35
|
+
reportedSourceUrl?: string;
|
|
36
|
+
}): Promise<DirectAssetDownloadResult>;
|
|
37
|
+
private ensureDirectory;
|
|
38
|
+
private fetchDownload;
|
|
39
|
+
private result;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=direct-asset-downloader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-asset-downloader.d.ts","sourceRoot":"","sources":["../../src/download/direct-asset-downloader.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,mBAAmB,GAC3B,WAAW,GACX,WAAW,GACX,aAAa,GACb,YAAY,GACZ,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,MAAM,4BAA4B,GACpC,6BAA6B,GAC7B,0BAA0B,GAC1B,gCAAgC,GAChC,uBAAuB,CAAC;AAE5B,qBAAa,wBAAyB,SAAQ,KAAK;aAE/B,IAAI,EAAE,4BAA4B;aAElC,SAAS;IAH3B,YACkB,IAAI,EAAE,4BAA4B,EAClD,OAAO,EAAE,MAAM,EACC,SAAS,UAAQ,EAIlC;CACF;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAgHD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAE3C,YAAY,OAAO,GAAE,4BAAiC,EAqBrD;IAEK,QAAQ,CAAC,KAAK,EAAE;QACpB,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAiHrC;YAEa,eAAe;YAKf,aAAa;IAgD3B,OAAO,CAAC,MAAM;CAoBf"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { createReadStream } from "node:fs";
|
|
3
|
+
import { link, lstat, mkdir, open, realpath, stat, unlink, } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { basename, isAbsolute, join, relative, resolve } from "node:path";
|
|
6
|
+
export class DirectAssetDownloadError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
retryable;
|
|
9
|
+
constructor(code, message, retryable = false) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.retryable = retryable;
|
|
13
|
+
this.name = "DirectAssetDownloadError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const PROVIDER_HOSTS = {
|
|
17
|
+
polyhaven: new Set(["dl.polyhaven.org"]),
|
|
18
|
+
ambientcg: new Set([
|
|
19
|
+
"ambientcg.com",
|
|
20
|
+
"acg-download.struffelproductions.com",
|
|
21
|
+
]),
|
|
22
|
+
smithsonian: new Set(["3d-api.si.edu"]),
|
|
23
|
+
"game-icons": new Set(["game-icons.net"]),
|
|
24
|
+
kenney: new Set(["kenney.nl"]),
|
|
25
|
+
itch: new Set(),
|
|
26
|
+
};
|
|
27
|
+
function isAllowedProviderHost(provider, hostname) {
|
|
28
|
+
if (provider === "itch") {
|
|
29
|
+
return /^itchio-mirror\.[0-9a-f]+\.r2\.cloudflarestorage\.com$/i.test(hostname);
|
|
30
|
+
}
|
|
31
|
+
return PROVIDER_HOSTS[provider].has(hostname);
|
|
32
|
+
}
|
|
33
|
+
function validateInitialUrl(provider, url) {
|
|
34
|
+
if (url.protocol !== "https:" || !isAllowedProviderHost(provider, url.hostname)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (provider === "ambientcg") {
|
|
38
|
+
return url.hostname === "ambientcg.com" && url.pathname === "/get" && url.searchParams.has("file");
|
|
39
|
+
}
|
|
40
|
+
if (provider === "smithsonian") {
|
|
41
|
+
return url.hostname === "3d-api.si.edu" && url.pathname.startsWith("/content/document/3d_package:");
|
|
42
|
+
}
|
|
43
|
+
if (provider === "game-icons") {
|
|
44
|
+
return (url.hostname === "game-icons.net" &&
|
|
45
|
+
/^\/archives\/[0-9a-f]{6}\/(?:[0-9a-f]{6}|transparent)\/game-icons\.net\.(?:svg|png)\.zip$/i.test(url.pathname));
|
|
46
|
+
}
|
|
47
|
+
if (provider === "kenney") {
|
|
48
|
+
return /^\/media\/pages\/assets\/[a-z0-9-]+\/[a-z0-9-]+\/kenney_[a-z0-9_.-]+\.zip$/i.test(url.pathname);
|
|
49
|
+
}
|
|
50
|
+
if (provider === "itch") {
|
|
51
|
+
return (/^\/upload2\/game\/\d+\/\d+$/.test(url.pathname) &&
|
|
52
|
+
url.searchParams.has("X-Amz-Signature"));
|
|
53
|
+
}
|
|
54
|
+
return url.hostname === "dl.polyhaven.org";
|
|
55
|
+
}
|
|
56
|
+
function safeFileName(input) {
|
|
57
|
+
const leaf = basename(input).slice(0, 220);
|
|
58
|
+
const safe = leaf.replace(/[^A-Za-z0-9._ -]/g, "_").trim();
|
|
59
|
+
if (!safe || safe === "." || safe === "..") {
|
|
60
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_FAILED", "The requested filename is unsafe.");
|
|
61
|
+
}
|
|
62
|
+
return safe;
|
|
63
|
+
}
|
|
64
|
+
function isInside(path, parent) {
|
|
65
|
+
const child = relative(parent, path);
|
|
66
|
+
return child === "" || (!child.startsWith("..") && !isAbsolute(child));
|
|
67
|
+
}
|
|
68
|
+
async function sha256File(path) {
|
|
69
|
+
const hash = createHash("sha256");
|
|
70
|
+
await new Promise((resolveHash, reject) => {
|
|
71
|
+
const stream = createReadStream(path);
|
|
72
|
+
stream.on("data", (chunk) => hash.update(chunk));
|
|
73
|
+
stream.on("error", reject);
|
|
74
|
+
stream.on("end", resolveHash);
|
|
75
|
+
});
|
|
76
|
+
return hash.digest("hex");
|
|
77
|
+
}
|
|
78
|
+
async function writeAll(file, value) {
|
|
79
|
+
let offset = 0;
|
|
80
|
+
while (offset < value.byteLength) {
|
|
81
|
+
const { bytesWritten } = await file.write(value, offset, value.byteLength - offset, null);
|
|
82
|
+
if (bytesWritten <= 0)
|
|
83
|
+
throw new Error("Asset file write made no progress.");
|
|
84
|
+
offset += bytesWritten;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function positiveIntegerEnvironment(value, fallback, maximum) {
|
|
88
|
+
if (!value)
|
|
89
|
+
return fallback;
|
|
90
|
+
const parsed = Number(value);
|
|
91
|
+
return Number.isSafeInteger(parsed) && parsed > 0 && parsed <= maximum
|
|
92
|
+
? parsed
|
|
93
|
+
: fallback;
|
|
94
|
+
}
|
|
95
|
+
export class DirectAssetDownloader {
|
|
96
|
+
fetch;
|
|
97
|
+
downloadDir;
|
|
98
|
+
maxDownloadBytes;
|
|
99
|
+
downloadTimeoutMs;
|
|
100
|
+
constructor(options = {}) {
|
|
101
|
+
this.fetch = options.fetch ?? globalThis.fetch;
|
|
102
|
+
this.downloadDir = resolve(options.downloadDir ??
|
|
103
|
+
process.env.ASSET_DOWNLOAD_DIR ??
|
|
104
|
+
join(homedir(), "Downloads", "threenative-asset-mcp", "assets"));
|
|
105
|
+
this.maxDownloadBytes =
|
|
106
|
+
options.maxDownloadBytes ??
|
|
107
|
+
positiveIntegerEnvironment(process.env.ASSET_MAX_DOWNLOAD_BYTES, 10_737_418_240, 53_687_091_200);
|
|
108
|
+
this.downloadTimeoutMs =
|
|
109
|
+
options.downloadTimeoutMs ??
|
|
110
|
+
positiveIntegerEnvironment(process.env.ASSET_DOWNLOAD_TIMEOUT_MS, 1_800_000, 7_200_000);
|
|
111
|
+
}
|
|
112
|
+
async download(input) {
|
|
113
|
+
let initial;
|
|
114
|
+
try {
|
|
115
|
+
initial = new URL(input.url);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_URL_REJECTED", "The provider download URL is invalid.");
|
|
119
|
+
}
|
|
120
|
+
if (!validateInitialUrl(input.provider, initial)) {
|
|
121
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_URL_REJECTED", "The URL does not match the selected provider's official download contract.");
|
|
122
|
+
}
|
|
123
|
+
const fileName = safeFileName(input.fileName);
|
|
124
|
+
const root = await this.ensureDirectory(this.downloadDir);
|
|
125
|
+
const sourceKey = createHash("sha256")
|
|
126
|
+
.update(input.identity ?? initial.toString())
|
|
127
|
+
.digest("hex");
|
|
128
|
+
const directory = await this.ensureDirectory(join(root, input.provider, sourceKey));
|
|
129
|
+
if (!isInside(directory, root)) {
|
|
130
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_FAILED", "Refused a path outside the configured asset directory.");
|
|
131
|
+
}
|
|
132
|
+
const outputPath = join(directory, fileName);
|
|
133
|
+
const existing = await lstat(outputPath).catch(() => undefined);
|
|
134
|
+
if (existing) {
|
|
135
|
+
if (!existing.isFile() || existing.isSymbolicLink()) {
|
|
136
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_FAILED", "The destination is not a safe regular file.");
|
|
137
|
+
}
|
|
138
|
+
const metadata = await stat(outputPath);
|
|
139
|
+
return this.result(input.provider, input.reportedSourceUrl ?? initial.toString(), fileName, outputPath, metadata.size, await sha256File(outputPath), true);
|
|
140
|
+
}
|
|
141
|
+
const temporaryPath = join(directory, `.${fileName}.${randomUUID()}.part`);
|
|
142
|
+
try {
|
|
143
|
+
const response = await this.fetchDownload(input.provider, initial);
|
|
144
|
+
const declaredLength = Number(response.headers.get("content-length"));
|
|
145
|
+
if (Number.isFinite(declaredLength) && declaredLength > this.maxDownloadBytes) {
|
|
146
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_TOO_LARGE", "The asset exceeds ASSET_MAX_DOWNLOAD_BYTES.");
|
|
147
|
+
}
|
|
148
|
+
if (!response.body) {
|
|
149
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_FAILED", "The provider returned an empty response body.", true);
|
|
150
|
+
}
|
|
151
|
+
const file = await open(temporaryPath, "wx", 0o600);
|
|
152
|
+
const hash = createHash("sha256");
|
|
153
|
+
let sizeBytes = 0;
|
|
154
|
+
try {
|
|
155
|
+
const reader = response.body.getReader();
|
|
156
|
+
while (true) {
|
|
157
|
+
const { done, value } = await reader.read();
|
|
158
|
+
if (done)
|
|
159
|
+
break;
|
|
160
|
+
sizeBytes += value.byteLength;
|
|
161
|
+
if (sizeBytes > this.maxDownloadBytes) {
|
|
162
|
+
await reader.cancel();
|
|
163
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_TOO_LARGE", "The asset exceeds ASSET_MAX_DOWNLOAD_BYTES.");
|
|
164
|
+
}
|
|
165
|
+
hash.update(value);
|
|
166
|
+
await writeAll(file, value);
|
|
167
|
+
}
|
|
168
|
+
await file.sync();
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
await file.close();
|
|
172
|
+
}
|
|
173
|
+
await link(temporaryPath, outputPath);
|
|
174
|
+
return this.result(input.provider, input.reportedSourceUrl ?? initial.toString(), fileName, outputPath, sizeBytes, hash.digest("hex"), false);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (error instanceof DirectAssetDownloadError)
|
|
178
|
+
throw error;
|
|
179
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_FAILED", "The asset could not be downloaded or saved safely.", true);
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
await unlink(temporaryPath).catch(() => undefined);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async ensureDirectory(path) {
|
|
186
|
+
await mkdir(path, { recursive: true, mode: 0o700 });
|
|
187
|
+
return realpath(path);
|
|
188
|
+
}
|
|
189
|
+
async fetchDownload(provider, initial) {
|
|
190
|
+
let current = initial;
|
|
191
|
+
for (let redirects = 0; redirects <= 5; redirects += 1) {
|
|
192
|
+
if (current.protocol !== "https:" ||
|
|
193
|
+
!isAllowedProviderHost(provider, current.hostname)) {
|
|
194
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_URL_REJECTED", "The provider redirected outside its official download-host allowlist.");
|
|
195
|
+
}
|
|
196
|
+
const response = await this.fetch(current, {
|
|
197
|
+
redirect: "manual",
|
|
198
|
+
signal: AbortSignal.timeout(this.downloadTimeoutMs),
|
|
199
|
+
headers: { "user-agent": "threenative-asset-mcp/0.4.0" },
|
|
200
|
+
});
|
|
201
|
+
if ([301, 302, 303, 307, 308].includes(response.status)) {
|
|
202
|
+
const location = response.headers.get("location");
|
|
203
|
+
if (!location)
|
|
204
|
+
break;
|
|
205
|
+
current = new URL(location, current);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if (!response.ok) {
|
|
209
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_UPSTREAM_DENIED", `The provider refused the download with HTTP ${response.status}.`, response.status === 429 || response.status >= 500);
|
|
210
|
+
}
|
|
211
|
+
const contentType = response.headers.get("content-type")?.toLocaleLowerCase();
|
|
212
|
+
if (contentType?.includes("text/html")) {
|
|
213
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_UPSTREAM_DENIED", "The provider returned HTML instead of an asset file.");
|
|
214
|
+
}
|
|
215
|
+
return response;
|
|
216
|
+
}
|
|
217
|
+
throw new DirectAssetDownloadError("ASSET_DOWNLOAD_URL_REJECTED", "The provider exceeded the redirect limit.");
|
|
218
|
+
}
|
|
219
|
+
result(provider, sourceUrl, fileName, path, sizeBytes, sha256, alreadyExisted) {
|
|
220
|
+
return {
|
|
221
|
+
provider,
|
|
222
|
+
fileName,
|
|
223
|
+
path,
|
|
224
|
+
sizeBytes,
|
|
225
|
+
sha256,
|
|
226
|
+
alreadyExisted,
|
|
227
|
+
sourceUrl,
|
|
228
|
+
licenseAcknowledged: true,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=direct-asset-downloader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-asset-downloader.js","sourceRoot":"","sources":["../../src/download/direct-asset-downloader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { assertAllowedFabApiUrl, type FabDownloadRequest, type FabDownloadResult } from "./direct-transport.js";
|
|
2
|
+
import { type FabLogger } from "./errors.js";
|
|
3
|
+
export interface ApiDownloadOptions {
|
|
4
|
+
request: FabDownloadRequest;
|
|
5
|
+
/** Allow-listed anonymous JSON read (direct transport). */
|
|
6
|
+
fetchJson: (url: URL) => Promise<unknown>;
|
|
7
|
+
/** Streams a validated download URL to the given path. */
|
|
8
|
+
downloader: (url: URL, destinationPath: string) => Promise<void>;
|
|
9
|
+
downloadDir: string;
|
|
10
|
+
maxBytes: number;
|
|
11
|
+
logger?: FabLogger;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolves a free listing's file through Fab's anonymous JSON contract and
|
|
15
|
+
* stores it. Throws FAB_CHALLENGE (via fetchJson) so the caller can fall
|
|
16
|
+
* back to the browser click flow.
|
|
17
|
+
*/
|
|
18
|
+
export declare function downloadFreeAssetViaApi(options: ApiDownloadOptions): Promise<FabDownloadResult>;
|
|
19
|
+
export interface NodeDownloadOptions {
|
|
20
|
+
timeoutMs: number;
|
|
21
|
+
maxBytes: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Fallback CDN downloader for hosts without curl-impersonate. Signed
|
|
25
|
+
* distribution URLs are self-authorizing, so a plain TLS client is
|
|
26
|
+
* acceptable for this hop.
|
|
27
|
+
*/
|
|
28
|
+
export declare function nodeDownloadToFile(url: URL, destinationPath: string, options: NodeDownloadOptions): Promise<void>;
|
|
29
|
+
export { assertAllowedFabApiUrl };
|
|
30
|
+
//# sourceMappingURL=api-download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-download.d.ts","sourceRoot":"","sources":["../../src/fab/api-download.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,sBAAsB,EAItB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAqB5D,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,2DAA2D;IAC3D,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,0DAA0D;IAC1D,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AA6GD;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAuF5B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,EACR,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|