@hyper3d/cli 0.0.1 → 0.1.0-beta.2.1

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/index.js ADDED
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env node
2
+ import { readFile } from 'node:fs/promises';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { Command, Option } from 'commander';
5
+ import { accountInfo } from './account.js';
6
+ import { login, logout } from './auth.js';
7
+ import { DEFAULT_BASE_URL, configureEndpoints, endpoints, } from './endpoints.js';
8
+ import { generate, status, result, poll, bang } from './operations.js';
9
+ import { formatOutput } from './output.js';
10
+ import { checkUpdate, update, startupUpdate, updateChannel } from './update.js';
11
+ import { getConfigDir } from './utils.js';
12
+ const pkg = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
13
+ const print = (value, kind) => {
14
+ process.stdout.write(`${formatOutput(value, { format: cli.opts().output, kind })}\n`);
15
+ };
16
+ const cli = new Command('hyper3d').version(pkg.version);
17
+ cli.option('--base-url <url>', 'Hyper3D API base URL (overrides BASE_URL)', process.env.BASE_URL ?? DEFAULT_BASE_URL);
18
+ cli.addOption(new Option('--output <format>', 'Output format')
19
+ .choices(['human', 'json'])
20
+ .default('human'));
21
+ cli.hook('preAction', () => {
22
+ configureEndpoints(cli.opts().baseUrl);
23
+ });
24
+ cli.hook('preAction', async (_root, command) => {
25
+ if (command.parent !== cli ||
26
+ !['generate', 'status', 'poll', 'result', 'bang'].includes(command.name()))
27
+ return;
28
+ if (process.env.CI ||
29
+ !process.stderr.isTTY ||
30
+ process.env.HYPER3D_UPDATE_CHECK === '0')
31
+ return;
32
+ const updated = await startupUpdate(pkg, {
33
+ autoUpdate: process.env.HYPER3D_AUTO_UPDATE === '1',
34
+ cacheDir: getConfigDir(),
35
+ });
36
+ if (updated)
37
+ throw new Error('CLI updated; rerun your command.');
38
+ });
39
+ // auth
40
+ const authentication = cli.command('auth');
41
+ authentication
42
+ .command('login')
43
+ .option('--no-browser', 'Print the verification link and code without opening a browser')
44
+ .action(async (options) => {
45
+ await login(endpoints.mcp, { browser: options.browser });
46
+ print({ authenticated: true }, 'auth-login');
47
+ });
48
+ authentication.command('logout').action(async () => {
49
+ await logout(endpoints.mcp);
50
+ print({ localCredentialsRemoved: true }, 'auth-logout');
51
+ });
52
+ authentication
53
+ .command('status')
54
+ .alias('info')
55
+ .description('Show your account and authorized wallet credit balances')
56
+ .action(async () => print(await accountInfo(), 'account'));
57
+ // generate
58
+ cli
59
+ .command('generate')
60
+ .description('Generate a model from text and/or local reference images')
61
+ .option('--prompt <text>', 'Model description')
62
+ .option('--image <path>', 'Reference image; repeat for up to five images', (path, paths) => [...paths, path], [])
63
+ .option('--tier <tier>', 'Generation tier')
64
+ .option('--mesh-mode <mode>', 'Mesh mode, e.g. Raw or Quad')
65
+ .option('--format <format>', 'Geometry format, e.g. glb')
66
+ .option('--quality <count>', 'Target polygon count', Number)
67
+ .action(async (options) => print(await generate(options)));
68
+ // poll
69
+ for (const [command, action] of [
70
+ ['status', status],
71
+ ['result', result],
72
+ ]) {
73
+ cli
74
+ .command(`${command} <generation-id>`)
75
+ .action(async (id) => print(await action(id)));
76
+ }
77
+ cli
78
+ .command('poll <generation-id>')
79
+ .description('Poll until generation finishes or the timeout expires')
80
+ .option('--timeout <seconds>', 'Total polling timeout in seconds', Number, 30)
81
+ .action(async (id, options) => print(await poll(id, options.timeout)));
82
+ // bang
83
+ cli
84
+ .command('bang <generation-id>')
85
+ .description('Run BANG to separate a completed model into parts')
86
+ .option('--instruction <text>', 'Parts to separate')
87
+ .option('--strength <count>', 'Target part count', Number)
88
+ .option('--format <format>', 'Geometry format')
89
+ .action(async (id, options) => print(await bang(id, options)));
90
+ // update
91
+ cli
92
+ .command('update')
93
+ .option('--check', 'Only check npm')
94
+ .option('--channel <channel>', 'latest, next or beta', updateChannel(pkg))
95
+ .action(async (options) => print(options.check
96
+ ? await checkUpdate(pkg, options.channel)
97
+ : await update(pkg, fileURLToPath(new URL('..', import.meta.url)), options.channel)));
98
+ try {
99
+ await cli.parseAsync();
100
+ }
101
+ catch (error) {
102
+ const message = error instanceof Error ? error.message : 'Request failed';
103
+ process.stderr.write(`error: ${message}\n`);
104
+ process.exitCode = 1;
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,99 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import type { Payload, ToolClient } from './types.js';
3
+ import type { CallToolResult, Tool } from '@modelcontextprotocol/sdk/types.js';
4
+ export declare function withClient<T>({ endpoint, version }: {
5
+ endpoint: string;
6
+ version: string;
7
+ }, action: (client: Client) => Promise<T>): Promise<T>;
8
+ export declare function listTools(client: Client): Promise<{
9
+ inputSchema: {
10
+ [x: string]: unknown;
11
+ type: "object";
12
+ properties?: {
13
+ [x: string]: object;
14
+ } | undefined;
15
+ required?: string[] | undefined;
16
+ };
17
+ name: string;
18
+ description?: string | undefined;
19
+ outputSchema?: {
20
+ [x: string]: unknown;
21
+ type: "object";
22
+ properties?: {
23
+ [x: string]: object;
24
+ } | undefined;
25
+ required?: string[] | undefined;
26
+ } | undefined;
27
+ annotations?: {
28
+ title?: string | undefined;
29
+ readOnlyHint?: boolean | undefined;
30
+ destructiveHint?: boolean | undefined;
31
+ idempotentHint?: boolean | undefined;
32
+ openWorldHint?: boolean | undefined;
33
+ } | undefined;
34
+ execution?: {
35
+ taskSupport?: "optional" | "required" | "forbidden" | undefined;
36
+ } | undefined;
37
+ _meta?: {
38
+ [x: string]: unknown;
39
+ } | undefined;
40
+ icons?: {
41
+ src: string;
42
+ mimeType?: string | undefined;
43
+ sizes?: string[] | undefined;
44
+ theme?: "light" | "dark" | undefined;
45
+ }[] | undefined;
46
+ title?: string | undefined;
47
+ }[]>;
48
+ export interface ToolContext {
49
+ client: ToolClient;
50
+ remoteTools: Tool[];
51
+ }
52
+ export declare function withToolContext<T>(action: (context: ToolContext) => Promise<T>, context?: ToolContext): Promise<T>;
53
+ export declare function resultData(result: CallToolResult): Payload;
54
+ export interface GenerateInput {
55
+ prompt?: string;
56
+ reference_upload_ids?: string[];
57
+ mesh_mode?: string;
58
+ tier?: string;
59
+ quality_override?: number;
60
+ geometry_file_format?: string;
61
+ }
62
+ export declare function validateGenerate(context: ToolContext, input: GenerateInput): void;
63
+ export declare function rodinCreateUploads(context: ToolContext, input: {
64
+ files: {
65
+ filename: string;
66
+ mime_type: string;
67
+ size_bytes: number;
68
+ }[];
69
+ }): Promise<Payload>;
70
+ export declare function rodinImportImages(context: ToolContext, input: {
71
+ images: {
72
+ download_url: string;
73
+ file_id: string;
74
+ mime_type?: string;
75
+ file_name?: string;
76
+ }[];
77
+ }): Promise<Payload>;
78
+ export declare function rodinGenerate(context: ToolContext, input: GenerateInput): Promise<Payload>;
79
+ export declare function rodinGenerateBang(context: ToolContext, input: {
80
+ asset_id: string;
81
+ instruction?: string;
82
+ strength?: number;
83
+ explode_strength?: number;
84
+ escore?: number;
85
+ reference_scale?: number;
86
+ seed?: number;
87
+ geometry_file_format?: string;
88
+ resolution?: string;
89
+ }): Promise<Payload>;
90
+ export declare function rodinGetStatus(context: ToolContext, input: {
91
+ generation_id: string;
92
+ }): Promise<Payload>;
93
+ export declare function rodinWait(context: ToolContext, input: {
94
+ generation_id: string;
95
+ timeout_seconds?: number;
96
+ }): Promise<Payload>;
97
+ export declare function rodinGetResult(context: ToolContext, input: {
98
+ generation_id: string;
99
+ }): Promise<Payload>;
package/dist/mcp.js ADDED
@@ -0,0 +1,116 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
+ import { loadCredentials, createProvider } from './auth.js';
5
+ import { endpoints, secureUrl } from './endpoints.js';
6
+ import { prepareCall } from './schema.js';
7
+ const { version } = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
8
+ export async function withClient({ endpoint, version }, action) {
9
+ const url = secureUrl(endpoint);
10
+ const client = new Client({ name: 'hyper3d-cli', version });
11
+ const credentials = await loadCredentials(endpoint);
12
+ const transport = new StreamableHTTPClientTransport(url, {
13
+ requestInit: { headers: { 'X-Hyper3D-CLI-Version': version } },
14
+ authProvider: credentials.clientId
15
+ ? createProvider(endpoint, credentials)
16
+ : undefined,
17
+ });
18
+ try {
19
+ await client.connect(transport, { timeout: 15000 });
20
+ return await action(client);
21
+ }
22
+ finally {
23
+ await client.close();
24
+ }
25
+ }
26
+ export async function listTools(client) {
27
+ const tools = [], seen = new Set();
28
+ let cursor;
29
+ do {
30
+ const page = await client.listTools(cursor ? { cursor } : {}, {
31
+ timeout: 15000,
32
+ });
33
+ tools.push(...page.tools);
34
+ cursor = page.nextCursor;
35
+ if (cursor && seen.has(cursor))
36
+ throw new Error('MCP returned a repeated pagination cursor');
37
+ seen.add(cursor);
38
+ if (seen.size > 100)
39
+ throw new Error('MCP tool pagination limit exceeded');
40
+ } while (cursor);
41
+ return tools;
42
+ }
43
+ // A workflow owns one connection; an injected context remains caller-owned.
44
+ export async function withToolContext(action, context) {
45
+ if (context)
46
+ return action(context);
47
+ return withClient({ endpoint: endpoints.mcp, version }, async (client) => action({ client, remoteTools: await listTools(client) }));
48
+ }
49
+ function cliResult(data) {
50
+ if (!data || typeof data !== 'object' || Array.isArray(data))
51
+ return data;
52
+ const result = { ...data };
53
+ delete result.display_url;
54
+ return result;
55
+ }
56
+ export function resultData(result) {
57
+ if (result.isError)
58
+ throw new Error(`Operation failed: ${result.content
59
+ ?.filter((c) => c.type === 'text')
60
+ .map((c) => (c.type === 'text' ? c.text : ''))
61
+ .join('\n') || 'server returned an error'}`);
62
+ if (result.structuredContent)
63
+ return cliResult(result.structuredContent);
64
+ for (const item of result.content ?? []) {
65
+ if (item.type === 'text') {
66
+ try {
67
+ return cliResult(JSON.parse(item.text));
68
+ }
69
+ catch {
70
+ /* Try the next text block. */
71
+ }
72
+ }
73
+ }
74
+ throw new Error('Server returned no structured operation result');
75
+ }
76
+ function updateHint(error) {
77
+ return new Error(`${error instanceof Error ? error.message : String(error)}\nCheck for updates: hyper3d update --check. The operation was not retried.`, { cause: error });
78
+ }
79
+ async function call(context, name, input) {
80
+ try {
81
+ const request = prepareCall(name, input, context.remoteTools.find((tool) => tool.name === name));
82
+ // Submit once; a failed or timed-out call may already have created a task.
83
+ const response = await context.client.callTool(request, undefined, {
84
+ timeout: 60000,
85
+ });
86
+ return resultData(response);
87
+ }
88
+ catch (error) {
89
+ throw updateHint(error);
90
+ }
91
+ }
92
+ export function validateGenerate(context, input) {
93
+ prepareCall('rodin_generate', input, context.remoteTools.find((tool) => tool.name === 'rodin_generate'), () => { });
94
+ }
95
+ export async function rodinCreateUploads(context, input) {
96
+ return call(context, 'rodin_create_uploads', input);
97
+ }
98
+ export async function rodinImportImages(context, input) {
99
+ return call(context, 'rodin_import_images', input);
100
+ }
101
+ export async function rodinGenerate(context, input) {
102
+ return call(context, 'rodin_generate', input);
103
+ }
104
+ export async function rodinGenerateBang(context, input) {
105
+ return call(context, 'rodin_generate_bang', input);
106
+ }
107
+ export async function rodinGetStatus(context, input) {
108
+ return call(context, 'rodin_get_status', input);
109
+ }
110
+ export async function rodinWait(context, input) {
111
+ return call(context, 'rodin_wait', input);
112
+ }
113
+ export async function rodinGetResult(context, input) {
114
+ return call(context, 'rodin_get_result', input);
115
+ }
116
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK1C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAC5B,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CACpE,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAE,QAAQ,EAAE,OAAO,EAAyC,EAC5D,MAAsC;IAEtC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,GAAG,EAAE;QACvD,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,uBAAuB,EAAE,OAAO,EAAE,EAAE;QAC9D,YAAY,EAAE,WAAW,CAAC,QAAQ;YAChC,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC;YACvC,CAAC,CAAC,SAAS;KACd,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,MAAM,KAAK,GAAW,EAAE,EACtB,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IACvC,IAAI,MAA0B,CAAC;IAC/B,GAAG,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5D,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QACzB,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC7E,CAAC,QAAQ,MAAM,EAAE;IACjB,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA4C,EAC5C,OAAqB;IAErB,IAAI,OAAO;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CACvE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CACzD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAa;IAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3B,OAAO,MAAM,CAAC,WAAW,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAsB;IAC/C,IAAI,MAAM,CAAC,OAAO;QAChB,MAAM,IAAI,KAAK,CACb,qBACE,MAAM,CAAC,OAAO;YACZ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,0BACnB,EAAE,CACH,CAAC;IACJ,IAAI,MAAM,CAAC,iBAAiB;QAAE,OAAO,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACzE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,IAAI,KAAK,CACd,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,6EAA6E,EACtI,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,OAAoB,EAAE,IAAY,EAAE,KAAc;IACpE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CACzB,IAAI,EACJ,KAAK,EACL,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CACvD,CAAC;QACF,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE;YACjE,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,QAA0B,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAWD,MAAM,UAAU,gBAAgB,CAAC,OAAoB,EAAE,KAAoB;IACzE,WAAW,CACT,gBAAgB,EAChB,KAAK,EACL,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,EAClE,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAoB,EACpB,KAEC;IAED,OAAO,IAAI,CAAC,OAAO,EAAE,sBAAsB,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAoB,EACpB,KAOC;IAED,OAAO,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAoB,EACpB,KAAoB;IAEpB,OAAO,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAoB,EACpB,KAUC;IAED,OAAO,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAoB,EACpB,KAAgC;IAEhC,OAAO,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAoB,EACpB,KAA0D;IAE1D,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAoB,EACpB,KAAgC;IAEhC,OAAO,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ToolContext } from './mcp.js';
2
+ import type { GenerateOptions } from './types.js';
3
+ export declare function poll(generationId: string, timeoutSeconds?: number, context?: ToolContext): Promise<import("./types.js").Payload>;
4
+ export declare function generate(options: GenerateOptions, context?: ToolContext): Promise<import("./types.js").Payload>;
5
+ export declare function status(generationId: string, context?: ToolContext): Promise<import("./types.js").Payload>;
6
+ export declare function result(generationId: string, context?: ToolContext): Promise<import("./types.js").Payload>;
7
+ export interface BangOptions {
8
+ instruction?: string;
9
+ strength?: number;
10
+ format?: string;
11
+ }
12
+ export declare function bang(generationId: string, options?: BangOptions, context?: ToolContext): Promise<import("./types.js").Payload>;
@@ -0,0 +1,139 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { readFile, stat } from 'node:fs/promises';
3
+ import { basename, extname } from 'node:path';
4
+ import { rodinCreateUploads, rodinGenerate, rodinGenerateBang, rodinGetStatus, rodinGetResult, rodinWait, validateGenerate, withToolContext, } from './mcp.js';
5
+ import { omitUndefined } from './utils.js';
6
+ const mimeTypes = {
7
+ '.jpg': 'image/jpeg',
8
+ '.jpeg': 'image/jpeg',
9
+ '.png': 'image/png',
10
+ '.webp': 'image/webp',
11
+ '.tif': 'image/tiff',
12
+ '.tiff': 'image/tiff',
13
+ '.gif': 'image/gif',
14
+ '.avif': 'image/avif',
15
+ '.heic': 'image/heic',
16
+ '.heif': 'image/heif',
17
+ '.bmp': 'image/bmp',
18
+ '.jp2': 'image/jp2',
19
+ '.jpx': 'image/jpx',
20
+ '.jpm': 'image/jpm',
21
+ '.mj2': 'image/mj2',
22
+ };
23
+ const defaultPollTimeoutSeconds = 30;
24
+ // Leave ample headroom under the MCP client's 60-second per-request timeout.
25
+ const maximumWaitCallSeconds = 30;
26
+ export async function poll(generationId, timeoutSeconds = defaultPollTimeoutSeconds, context) {
27
+ return withToolContext(async (context) => {
28
+ if (!Number.isSafeInteger(timeoutSeconds) || timeoutSeconds < 1)
29
+ throw new Error('Poll timeout must be a positive integer number of seconds');
30
+ let remainingSeconds = timeoutSeconds;
31
+ let latest;
32
+ do {
33
+ const waitSeconds = Math.min(remainingSeconds, maximumWaitCallSeconds);
34
+ latest = await rodinWait(context, {
35
+ generation_id: generationId,
36
+ timeout_seconds: waitSeconds,
37
+ });
38
+ if (latest.timed_out !== true)
39
+ return latest;
40
+ remainingSeconds -= waitSeconds;
41
+ } while (remainingSeconds > 0);
42
+ return latest;
43
+ }, context);
44
+ }
45
+ export async function generate(options, context) {
46
+ return withToolContext(async (context) => {
47
+ const paths = options.image ?? [];
48
+ if (paths.length > 5)
49
+ throw new Error('Provide at most five images');
50
+ if (!paths.length && !options.prompt?.trim())
51
+ throw new Error('Provide --prompt or --image');
52
+ const input = omitUndefined({
53
+ prompt: options.prompt,
54
+ tier: options.tier,
55
+ mesh_mode: options.meshMode,
56
+ geometry_file_format: options.format,
57
+ quality_override: options.quality,
58
+ });
59
+ const images = await Promise.all(paths.map(async (path) => {
60
+ const mime = mimeTypes[extname(path).toLowerCase()];
61
+ if (!mime)
62
+ throw new Error(`Unsupported image file extension: ${path}`);
63
+ if (!(await stat(path)).isFile())
64
+ throw new Error(`Image is not a regular file: ${path}`);
65
+ const body = await readFile(path);
66
+ if (!body.length)
67
+ throw new Error(`Image is empty: ${path}`);
68
+ return {
69
+ body,
70
+ file: {
71
+ filename: basename(path),
72
+ mime_type: mime,
73
+ size_bytes: body.length,
74
+ },
75
+ };
76
+ }));
77
+ // Validate generation options before creating uploads. IDs are assigned below.
78
+ validateGenerate(context, {
79
+ ...input,
80
+ ...(images.length
81
+ ? { reference_upload_ids: images.map(() => randomUUID()) }
82
+ : {}),
83
+ });
84
+ if (images.length) {
85
+ const { uploads } = await rodinCreateUploads(context, {
86
+ files: images.map((image) => image.file),
87
+ });
88
+ if (!Array.isArray(uploads) || uploads.length !== images.length)
89
+ throw new Error('Server returned an unexpected number of image uploads');
90
+ // Validate all destinations before sending any image bytes.
91
+ for (const upload of uploads) {
92
+ const url = new URL(upload.upload_url);
93
+ if (url.protocol !== 'https:')
94
+ throw new Error('Image upload URL must use HTTPS');
95
+ if (upload.method !== 'PUT' ||
96
+ typeof upload.upload_id !== 'string' ||
97
+ !upload.headers ||
98
+ typeof upload.headers['Content-Type'] !== 'string')
99
+ throw new Error('Server returned an invalid image upload');
100
+ }
101
+ validateGenerate(context, {
102
+ ...input,
103
+ reference_upload_ids: uploads.map((u) => u.upload_id),
104
+ });
105
+ for (const [index, upload] of uploads.entries()) {
106
+ // Presigned URL authentication only; never forward MCP credentials.
107
+ const response = await fetch(upload.upload_url, {
108
+ method: 'PUT',
109
+ headers: upload.headers,
110
+ body: images[index].body,
111
+ redirect: 'error',
112
+ signal: AbortSignal.timeout(60000),
113
+ });
114
+ await response.body?.cancel();
115
+ if (!response.ok)
116
+ throw new Error(`Image ${index + 1} upload failed (HTTP ${response.status}); generation was not started`);
117
+ }
118
+ input.reference_upload_ids = uploads.map((upload) => upload.upload_id);
119
+ }
120
+ return rodinGenerate(context, input);
121
+ }, context);
122
+ }
123
+ export async function status(generationId, context) {
124
+ return withToolContext(async (context) => rodinGetStatus(context, { generation_id: generationId }), context);
125
+ }
126
+ export async function result(generationId, context) {
127
+ return withToolContext(async (context) => rodinGetResult(context, { generation_id: generationId }), context);
128
+ }
129
+ export async function bang(generationId, options = {}, context) {
130
+ return withToolContext(async (context) => rodinGenerateBang(context, {
131
+ asset_id: generationId,
132
+ ...omitUndefined({
133
+ instruction: options.instruction,
134
+ strength: options.strength,
135
+ geometry_file_format: options.format,
136
+ }),
137
+ }), context);
138
+ }
139
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Payload } from './types.js';
2
+ export declare function formatOutput(value: Payload, { format, kind }?: {
3
+ format?: string;
4
+ kind?: string;
5
+ }): string;
package/dist/output.js ADDED
@@ -0,0 +1,123 @@
1
+ const initialisms = new Map([
2
+ ['api', 'API'],
3
+ ['cli', 'CLI'],
4
+ ['id', 'ID'],
5
+ ['mime', 'MIME'],
6
+ ['url', 'URL'],
7
+ ['uuid', 'UUID'],
8
+ ]);
9
+ function label(key) {
10
+ const words = key
11
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
12
+ .split(/[\s_-]+/)
13
+ .filter(Boolean)
14
+ .map((word) => initialisms.get(word.toLowerCase()) ?? word.toLowerCase());
15
+ if (!words.length)
16
+ return key;
17
+ if (!initialisms.has(words[0].toLowerCase()))
18
+ words[0] = `${words[0][0].toUpperCase()}${words[0].slice(1)}`;
19
+ return words.join(' ');
20
+ }
21
+ function scalar(value) {
22
+ if (value === null || value === undefined)
23
+ return 'None';
24
+ if (typeof value === 'boolean')
25
+ return value ? 'Yes' : 'No';
26
+ return String(value);
27
+ }
28
+ function scalarLine(prefix, value, continuationIndent) {
29
+ const lines = scalar(value).split('\n');
30
+ return [
31
+ `${prefix}${lines[0]}`,
32
+ ...lines.slice(1).map((line) => `${' '.repeat(continuationIndent)}${line}`),
33
+ ];
34
+ }
35
+ function renderEntry(key, value, indent) {
36
+ const padding = ' '.repeat(indent);
37
+ const prefix = `${padding}${label(key)}:`;
38
+ if (!value || typeof value !== 'object')
39
+ return scalarLine(`${prefix} `, value, prefix.length + 1);
40
+ if (Array.isArray(value))
41
+ return value.length
42
+ ? [prefix, ...renderArray(value, indent + 2)]
43
+ : [`${prefix} None`];
44
+ const entries = Object.entries(value);
45
+ return entries.length
46
+ ? [prefix, ...renderObject(value, indent + 2)]
47
+ : [`${prefix} None`];
48
+ }
49
+ function renderObject(value, indent = 0) {
50
+ return Object.entries(value).flatMap(([key, child]) => renderEntry(key, child, indent));
51
+ }
52
+ function renderArray(value, indent = 0) {
53
+ const padding = ' '.repeat(indent);
54
+ return value.flatMap((item) => {
55
+ if (!item || typeof item !== 'object')
56
+ return scalarLine(`${padding}- `, item, indent + 2);
57
+ if (Array.isArray(item))
58
+ return [`${padding}-`, ...renderArray(item, indent + 2)];
59
+ const entries = Object.entries(item);
60
+ if (!entries.length)
61
+ return [`${padding}- None`];
62
+ const [[firstKey, firstValue], ...rest] = entries;
63
+ if (!firstValue || typeof firstValue !== 'object') {
64
+ const firstPrefix = `${padding}- ${label(firstKey)}: `;
65
+ return [
66
+ ...scalarLine(firstPrefix, firstValue, firstPrefix.length),
67
+ ...rest.flatMap(([key, child]) => renderEntry(key, child, indent + 2)),
68
+ ];
69
+ }
70
+ return [
71
+ `${padding}- ${label(firstKey)}:`,
72
+ ...(Array.isArray(firstValue)
73
+ ? renderArray(firstValue, indent + 4)
74
+ : renderObject(firstValue, indent + 4)),
75
+ ...rest.flatMap(([key, child]) => renderEntry(key, child, indent + 2)),
76
+ ];
77
+ });
78
+ }
79
+ function formatAccount(value) {
80
+ if (!value.authenticated)
81
+ return 'Not authenticated. Run hyper3d auth login.';
82
+ const workspace = value.wallet.type === 'group'
83
+ ? `${value.wallet.name || 'Team'} (${value.wallet.group_uuid})`
84
+ : 'Personal';
85
+ const lines = [
86
+ `Authenticated as ${value.user.username}`,
87
+ `User ID: ${value.user.uuid}`,
88
+ `Workspace: ${workspace}`,
89
+ 'Credits:',
90
+ ` Regular: ${scalar(value.wallet.balance)}`,
91
+ ];
92
+ if (value.wallet.type === 'personal')
93
+ lines.push(` Subscription: ${scalar(value.wallet.subscription_balance)}`);
94
+ lines.push(` Frozen: ${scalar(value.wallet.frozen)}`);
95
+ return lines.join('\n');
96
+ }
97
+ function formatHuman(value, kind) {
98
+ if (kind === 'auth-login')
99
+ return 'Authenticated successfully.';
100
+ if (kind === 'auth-logout')
101
+ return 'Local credentials removed.';
102
+ if (kind === 'account')
103
+ return formatAccount(value);
104
+ if (!value || typeof value !== 'object')
105
+ return scalar(value);
106
+ if (Array.isArray(value))
107
+ return renderArray(value).join('\n');
108
+ const displayed = value.stage && typeof value.stage === 'object'
109
+ ? {
110
+ ...value,
111
+ stage: `${value.stage.name} (${value.stage.current}/${value.stage.total})`,
112
+ }
113
+ : value;
114
+ return renderObject(displayed).join('\n');
115
+ }
116
+ export function formatOutput(value, { format = 'human', kind } = {}) {
117
+ if (format === 'json')
118
+ return JSON.stringify(value, null, 2);
119
+ if (format === 'human')
120
+ return formatHuman(value, kind);
121
+ throw new Error(`Unsupported output format: ${format}`);
122
+ }
123
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Payload } from './types.js';
2
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
3
+ export declare const baseSchema: {
4
+ tools: Tool[];
5
+ };
6
+ export declare function validateInput(schema: Payload, value: unknown): void;
7
+ export declare function prepareCall(name: string, input: Payload, remote: Tool | undefined, warn?: (message: string) => void): {
8
+ name: string;
9
+ arguments: Payload;
10
+ };