threenative-asset-mcp 0.4.0 → 0.6.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/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +98 -0
- package/dist/cli.js.map +1 -0
- package/dist/fab/fabcli.d.ts +75 -0
- package/dist/fab/fabcli.d.ts.map +1 -0
- package/dist/fab/fabcli.js +282 -0
- package/dist/fab/fabcli.js.map +1 -0
- package/dist/fab/license.d.ts +21 -0
- package/dist/fab/license.d.ts.map +1 -0
- package/dist/fab/license.js +59 -0
- package/dist/fab/license.js.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +38 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/get-asset.d.ts +1 -1
- package/dist/tools/get-asset.d.ts.map +1 -1
- package/dist/tools/import-unreal.d.ts +291 -0
- package/dist/tools/import-unreal.d.ts.map +1 -0
- package/dist/tools/import-unreal.js +375 -0
- package/dist/tools/import-unreal.js.map +1 -0
- package/dist/unreal/importer.d.ts +202 -0
- package/dist/unreal/importer.d.ts.map +1 -0
- package/dist/unreal/importer.js +795 -0
- package/dist/unreal/importer.js.map +1 -0
- package/dist/unreal/materials.d.ts +94 -0
- package/dist/unreal/materials.d.ts.map +1 -0
- package/dist/unreal/materials.js +348 -0
- package/dist/unreal/materials.js.map +1 -0
- package/dist/unreal/provision.d.ts +44 -0
- package/dist/unreal/provision.d.ts.map +1 -0
- package/dist/unreal/provision.js +250 -0
- package/dist/unreal/provision.js.map +1 -0
- package/dist/unreal/toolchain.d.ts +40 -0
- package/dist/unreal/toolchain.d.ts.map +1 -0
- package/dist/unreal/toolchain.js +157 -0
- package/dist/unreal/toolchain.js.map +1 -0
- package/package.json +2 -1
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface CliResult {
|
|
2
|
+
readonly exitCode: number;
|
|
3
|
+
readonly stdout: string;
|
|
4
|
+
readonly stderr: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function runImportCli(argv: readonly string[], log?: (message: string) => void): Promise<CliResult>;
|
|
7
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAmDD,wBAAsB,YAAY,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe,GACxC,OAAO,CAAC,SAAS,CAAC,CAyCpB"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { relative, resolve } from "node:path";
|
|
2
|
+
import { createAssetImportUnrealHandler, createFabImportAssetHandler, } from "./tools/import-unreal.js";
|
|
3
|
+
/**
|
|
4
|
+
* A thin human/CI adapter over the same two handlers the MCP registers. It exists so a CI job, a
|
|
5
|
+
* shell, or an agent without an MCP host can drive the identical code path — the parity test
|
|
6
|
+
* asserts the CLI and the tool emit byte-identical GLBs from the same input.
|
|
7
|
+
*/
|
|
8
|
+
const USAGE = `threenative-asset-mcp import <fab-listing-url-or-uid | local-unreal-directory> --out <directory>
|
|
9
|
+
|
|
10
|
+
--out <dir> Where the source GLBs are written, normally <game>/assets/fab/<listing>.
|
|
11
|
+
--engine <UE_x.y> Unreal artifact selector for a Fab listing with more than one.
|
|
12
|
+
--only <a,b,c> Import only these package names instead of every static mesh.
|
|
13
|
+
--max-texture-size <n> Longest edge for embedded textures. Omitted keeps Unreal's resolution.
|
|
14
|
+
--json Print the machine-readable summary instead of a human one.
|
|
15
|
+
|
|
16
|
+
With no arguments the process starts the stdio MCP server instead.
|
|
17
|
+
Authentication is never performed here: run \`fabcli auth login\` yourself first.`;
|
|
18
|
+
function parseFlags(argv) {
|
|
19
|
+
let target;
|
|
20
|
+
let out;
|
|
21
|
+
let engine;
|
|
22
|
+
let maxTextureSize;
|
|
23
|
+
let packages;
|
|
24
|
+
let json = false;
|
|
25
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
26
|
+
const argument = argv[index];
|
|
27
|
+
if (argument === undefined)
|
|
28
|
+
continue;
|
|
29
|
+
if (argument === "--json") {
|
|
30
|
+
json = true;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (argument === "--out" || argument === "-o") {
|
|
34
|
+
out = argv[(index += 1)];
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (argument === "--only") {
|
|
38
|
+
const raw = argv[(index += 1)];
|
|
39
|
+
packages = raw === undefined ? undefined : raw.split(",").map((entry) => entry.trim()).filter(Boolean);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (argument === "--engine") {
|
|
43
|
+
engine = argv[(index += 1)];
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (argument === "--max-texture-size") {
|
|
47
|
+
const raw = argv[(index += 1)];
|
|
48
|
+
maxTextureSize = raw === undefined ? undefined : Number(raw);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (argument.startsWith("-"))
|
|
52
|
+
continue;
|
|
53
|
+
target ??= argument;
|
|
54
|
+
}
|
|
55
|
+
return { target, out, engine, maxTextureSize, packages, json };
|
|
56
|
+
}
|
|
57
|
+
function isFabTarget(target) {
|
|
58
|
+
return /^https?:\/\//i.test(target) || /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(target);
|
|
59
|
+
}
|
|
60
|
+
export async function runImportCli(argv, log = () => { }) {
|
|
61
|
+
const flags = parseFlags(argv);
|
|
62
|
+
if (!flags.target || !flags.out) {
|
|
63
|
+
return { exitCode: 2, stdout: "", stderr: `${USAGE}\n` };
|
|
64
|
+
}
|
|
65
|
+
const handler = isFabTarget(flags.target)
|
|
66
|
+
? createFabImportAssetHandler({ log })
|
|
67
|
+
: createAssetImportUnrealHandler({ log });
|
|
68
|
+
const result = isFabTarget(flags.target)
|
|
69
|
+
? await handler({
|
|
70
|
+
listingIdOrUrl: flags.target,
|
|
71
|
+
outputDir: flags.out,
|
|
72
|
+
...(flags.engine === undefined ? {} : { engine: flags.engine }),
|
|
73
|
+
...(flags.maxTextureSize === undefined ? {} : { maxTextureSize: flags.maxTextureSize }),
|
|
74
|
+
...(flags.packages === undefined ? {} : { packages: flags.packages }),
|
|
75
|
+
acceptFabEula: true,
|
|
76
|
+
})
|
|
77
|
+
: await handler({
|
|
78
|
+
sourceDir: flags.target,
|
|
79
|
+
outputDir: flags.out,
|
|
80
|
+
...(flags.maxTextureSize === undefined ? {} : { maxTextureSize: flags.maxTextureSize }),
|
|
81
|
+
...(flags.packages === undefined ? {} : { packages: flags.packages }),
|
|
82
|
+
});
|
|
83
|
+
if ("isError" in result) {
|
|
84
|
+
return { exitCode: 1, stdout: "", stderr: `${result.content[0]?.text ?? "import failed"}\n` };
|
|
85
|
+
}
|
|
86
|
+
const summary = result.structuredContent;
|
|
87
|
+
if (flags.json) {
|
|
88
|
+
return { exitCode: 0, stdout: `${JSON.stringify(summary, null, 2)}\n`, stderr: "" };
|
|
89
|
+
}
|
|
90
|
+
const lines = [
|
|
91
|
+
`Imported ${summary.counts.exported} meshes into ${relative(process.cwd(), resolve(summary.outputDir)) || "."}`,
|
|
92
|
+
`Materials: ${summary.materials} (${summary.materialCoverage.textured}/${summary.materialCoverage.sections} sections textured, ${summary.materialCoverage.exact} exact, ${summary.materialCoverage.heuristic} heuristic, ${summary.materialCoverage.unsupported} unsupported)`,
|
|
93
|
+
`Skipped ${summary.counts.skipped}, failed ${summary.counts.failed}. Report: ${summary.reportPath}`,
|
|
94
|
+
...summary.warnings.map((warning) => `warning: ${warning}`),
|
|
95
|
+
];
|
|
96
|
+
return { exitCode: 0, stdout: `${lines.join("\n")}\n`, stderr: "" };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type ExternalTool } from "../unreal/toolchain.js";
|
|
2
|
+
export type FabCliErrorCode = "FABCLI_UNAVAILABLE" | "FABCLI_INCOMPATIBLE" | "FABCLI_UNAUTHENTICATED" | "FABCLI_SESSION_EXPIRED" | "FABCLI_NOT_OWNED" | "FABCLI_ENGINE_AMBIGUOUS" | "FABCLI_LICENSE_NOT_PERMITTED" | "FABCLI_LICENSE_UNVERIFIED" | "FABCLI_NO_UNREAL_FORMAT" | "FABCLI_DOWNLOAD_FAILED";
|
|
3
|
+
export declare class FabCliError extends Error {
|
|
4
|
+
readonly code: FabCliErrorCode;
|
|
5
|
+
readonly retryable: boolean;
|
|
6
|
+
constructor(code: FabCliErrorCode, message: string, retryable?: boolean);
|
|
7
|
+
}
|
|
8
|
+
export interface FabAuthStatus {
|
|
9
|
+
readonly authenticated: boolean;
|
|
10
|
+
/** ISO 8601, or undefined when FabCLI did not report one. Never a token. */
|
|
11
|
+
readonly expiresAt: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface FabOwnedListing {
|
|
14
|
+
readonly listingId: string | undefined;
|
|
15
|
+
readonly title: string;
|
|
16
|
+
readonly url: string;
|
|
17
|
+
readonly categories: readonly string[];
|
|
18
|
+
readonly distributionMethod: string;
|
|
19
|
+
readonly unrealArtifacts: readonly FabUnrealVersion[];
|
|
20
|
+
}
|
|
21
|
+
export interface FabUnrealVersion {
|
|
22
|
+
readonly artifactId: string;
|
|
23
|
+
readonly engineVersions: readonly string[];
|
|
24
|
+
readonly targetPlatforms: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
export interface FabDownloadRequest {
|
|
27
|
+
readonly listingId: string;
|
|
28
|
+
readonly outputDir: string;
|
|
29
|
+
readonly engine: string | undefined;
|
|
30
|
+
readonly platform?: string | undefined;
|
|
31
|
+
readonly timeoutMs?: number;
|
|
32
|
+
}
|
|
33
|
+
/** Preference order when a listing's artifact is published for several platforms. An asset pack's
|
|
34
|
+
* source .uasset files are the same whichever one is chosen; the first that exists wins. */
|
|
35
|
+
export declare const PLATFORM_PREFERENCE: readonly string[];
|
|
36
|
+
export declare function preferredPlatform(available: readonly string[]): string | undefined;
|
|
37
|
+
export declare function assertPlatform(value: string): string;
|
|
38
|
+
export declare function assertListingId(value: string): string;
|
|
39
|
+
export declare function assertEngineVersion(value: string): string;
|
|
40
|
+
export interface FabCliOptions {
|
|
41
|
+
readonly environment?: NodeJS.ProcessEnv;
|
|
42
|
+
readonly log?: (message: string) => void;
|
|
43
|
+
/** Injected in tests; production always resolves a real executable. */
|
|
44
|
+
readonly tool?: ExternalTool;
|
|
45
|
+
}
|
|
46
|
+
export declare class FabCli {
|
|
47
|
+
#private;
|
|
48
|
+
constructor(options?: FabCliOptions);
|
|
49
|
+
static get allowedSubcommands(): readonly string[];
|
|
50
|
+
tool(): Promise<ExternalTool>;
|
|
51
|
+
/**
|
|
52
|
+
* FabCLI reports two independent things under `auth status`: an Epic OAuth session, and a Fab
|
|
53
|
+
* *web* session used only by `claim` and `ownership`. The download path this server uses needs
|
|
54
|
+
* the first and not the second, so `fab.session_present: false` is not an authentication
|
|
55
|
+
* failure here and must not be reported as one.
|
|
56
|
+
*/
|
|
57
|
+
authStatus(): Promise<FabAuthStatus>;
|
|
58
|
+
/** Throws a caller-actionable error and performs no download when the session cannot be used. */
|
|
59
|
+
requireAuthenticatedSession(now?: Date): Promise<FabAuthStatus>;
|
|
60
|
+
/**
|
|
61
|
+
* Everything the signed-in account owns. Read-only: this is the "what do I already have"
|
|
62
|
+
* question, and answering it never touches an acquisition endpoint.
|
|
63
|
+
*/
|
|
64
|
+
ownedListings(): Promise<readonly FabOwnedListing[]>;
|
|
65
|
+
/** The Unreal artifact versions this account can download for a listing. */
|
|
66
|
+
unrealVersions(listingId: string): Promise<readonly FabUnrealVersion[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Picks the artifact for an engine selector. With no selector and more than one artifact the
|
|
69
|
+
* choice is the caller's: guessing would download several gigabytes of the wrong pack.
|
|
70
|
+
*/
|
|
71
|
+
static selectVersion(versions: readonly FabUnrealVersion[], engine: string | undefined): FabUnrealVersion;
|
|
72
|
+
/** Downloads an entitled artifact into an MCP-owned staging directory. Never claims or buys. */
|
|
73
|
+
download(request: FabDownloadRequest): Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=fabcli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fabcli.d.ts","sourceRoot":"","sources":["../../src/fab/fabcli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAA8B,MAAM,wBAAwB,CAAC;AAevF,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,qBAAqB,GACrB,wBAAwB,GACxB,wBAAwB,GACxB,kBAAkB,GAClB,yBAAyB,GACzB,8BAA8B,GAC9B,2BAA2B,GAC3B,yBAAyB,GACzB,wBAAwB,CAAC;AAE7B,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAE9B,QAAQ,CAAC,SAAS;IAHpB,YACW,IAAI,EAAE,eAAe,EAC9B,OAAO,EAAE,MAAM,EACN,SAAS,UAAQ,EAI3B;CACF;AAmCD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAOD;4FAC4F;AAC5F,eAAO,MAAM,mBAAmB,mBAO9B,CAAC;AAEH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAMlF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED,qBAAa,MAAM;;IAKjB,YAAY,OAAO,GAAE,aAAkB,EAItC;IAED,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAEK,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,CAoBlC;IA6CD;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CAczC;IAED,iGAAiG;IAC3F,2BAA2B,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkBhF;IAED;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAuBzD;IAED,4EAA4E;IACtE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAwB5E;IAED;;;OAGG;IACH,MAAM,CAAC,aAAa,CAClB,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,gBAAgB,CAsBlB;IAED,gGAAgG;IAC1F,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzD;CACF"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ensureFabcli } from "../unreal/provision.js";
|
|
3
|
+
import { ToolchainError, runBounded } from "../unreal/toolchain.js";
|
|
4
|
+
/**
|
|
5
|
+
* The only FabCLI subcommands this server is allowed to run. `claim`, `claim-batch`, `auth login`,
|
|
6
|
+
* `auth logout`, `update` and anything else that spends money, alters the account, or replaces the
|
|
7
|
+
* binary are absent by construction rather than by a check that could be bypassed.
|
|
8
|
+
*/
|
|
9
|
+
const ALLOWED_SUBCOMMANDS = Object.freeze([
|
|
10
|
+
"--version",
|
|
11
|
+
"auth status",
|
|
12
|
+
"formats",
|
|
13
|
+
"library",
|
|
14
|
+
"download",
|
|
15
|
+
]);
|
|
16
|
+
export class FabCliError extends Error {
|
|
17
|
+
code;
|
|
18
|
+
retryable;
|
|
19
|
+
constructor(code, message, retryable = false) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.retryable = retryable;
|
|
23
|
+
this.name = "FabCliError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const AuthStatusSchema = z.object({
|
|
27
|
+
authenticated: z.boolean(),
|
|
28
|
+
expires_at: z.string().optional(),
|
|
29
|
+
});
|
|
30
|
+
const VersionSchema = z.object({
|
|
31
|
+
artifactId: z.string(),
|
|
32
|
+
engineVersions: z.array(z.string()).default([]),
|
|
33
|
+
targetPlatforms: z.array(z.string()).default([]),
|
|
34
|
+
fileType: z.string().optional(),
|
|
35
|
+
});
|
|
36
|
+
const LibraryEntrySchema = z.object({
|
|
37
|
+
title: z.string().default(""),
|
|
38
|
+
description: z.string().default(""),
|
|
39
|
+
url: z.string().default(""),
|
|
40
|
+
distributionMethod: z.string().default(""),
|
|
41
|
+
customAttributes: z
|
|
42
|
+
.array(z.object({ ListingIdentifier: z.string().optional() }).loose())
|
|
43
|
+
.default([]),
|
|
44
|
+
projectVersions: z.array(VersionSchema.loose()).default([]),
|
|
45
|
+
categories: z.array(z.object({ name: z.string().optional() }).loose()).default([]),
|
|
46
|
+
});
|
|
47
|
+
const LibrarySchema = z.object({
|
|
48
|
+
results: z.array(LibraryEntrySchema.loose()).default([]),
|
|
49
|
+
});
|
|
50
|
+
const FormatSchema = z.object({
|
|
51
|
+
assetFormatType: z.object({ code: z.string() }).loose(),
|
|
52
|
+
versions: z.array(VersionSchema).default([]),
|
|
53
|
+
});
|
|
54
|
+
/** Listing UIDs are the only free-form value that ever reaches an argv slot. */
|
|
55
|
+
const LISTING_UID = /^[0-9a-fA-F-]{8,64}$/;
|
|
56
|
+
const ENGINE_VERSION = /^UE_\d+\.\d+$/;
|
|
57
|
+
const PLATFORM_NAME = /^[A-Za-z0-9_]{1,32}$/;
|
|
58
|
+
/** Preference order when a listing's artifact is published for several platforms. An asset pack's
|
|
59
|
+
* source .uasset files are the same whichever one is chosen; the first that exists wins. */
|
|
60
|
+
export const PLATFORM_PREFERENCE = Object.freeze([
|
|
61
|
+
"Windows",
|
|
62
|
+
"Win64",
|
|
63
|
+
"Linux",
|
|
64
|
+
"Mac",
|
|
65
|
+
"Android",
|
|
66
|
+
"IOS",
|
|
67
|
+
]);
|
|
68
|
+
export function preferredPlatform(available) {
|
|
69
|
+
for (const candidate of PLATFORM_PREFERENCE) {
|
|
70
|
+
const match = available.find((entry) => entry.toLowerCase() === candidate.toLowerCase());
|
|
71
|
+
if (match)
|
|
72
|
+
return match;
|
|
73
|
+
}
|
|
74
|
+
return available[0];
|
|
75
|
+
}
|
|
76
|
+
export function assertPlatform(value) {
|
|
77
|
+
if (!PLATFORM_NAME.test(value)) {
|
|
78
|
+
throw new FabCliError("FABCLI_ENGINE_AMBIGUOUS", `"${value}" is not a platform name.`);
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
export function assertListingId(value) {
|
|
83
|
+
if (!LISTING_UID.test(value)) {
|
|
84
|
+
throw new FabCliError("FABCLI_DOWNLOAD_FAILED", "A Fab listing id must be the listing UID from the listing URL.");
|
|
85
|
+
}
|
|
86
|
+
return value;
|
|
87
|
+
}
|
|
88
|
+
export function assertEngineVersion(value) {
|
|
89
|
+
if (!ENGINE_VERSION.test(value)) {
|
|
90
|
+
throw new FabCliError("FABCLI_ENGINE_AMBIGUOUS", `"${value}" is not an Unreal engine selector; use the UE_<major>.<minor> form, for example UE_4.21.`);
|
|
91
|
+
}
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
export class FabCli {
|
|
95
|
+
#tool;
|
|
96
|
+
#environment;
|
|
97
|
+
#log;
|
|
98
|
+
constructor(options = {}) {
|
|
99
|
+
this.#tool = options.tool;
|
|
100
|
+
this.#environment = options.environment ?? process.env;
|
|
101
|
+
this.#log = options.log ?? (() => { });
|
|
102
|
+
}
|
|
103
|
+
static get allowedSubcommands() {
|
|
104
|
+
return ALLOWED_SUBCOMMANDS;
|
|
105
|
+
}
|
|
106
|
+
async tool() {
|
|
107
|
+
if (this.#tool)
|
|
108
|
+
return this.#tool;
|
|
109
|
+
try {
|
|
110
|
+
this.#tool = await ensureFabcli(this.#environment, this.#log);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new FabCliError("FABCLI_UNAVAILABLE", error instanceof ToolchainError
|
|
114
|
+
? error.message
|
|
115
|
+
: "FabCLI could not be resolved or installed.");
|
|
116
|
+
}
|
|
117
|
+
const major = /(\d+)\.(\d+)\.(\d+)/.exec(this.#tool.version);
|
|
118
|
+
if (major && Number(major[1]) !== 0) {
|
|
119
|
+
throw new FabCliError("FABCLI_INCOMPATIBLE", `This server drives FabCLI 0.x; the resolved binary reports "${this.#tool.version}". Pin a 0.x FabCLI with THREENATIVE_FABCLI_PATH.`);
|
|
120
|
+
}
|
|
121
|
+
return this.#tool;
|
|
122
|
+
}
|
|
123
|
+
async #json(args, timeoutMs) {
|
|
124
|
+
const tool = await this.tool();
|
|
125
|
+
const run = await runBounded(tool.path, args, { timeoutMs });
|
|
126
|
+
// FabCLI writes its results to stdout and some structured failures to stderr, so a diagnosis
|
|
127
|
+
// that reads only stdout turns every real error into "produced no output". The stdout payload
|
|
128
|
+
// is never truncated — `library` alone is tens of kilobytes, and clipping it to a diagnostic
|
|
129
|
+
// length turns a valid answer into "did not return JSON".
|
|
130
|
+
const payload = run.stdout.trim();
|
|
131
|
+
const text = payload || run.stderr.trim().slice(0, 4_096);
|
|
132
|
+
if (!text) {
|
|
133
|
+
throw new FabCliError("FABCLI_DOWNLOAD_FAILED", `fabcli ${args.join(" ")} produced no output (exit ${run.code}).`, run.code !== 0);
|
|
134
|
+
}
|
|
135
|
+
let parsed;
|
|
136
|
+
try {
|
|
137
|
+
parsed = JSON.parse(text);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
throw new FabCliError("FABCLI_INCOMPATIBLE", `fabcli ${args[0]} did not return JSON; this server expects FabCLI 0.1.x output.`);
|
|
141
|
+
}
|
|
142
|
+
const failure = parsed?.error;
|
|
143
|
+
if (failure) {
|
|
144
|
+
const kind = failure.kind ?? "unknown";
|
|
145
|
+
const detail = failure.message ?? "no detail";
|
|
146
|
+
if (/keystore|secure storage|DBus/i.test(detail)) {
|
|
147
|
+
throw new FabCliError("FABCLI_UNAUTHENTICATED", `FabCLI could not read its session from the OS keystore (${detail}). Run the import from a desktop session where the keyring is unlocked, or export DBUS_SESSION_BUS_ADDRESS before starting the MCP server.`);
|
|
148
|
+
}
|
|
149
|
+
throw new FabCliError(kind === "auth_required" ? "FABCLI_UNAUTHENTICATED" : "FABCLI_DOWNLOAD_FAILED", `fabcli reported ${kind}: ${detail}`);
|
|
150
|
+
}
|
|
151
|
+
return parsed;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* FabCLI reports two independent things under `auth status`: an Epic OAuth session, and a Fab
|
|
155
|
+
* *web* session used only by `claim` and `ownership`. The download path this server uses needs
|
|
156
|
+
* the first and not the second, so `fab.session_present: false` is not an authentication
|
|
157
|
+
* failure here and must not be reported as one.
|
|
158
|
+
*/
|
|
159
|
+
async authStatus() {
|
|
160
|
+
const parsed = AuthStatusSchema.loose().safeParse(await this.#json(["auth", "status"], 120_000));
|
|
161
|
+
if (!parsed.success) {
|
|
162
|
+
throw new FabCliError("FABCLI_INCOMPATIBLE", "fabcli auth status did not match the expected 0.1.x shape.");
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
authenticated: parsed.data.authenticated,
|
|
166
|
+
expiresAt: parsed.data.expires_at,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/** Throws a caller-actionable error and performs no download when the session cannot be used. */
|
|
170
|
+
async requireAuthenticatedSession(now = new Date()) {
|
|
171
|
+
const status = await this.authStatus();
|
|
172
|
+
if (!status.authenticated) {
|
|
173
|
+
throw new FabCliError("FABCLI_UNAUTHENTICATED", "No FabCLI session. Run `fabcli auth login` in your own terminal, then retry. This server never logs in for you.");
|
|
174
|
+
}
|
|
175
|
+
if (status.expiresAt) {
|
|
176
|
+
const expiry = Date.parse(status.expiresAt);
|
|
177
|
+
if (Number.isFinite(expiry) && expiry <= now.getTime()) {
|
|
178
|
+
throw new FabCliError("FABCLI_SESSION_EXPIRED", `The FabCLI session expired at ${status.expiresAt}. Run \`fabcli auth login\` and retry.`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return status;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Everything the signed-in account owns. Read-only: this is the "what do I already have"
|
|
185
|
+
* question, and answering it never touches an acquisition endpoint.
|
|
186
|
+
*/
|
|
187
|
+
async ownedListings() {
|
|
188
|
+
const parsed = LibrarySchema.loose().safeParse(await this.#json(["library"], 300_000));
|
|
189
|
+
if (!parsed.success) {
|
|
190
|
+
throw new FabCliError("FABCLI_INCOMPATIBLE", "fabcli library did not match the expected 0.1.x shape.");
|
|
191
|
+
}
|
|
192
|
+
return parsed.data.results.map((entry) => ({
|
|
193
|
+
listingId: entry.customAttributes.find((attribute) => attribute.ListingIdentifier)
|
|
194
|
+
?.ListingIdentifier,
|
|
195
|
+
title: entry.title || entry.description,
|
|
196
|
+
url: entry.url,
|
|
197
|
+
categories: entry.categories.flatMap((category) => category.name === undefined ? [] : [category.name]),
|
|
198
|
+
distributionMethod: entry.distributionMethod,
|
|
199
|
+
unrealArtifacts: entry.projectVersions.map((version) => ({
|
|
200
|
+
artifactId: version.artifactId,
|
|
201
|
+
engineVersions: version.engineVersions,
|
|
202
|
+
targetPlatforms: version.targetPlatforms,
|
|
203
|
+
})),
|
|
204
|
+
}));
|
|
205
|
+
}
|
|
206
|
+
/** The Unreal artifact versions this account can download for a listing. */
|
|
207
|
+
async unrealVersions(listingId) {
|
|
208
|
+
const parsed = z
|
|
209
|
+
.array(FormatSchema.loose())
|
|
210
|
+
.safeParse(await this.#json(["formats", assertListingId(listingId)], 180_000));
|
|
211
|
+
if (!parsed.success) {
|
|
212
|
+
throw new FabCliError("FABCLI_INCOMPATIBLE", "fabcli formats did not match the expected 0.1.x shape.");
|
|
213
|
+
}
|
|
214
|
+
const unreal = parsed.data.find((format) => format.assetFormatType.code === "unreal-engine");
|
|
215
|
+
if (!unreal || unreal.versions.length === 0) {
|
|
216
|
+
throw new FabCliError("FABCLI_NO_UNREAL_FORMAT", `Listing ${listingId} publishes no Unreal Engine artifact, so there is nothing for the Unreal importer to convert.`);
|
|
217
|
+
}
|
|
218
|
+
return unreal.versions.map((version) => ({
|
|
219
|
+
artifactId: version.artifactId,
|
|
220
|
+
engineVersions: version.engineVersions,
|
|
221
|
+
targetPlatforms: version.targetPlatforms,
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Picks the artifact for an engine selector. With no selector and more than one artifact the
|
|
226
|
+
* choice is the caller's: guessing would download several gigabytes of the wrong pack.
|
|
227
|
+
*/
|
|
228
|
+
static selectVersion(versions, engine) {
|
|
229
|
+
if (engine) {
|
|
230
|
+
const wanted = assertEngineVersion(engine);
|
|
231
|
+
const match = versions.find((version) => version.engineVersions.includes(wanted));
|
|
232
|
+
if (!match) {
|
|
233
|
+
throw new FabCliError("FABCLI_ENGINE_AMBIGUOUS", `No artifact for ${wanted}. Available: ${versions
|
|
234
|
+
.map((version) => `${version.artifactId} (${version.engineVersions.join(", ")})`)
|
|
235
|
+
.join("; ")}.`);
|
|
236
|
+
}
|
|
237
|
+
return match;
|
|
238
|
+
}
|
|
239
|
+
const only = versions[0];
|
|
240
|
+
if (versions.length === 1 && only)
|
|
241
|
+
return only;
|
|
242
|
+
throw new FabCliError("FABCLI_ENGINE_AMBIGUOUS", `This listing publishes ${versions.length} Unreal artifacts. Pass engine to choose one: ${versions
|
|
243
|
+
.map((version) => `${version.artifactId} (${version.engineVersions.join(", ")})`)
|
|
244
|
+
.join("; ")}.`);
|
|
245
|
+
}
|
|
246
|
+
/** Downloads an entitled artifact into an MCP-owned staging directory. Never claims or buys. */
|
|
247
|
+
async download(request) {
|
|
248
|
+
const tool = await this.tool();
|
|
249
|
+
const args = [
|
|
250
|
+
"download",
|
|
251
|
+
assertListingId(request.listingId),
|
|
252
|
+
"--output",
|
|
253
|
+
request.outputDir,
|
|
254
|
+
];
|
|
255
|
+
if (request.engine)
|
|
256
|
+
args.push("--engine", assertEngineVersion(request.engine));
|
|
257
|
+
if (request.platform)
|
|
258
|
+
args.push("--platform", assertPlatform(request.platform));
|
|
259
|
+
const run = await runBounded(tool.path, args, {
|
|
260
|
+
timeoutMs: request.timeoutMs ?? 10_800_000,
|
|
261
|
+
maxOutputBytes: 32 * 1024 * 1024,
|
|
262
|
+
});
|
|
263
|
+
if (run.code !== 0) {
|
|
264
|
+
// FabCLI reports most failures as JSON but writes a few as plain text. Falling back to the
|
|
265
|
+
// raw first line keeps the reason in the error instead of a bare exit code.
|
|
266
|
+
const output = `${run.stdout}\n${run.stderr}`;
|
|
267
|
+
const detail = /"message"\s*:\s*"([^"]{0,300})"/.exec(output)?.[1] ??
|
|
268
|
+
output
|
|
269
|
+
.split("\n")
|
|
270
|
+
.map((line) => line.trim())
|
|
271
|
+
.find((line) => line.length > 0)
|
|
272
|
+
?.slice(0, 300);
|
|
273
|
+
const kind = /"kind"\s*:\s*"([a-z_]{0,60})"/.exec(output)?.[1];
|
|
274
|
+
throw new FabCliError(kind === "auth_required"
|
|
275
|
+
? "FABCLI_UNAUTHENTICATED"
|
|
276
|
+
: kind === "not_owned"
|
|
277
|
+
? "FABCLI_NOT_OWNED"
|
|
278
|
+
: "FABCLI_DOWNLOAD_FAILED", `fabcli download exited ${run.code}${detail ? `: ${detail}` : "."}`, run.code !== 2);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=fabcli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fabcli.js","sourceRoot":"","sources":["../../src/fab/fabcli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which Fab entitlements this server is willing to convert into game assets.
|
|
3
|
+
*
|
|
4
|
+
* Fab Standard — the Personal and Professional licences — and CC-BY are the only ones that permit
|
|
5
|
+
* what an import does: taking the asset out of Unreal and shipping it inside another engine's
|
|
6
|
+
* runtime. The legacy Unreal-Engine-only entitlements do not, and a listing whose licence cannot
|
|
7
|
+
* be read is not evidence that it may be used. The check therefore fails closed: unknown is a
|
|
8
|
+
* refusal, not a warning.
|
|
9
|
+
*/
|
|
10
|
+
export type LicenseVerdict = "allowed" | "rejected" | "unverified";
|
|
11
|
+
export interface LicenseDecision {
|
|
12
|
+
readonly verdict: LicenseVerdict;
|
|
13
|
+
/** Every slug the listing published, normalized. */
|
|
14
|
+
readonly slugs: readonly string[];
|
|
15
|
+
/** The slugs that permitted the import, when the verdict is `allowed`. */
|
|
16
|
+
readonly allowed: readonly string[];
|
|
17
|
+
readonly reason: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function normalizeLicenseSlug(slug: string): string;
|
|
20
|
+
export declare function classifyLicenses(slugs: readonly string[]): LicenseDecision;
|
|
21
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/fab/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;AAEnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAkBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CAiC1E"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which Fab entitlements this server is willing to convert into game assets.
|
|
3
|
+
*
|
|
4
|
+
* Fab Standard — the Personal and Professional licences — and CC-BY are the only ones that permit
|
|
5
|
+
* what an import does: taking the asset out of Unreal and shipping it inside another engine's
|
|
6
|
+
* runtime. The legacy Unreal-Engine-only entitlements do not, and a listing whose licence cannot
|
|
7
|
+
* be read is not evidence that it may be used. The check therefore fails closed: unknown is a
|
|
8
|
+
* refusal, not a warning.
|
|
9
|
+
*/
|
|
10
|
+
/** Fab Standard is the Personal + Professional pair; CC-BY is accepted on the same footing. */
|
|
11
|
+
const ALLOWED = new Map([
|
|
12
|
+
["personal", "Fab Standard (Personal)"],
|
|
13
|
+
["professional", "Fab Standard (Professional)"],
|
|
14
|
+
["ccby", "CC-BY"],
|
|
15
|
+
["ccby40", "CC-BY 4.0"],
|
|
16
|
+
["ccbysa", "CC-BY-SA"],
|
|
17
|
+
]);
|
|
18
|
+
/** Named so the refusal can say which entitlement blocked it rather than "not allowed". */
|
|
19
|
+
const KNOWN_REJECTED = [
|
|
20
|
+
{ test: /ueonly|unrealengineonly|uenoncommercial/, label: "Unreal-Engine-only" },
|
|
21
|
+
{ test: /legacy/, label: "legacy marketplace" },
|
|
22
|
+
{ test: /ccbync|noncommercial|ccbynd|noderiv/, label: "non-commercial or no-derivatives Creative Commons" },
|
|
23
|
+
];
|
|
24
|
+
export function normalizeLicenseSlug(slug) {
|
|
25
|
+
return slug.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
26
|
+
}
|
|
27
|
+
export function classifyLicenses(slugs) {
|
|
28
|
+
const normalized = slugs.map(normalizeLicenseSlug).filter((slug) => slug.length > 0);
|
|
29
|
+
if (normalized.length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
verdict: "unverified",
|
|
32
|
+
slugs: [],
|
|
33
|
+
allowed: [],
|
|
34
|
+
reason: "Fab published no licence for this listing, so the entitlement could not be verified. This importer fails closed rather than assume a permissive licence.",
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const allowed = normalized.filter((slug) => ALLOWED.has(slug));
|
|
38
|
+
if (allowed.length > 0) {
|
|
39
|
+
return {
|
|
40
|
+
verdict: "allowed",
|
|
41
|
+
slugs: normalized,
|
|
42
|
+
allowed,
|
|
43
|
+
reason: `Entitled under ${allowed.map((slug) => ALLOWED.get(slug)).join(" and ")}.`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const named = normalized.flatMap((slug) => {
|
|
47
|
+
const match = KNOWN_REJECTED.find((entry) => entry.test.test(slug));
|
|
48
|
+
return match ? [`${slug} (${match.label})`] : [];
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
verdict: "rejected",
|
|
52
|
+
slugs: normalized,
|
|
53
|
+
allowed: [],
|
|
54
|
+
reason: named.length > 0
|
|
55
|
+
? `This listing is offered only under ${named.join(", ")}, which does not permit converting the asset for another engine's runtime.`
|
|
56
|
+
: `This listing publishes only unrecognized licences (${normalized.join(", ")}). Only Fab Standard (Personal or Professional) and CC-BY are accepted.`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/fab/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,+FAA+F;AAC/F,MAAM,OAAO,GAAG,IAAI,GAAG,CAAiB;IACtC,CAAC,UAAU,EAAE,yBAAyB,CAAC;IACvC,CAAC,cAAc,EAAE,6BAA6B,CAAC;IAC/C,CAAC,MAAM,EAAE,OAAO,CAAC;IACjB,CAAC,QAAQ,EAAE,WAAW,CAAC;IACvB,CAAC,QAAQ,EAAE,UAAU,CAAC;CACvB,CAAC,CAAC;AAEH,2FAA2F;AAC3F,MAAM,cAAc,GAAiE;IACnF,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAChF,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAC/C,EAAE,IAAI,EAAE,qCAAqC,EAAE,KAAK,EAAE,mDAAmD,EAAE;CAC5G,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAwB;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,YAAY;YACrB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;YACX,MAAM,EACJ,0JAA0J;SAC7J,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,UAAU;YACjB,OAAO;YACP,MAAM,EAAE,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG;SACpF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,EAAE;QACX,MAAM,EACJ,KAAK,CAAC,MAAM,GAAG,CAAC;YACd,CAAC,CAAC,sCAAsC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4EAA4E;YACpI,CAAC,CAAC,sDAAsD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,yEAAyE;KAC3J,CAAC;AACJ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { serveStdio } from "@modelcontextprotocol/server/stdio";
|
|
3
|
+
// `import` is the only argument form this bin accepts. No arguments still starts the stdio MCP
|
|
4
|
+
// server, which is the contract every generated project's .mcp.json depends on.
|
|
5
|
+
if (process.argv[2] === "import") {
|
|
6
|
+
const { runImportCli } = await import("./cli.js");
|
|
7
|
+
const result = await runImportCli(process.argv.slice(3), (message) => {
|
|
8
|
+
process.stderr.write(`${message}\n`);
|
|
9
|
+
});
|
|
10
|
+
if (result.stdout)
|
|
11
|
+
process.stdout.write(result.stdout);
|
|
12
|
+
if (result.stderr)
|
|
13
|
+
process.stderr.write(result.stderr);
|
|
14
|
+
process.exit(result.exitCode);
|
|
15
|
+
}
|
|
3
16
|
import { AmbientCgClient } from "./ambientcg/client.js";
|
|
4
17
|
import { AudioCatalogClient } from "./audio/client.js";
|
|
5
18
|
import { BundleAssetClient } from "./bundle/client.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;AAC5B,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;AACxC,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;AACxC,MAAM,WAAW,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAC5C,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;AACxC,MAAM,KAAK,GAAG,IAAI,kBAAkB,EAAE,CAAC;AACvC,MAAM,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAC;AACrD,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACnE,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,KAAK,GAAG,CAAC,cAAc,EAAE,CAAC;AAC1B,MAAM,MAAM,GAAG,UAAU,CACvB,GAAG,EAAE,CACH,iBAAiB,CAAC;IAChB,GAAG;IACH,SAAS;IACT,SAAS;IACT,WAAW;IACX,SAAS;IACT,KAAK;IACL,gBAAgB;IAChB,IAAI;IACJ,MAAM;CACP,CAAC,EACJ;IACA,OAAO,CAAC,KAAK;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC;YAChB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,qBAAqB;YAC9B,KAAK,EAAE,KAAK,CAAC,IAAI;SAClB,CAAC,IAAI,CACP,CAAC;IACJ,CAAC;CACA,CACF,CAAC;AAEF,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,KAAK,UAAU,QAAQ;IACrB,IAAI,OAAO;QAAE,OAAO;IACpB,OAAO,GAAG,IAAI,CAAC;IACf,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;IAC1B,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;IAC3B,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;IAC9B,KAAK,QAAQ,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAuI5D,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,SAAS,CAAC;IACf,SAAS,EAAE,eAAe,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,kBAUR,GACA,SAAS,CA4nBX;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,MAAM,GAAE,SAA2B,GAAG,SAAS,CAY9E"}
|