@meshy-ai/cli 0.1.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/.env.example +14 -0
- package/LICENSE +21 -0
- package/README.md +376 -0
- package/dist/client/endpoints/analyze-printability.d.ts +5 -0
- package/dist/client/endpoints/analyze-printability.d.ts.map +1 -0
- package/dist/client/endpoints/analyze-printability.js +7 -0
- package/dist/client/endpoints/analyze-printability.js.map +1 -0
- package/dist/client/endpoints/animate.d.ts +6 -0
- package/dist/client/endpoints/animate.d.ts.map +1 -0
- package/dist/client/endpoints/animate.js +8 -0
- package/dist/client/endpoints/animate.js.map +1 -0
- package/dist/client/endpoints/balance.d.ts +9 -0
- package/dist/client/endpoints/balance.d.ts.map +1 -0
- package/dist/client/endpoints/balance.js +27 -0
- package/dist/client/endpoints/balance.js.map +1 -0
- package/dist/client/endpoints/base.d.ts +24 -0
- package/dist/client/endpoints/base.d.ts.map +1 -0
- package/dist/client/endpoints/base.js +87 -0
- package/dist/client/endpoints/base.js.map +1 -0
- package/dist/client/endpoints/convert.d.ts +5 -0
- package/dist/client/endpoints/convert.d.ts.map +1 -0
- package/dist/client/endpoints/convert.js +7 -0
- package/dist/client/endpoints/convert.js.map +1 -0
- package/dist/client/endpoints/image-to-3d.d.ts +5 -0
- package/dist/client/endpoints/image-to-3d.d.ts.map +1 -0
- package/dist/client/endpoints/image-to-3d.js +7 -0
- package/dist/client/endpoints/image-to-3d.js.map +1 -0
- package/dist/client/endpoints/image-to-image.d.ts +5 -0
- package/dist/client/endpoints/image-to-image.d.ts.map +1 -0
- package/dist/client/endpoints/image-to-image.js +7 -0
- package/dist/client/endpoints/image-to-image.js.map +1 -0
- package/dist/client/endpoints/multi-color-print.d.ts +5 -0
- package/dist/client/endpoints/multi-color-print.d.ts.map +1 -0
- package/dist/client/endpoints/multi-color-print.js +7 -0
- package/dist/client/endpoints/multi-color-print.js.map +1 -0
- package/dist/client/endpoints/multi-image-to-3d.d.ts +5 -0
- package/dist/client/endpoints/multi-image-to-3d.d.ts.map +1 -0
- package/dist/client/endpoints/multi-image-to-3d.js +7 -0
- package/dist/client/endpoints/multi-image-to-3d.js.map +1 -0
- package/dist/client/endpoints/remesh.d.ts +5 -0
- package/dist/client/endpoints/remesh.d.ts.map +1 -0
- package/dist/client/endpoints/remesh.js +7 -0
- package/dist/client/endpoints/remesh.js.map +1 -0
- package/dist/client/endpoints/repair-printability.d.ts +5 -0
- package/dist/client/endpoints/repair-printability.d.ts.map +1 -0
- package/dist/client/endpoints/repair-printability.js +7 -0
- package/dist/client/endpoints/repair-printability.js.map +1 -0
- package/dist/client/endpoints/resize.d.ts +5 -0
- package/dist/client/endpoints/resize.d.ts.map +1 -0
- package/dist/client/endpoints/resize.js +7 -0
- package/dist/client/endpoints/resize.js.map +1 -0
- package/dist/client/endpoints/retexture.d.ts +5 -0
- package/dist/client/endpoints/retexture.d.ts.map +1 -0
- package/dist/client/endpoints/retexture.js +7 -0
- package/dist/client/endpoints/retexture.js.map +1 -0
- package/dist/client/endpoints/rigging.d.ts +6 -0
- package/dist/client/endpoints/rigging.d.ts.map +1 -0
- package/dist/client/endpoints/rigging.js +8 -0
- package/dist/client/endpoints/rigging.js.map +1 -0
- package/dist/client/endpoints/text-to-3d.d.ts +6 -0
- package/dist/client/endpoints/text-to-3d.d.ts.map +1 -0
- package/dist/client/endpoints/text-to-3d.js +8 -0
- package/dist/client/endpoints/text-to-3d.js.map +1 -0
- package/dist/client/endpoints/text-to-image.d.ts +5 -0
- package/dist/client/endpoints/text-to-image.d.ts.map +1 -0
- package/dist/client/endpoints/text-to-image.js +7 -0
- package/dist/client/endpoints/text-to-image.js.map +1 -0
- package/dist/client/errors.d.ts +23 -0
- package/dist/client/errors.d.ts.map +1 -0
- package/dist/client/errors.js +82 -0
- package/dist/client/errors.js.map +1 -0
- package/dist/client/index.d.ts +48 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +147 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +298 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +97 -0
- package/dist/client/types.js.map +1 -0
- package/dist/cmd/analyze-printability.d.ts +8 -0
- package/dist/cmd/analyze-printability.d.ts.map +1 -0
- package/dist/cmd/analyze-printability.js +34 -0
- package/dist/cmd/analyze-printability.js.map +1 -0
- package/dist/cmd/animate.d.ts +9 -0
- package/dist/cmd/animate.d.ts.map +1 -0
- package/dist/cmd/animate.js +51 -0
- package/dist/cmd/animate.js.map +1 -0
- package/dist/cmd/api.d.ts +9 -0
- package/dist/cmd/api.d.ts.map +1 -0
- package/dist/cmd/api.js +50 -0
- package/dist/cmd/api.js.map +1 -0
- package/dist/cmd/auth.d.ts +19 -0
- package/dist/cmd/auth.d.ts.map +1 -0
- package/dist/cmd/auth.js +583 -0
- package/dist/cmd/auth.js.map +1 -0
- package/dist/cmd/balance.d.ts +6 -0
- package/dist/cmd/balance.d.ts.map +1 -0
- package/dist/cmd/balance.js +14 -0
- package/dist/cmd/balance.js.map +1 -0
- package/dist/cmd/convert.d.ts +8 -0
- package/dist/cmd/convert.d.ts.map +1 -0
- package/dist/cmd/convert.js +40 -0
- package/dist/cmd/convert.js.map +1 -0
- package/dist/cmd/delete.d.ts +7 -0
- package/dist/cmd/delete.d.ts.map +1 -0
- package/dist/cmd/delete.js +19 -0
- package/dist/cmd/delete.js.map +1 -0
- package/dist/cmd/image-to-3d.d.ts +12 -0
- package/dist/cmd/image-to-3d.d.ts.map +1 -0
- package/dist/cmd/image-to-3d.js +97 -0
- package/dist/cmd/image-to-3d.js.map +1 -0
- package/dist/cmd/image-to-image.d.ts +5 -0
- package/dist/cmd/image-to-image.d.ts.map +1 -0
- package/dist/cmd/image-to-image.js +56 -0
- package/dist/cmd/image-to-image.js.map +1 -0
- package/dist/cmd/make.d.ts +31 -0
- package/dist/cmd/make.d.ts.map +1 -0
- package/dist/cmd/make.js +195 -0
- package/dist/cmd/make.js.map +1 -0
- package/dist/cmd/multi-color-print.d.ts +6 -0
- package/dist/cmd/multi-color-print.d.ts.map +1 -0
- package/dist/cmd/multi-color-print.js +44 -0
- package/dist/cmd/multi-color-print.js.map +1 -0
- package/dist/cmd/multi-image-to-3d.d.ts +5 -0
- package/dist/cmd/multi-image-to-3d.d.ts.map +1 -0
- package/dist/cmd/multi-image-to-3d.js +72 -0
- package/dist/cmd/multi-image-to-3d.js.map +1 -0
- package/dist/cmd/remesh.d.ts +8 -0
- package/dist/cmd/remesh.d.ts.map +1 -0
- package/dist/cmd/remesh.js +49 -0
- package/dist/cmd/remesh.js.map +1 -0
- package/dist/cmd/repair-printability.d.ts +7 -0
- package/dist/cmd/repair-printability.d.ts.map +1 -0
- package/dist/cmd/repair-printability.js +32 -0
- package/dist/cmd/repair-printability.js.map +1 -0
- package/dist/cmd/resize.d.ts +8 -0
- package/dist/cmd/resize.d.ts.map +1 -0
- package/dist/cmd/resize.js +51 -0
- package/dist/cmd/resize.js.map +1 -0
- package/dist/cmd/resources.d.ts +18 -0
- package/dist/cmd/resources.d.ts.map +1 -0
- package/dist/cmd/resources.js +59 -0
- package/dist/cmd/resources.js.map +1 -0
- package/dist/cmd/retexture.d.ts +5 -0
- package/dist/cmd/retexture.d.ts.map +1 -0
- package/dist/cmd/retexture.js +64 -0
- package/dist/cmd/retexture.js.map +1 -0
- package/dist/cmd/rigging.d.ts +6 -0
- package/dist/cmd/rigging.d.ts.map +1 -0
- package/dist/cmd/rigging.js +40 -0
- package/dist/cmd/rigging.js.map +1 -0
- package/dist/cmd/text-to-3d.d.ts +14 -0
- package/dist/cmd/text-to-3d.d.ts.map +1 -0
- package/dist/cmd/text-to-3d.js +76 -0
- package/dist/cmd/text-to-3d.js.map +1 -0
- package/dist/cmd/text-to-image.d.ts +5 -0
- package/dist/cmd/text-to-image.d.ts.map +1 -0
- package/dist/cmd/text-to-image.js +53 -0
- package/dist/cmd/text-to-image.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/config.d.ts +46 -0
- package/dist/internal/config.d.ts.map +1 -0
- package/dist/internal/config.js +94 -0
- package/dist/internal/config.js.map +1 -0
- package/dist/internal/credentials.d.ts +106 -0
- package/dist/internal/credentials.d.ts.map +1 -0
- package/dist/internal/credentials.js +297 -0
- package/dist/internal/credentials.js.map +1 -0
- package/dist/internal/device-state.d.ts +45 -0
- package/dist/internal/device-state.d.ts.map +1 -0
- package/dist/internal/device-state.js +180 -0
- package/dist/internal/device-state.js.map +1 -0
- package/dist/internal/device.d.ts +79 -0
- package/dist/internal/device.d.ts.map +1 -0
- package/dist/internal/device.js +374 -0
- package/dist/internal/device.js.map +1 -0
- package/dist/internal/download.d.ts +34 -0
- package/dist/internal/download.d.ts.map +1 -0
- package/dist/internal/download.js +283 -0
- package/dist/internal/download.js.map +1 -0
- package/dist/internal/errors.d.ts +66 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +169 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/file-input.d.ts +24 -0
- package/dist/internal/file-input.d.ts.map +1 -0
- package/dist/internal/file-input.js +164 -0
- package/dist/internal/file-input.js.map +1 -0
- package/dist/internal/flags.d.ts +9 -0
- package/dist/internal/flags.d.ts.map +1 -0
- package/dist/internal/flags.js +31 -0
- package/dist/internal/flags.js.map +1 -0
- package/dist/internal/global-options.d.ts +16 -0
- package/dist/internal/global-options.d.ts.map +1 -0
- package/dist/internal/global-options.js +57 -0
- package/dist/internal/global-options.js.map +1 -0
- package/dist/internal/headless.d.ts +69 -0
- package/dist/internal/headless.d.ts.map +1 -0
- package/dist/internal/headless.js +101 -0
- package/dist/internal/headless.js.map +1 -0
- package/dist/internal/image-models.d.ts +20 -0
- package/dist/internal/image-models.d.ts.map +1 -0
- package/dist/internal/image-models.js +40 -0
- package/dist/internal/image-models.js.map +1 -0
- package/dist/internal/logger.d.ts +14 -0
- package/dist/internal/logger.d.ts.map +1 -0
- package/dist/internal/logger.js +42 -0
- package/dist/internal/logger.js.map +1 -0
- package/dist/internal/make-plan.d.ts +41 -0
- package/dist/internal/make-plan.d.ts.map +1 -0
- package/dist/internal/make-plan.js +67 -0
- package/dist/internal/make-plan.js.map +1 -0
- package/dist/internal/oauth.d.ts +95 -0
- package/dist/internal/oauth.d.ts.map +1 -0
- package/dist/internal/oauth.js +365 -0
- package/dist/internal/oauth.js.map +1 -0
- package/dist/internal/output.d.ts +15 -0
- package/dist/internal/output.d.ts.map +1 -0
- package/dist/internal/output.js +66 -0
- package/dist/internal/output.js.map +1 -0
- package/dist/internal/payload.d.ts +9 -0
- package/dist/internal/payload.d.ts.map +1 -0
- package/dist/internal/payload.js +42 -0
- package/dist/internal/payload.js.map +1 -0
- package/dist/internal/poll.d.ts +17 -0
- package/dist/internal/poll.d.ts.map +1 -0
- package/dist/internal/poll.js +27 -0
- package/dist/internal/poll.js.map +1 -0
- package/dist/internal/pricing.d.ts +23 -0
- package/dist/internal/pricing.d.ts.map +1 -0
- package/dist/internal/pricing.js +24 -0
- package/dist/internal/pricing.js.map +1 -0
- package/dist/internal/report.d.ts +40 -0
- package/dist/internal/report.d.ts.map +1 -0
- package/dist/internal/report.js +48 -0
- package/dist/internal/report.js.map +1 -0
- package/dist/internal/runtime.d.ts +66 -0
- package/dist/internal/runtime.d.ts.map +1 -0
- package/dist/internal/runtime.js +160 -0
- package/dist/internal/runtime.js.map +1 -0
- package/dist/internal/task-command.d.ts +39 -0
- package/dist/internal/task-command.d.ts.map +1 -0
- package/dist/internal/task-command.js +189 -0
- package/dist/internal/task-command.js.map +1 -0
- package/dist/internal/update-notifier.d.ts +160 -0
- package/dist/internal/update-notifier.d.ts.map +1 -0
- package/dist/internal/update-notifier.js +445 -0
- package/dist/internal/update-notifier.js.map +1 -0
- package/dist/internal/user-agent.d.ts +6 -0
- package/dist/internal/user-agent.d.ts.map +1 -0
- package/dist/internal/user-agent.js +7 -0
- package/dist/internal/user-agent.js.map +1 -0
- package/dist/internal/version.d.ts +2 -0
- package/dist/internal/version.d.ts.map +1 -0
- package/dist/internal/version.js +11 -0
- package/dist/internal/version.js.map +1 -0
- package/dist/root.d.ts +13 -0
- package/dist/root.d.ts.map +1 -0
- package/dist/root.js +148 -0
- package/dist/root.js.map +1 -0
- package/package.json +65 -0
- package/skills/meshy-cli/SKILL.md +99 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* convert — https://docs.meshy.ai/en/api/convert
|
|
3
|
+
*
|
|
4
|
+
* Standalone format conversion (extracted from remesh by Meshy in May 2026).
|
|
5
|
+
* The task type is `convert`, so get/wait/delete live right here.
|
|
6
|
+
*/
|
|
7
|
+
import { parseCsv } from "../internal/flags.js";
|
|
8
|
+
import { UsageError } from "../internal/errors.js";
|
|
9
|
+
import { buildResourceCommand } from "../internal/task-command.js";
|
|
10
|
+
const spec = {
|
|
11
|
+
name: "convert",
|
|
12
|
+
description: "Convert a 3D model to one or more target formats without altering its topology or " +
|
|
13
|
+
"polycount",
|
|
14
|
+
create: {
|
|
15
|
+
description: "Create a convert task",
|
|
16
|
+
configure(cmd) {
|
|
17
|
+
return cmd
|
|
18
|
+
.option("--input-task-id <id>", "source SUCCEEDED task (takes priority over --model-url)")
|
|
19
|
+
.option("--model-url <src>", "3D model as http(s) URL or local file path (.glb/.gltf/.obj/.fbx/.stl)")
|
|
20
|
+
.option("--target-formats <csv>", "required — glb,fbx,obj,usdz,blend,stl,3mf", parseCsv);
|
|
21
|
+
},
|
|
22
|
+
toPayload(opts) {
|
|
23
|
+
if (!opts.inputTaskId && !opts.modelUrl && !opts.data) {
|
|
24
|
+
throw new UsageError("provide --input-task-id or --model-url");
|
|
25
|
+
}
|
|
26
|
+
const formats = opts.targetFormats;
|
|
27
|
+
if ((!formats || formats.length === 0) && !opts.data) {
|
|
28
|
+
throw new UsageError("--target-formats is required (e.g. --target-formats fbx,obj)");
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
input_task_id: opts.inputTaskId,
|
|
32
|
+
model_url: opts.modelUrl,
|
|
33
|
+
target_formats: formats,
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
endpointOf: (c) => c.convert,
|
|
38
|
+
};
|
|
39
|
+
export const convertCommand = buildResourceCommand(spec);
|
|
40
|
+
//# sourceMappingURL=convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/cmd/convert.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,6BAA6B,CAAC;AAE7F,MAAM,IAAI,GAAwB;IAChC,IAAI,EAAE,SAAS;IACf,WAAW,EACT,oFAAoF;QACpF,WAAW;IACb,MAAM,EAAE;QACN,WAAW,EAAE,uBAAuB;QACpC,SAAS,CAAC,GAAG;YACX,OAAO,GAAG;iBACP,MAAM,CAAC,sBAAsB,EAAE,yDAAyD,CAAC;iBACzF,MAAM,CAAC,mBAAmB,EAAE,wEAAwE,CAAC;iBACrG,MAAM,CAAC,wBAAwB,EAAE,2CAA2C,EAAE,QAAQ,CAAC,CAAC;QAC7F,CAAC;QACD,SAAS,CAAC,IAAI;YACZ,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtD,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAqC,CAAC;YAC3D,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACrD,MAAM,IAAI,UAAU,CAAC,8DAA8D,CAAC,CAAC;YACvF,CAAC;YACD,OAAO;gBACL,aAAa,EAAE,IAAI,CAAC,WAAW;gBAC/B,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,cAAc,EAAE,OAAO;aACxB,CAAC;QACJ,CAAC;KACF;IACD,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO;CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level `meshy-cli delete <id>` — destructive. Uses the unified task
|
|
3
|
+
* lookup (v2 /text-to-3d/<id>) so the caller doesn't need to know the type.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
export declare const deleteCommand: Command;
|
|
7
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/cmd/delete.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SAUtB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level `meshy-cli delete <id>` — destructive. Uses the unified task
|
|
3
|
+
* lookup (v2 /text-to-3d/<id>) so the caller doesn't need to know the type.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import { emit } from "../internal/output.js";
|
|
7
|
+
import { buildRuntime, readGlobalFlags } from "../internal/runtime.js";
|
|
8
|
+
export const deleteCommand = new Command("delete")
|
|
9
|
+
.description("Delete any task by id")
|
|
10
|
+
.argument("<task-id>", "Meshy task id")
|
|
11
|
+
.action(async (taskId, _opts, thisCmd) => {
|
|
12
|
+
const runtime = await buildRuntime(readGlobalFlags(thisCmd));
|
|
13
|
+
await runtime.client.textTo3d.delete(taskId);
|
|
14
|
+
emit({ task_id: taskId, deleted: true }, {
|
|
15
|
+
format: runtime.flags.format,
|
|
16
|
+
file: runtime.flags.output,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/cmd/delete.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEvE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,uBAAuB,CAAC;KACpC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;KACtC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,KAA8B,EAAE,OAAgB,EAAE,EAAE;IACjF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QACvC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;QAC5B,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;KAC3B,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* image-to-3d — https://docs.meshy.ai/en/api/image-to-3d
|
|
3
|
+
*
|
|
4
|
+
* The mode IS the model — there is no model flag:
|
|
5
|
+
* - standard → meshy-6 (server default "latest") — full-detail generation;
|
|
6
|
+
* polycount is remesh's job afterwards.
|
|
7
|
+
* - smart-topology → meshy-t2 (server default) — component-aware low-poly
|
|
8
|
+
* with a native --target-polycount; the budget pick for game-ready
|
|
9
|
+
* geometry.
|
|
10
|
+
*/
|
|
11
|
+
export declare const imageTo3dCommand: import("commander").Command;
|
|
12
|
+
//# sourceMappingURL=image-to-3d.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-to-3d.d.ts","sourceRoot":"","sources":["../../src/cmd/image-to-3d.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoIH,eAAO,MAAM,gBAAgB,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* image-to-3d — https://docs.meshy.ai/en/api/image-to-3d
|
|
3
|
+
*
|
|
4
|
+
* The mode IS the model — there is no model flag:
|
|
5
|
+
* - standard → meshy-6 (server default "latest") — full-detail generation;
|
|
6
|
+
* polycount is remesh's job afterwards.
|
|
7
|
+
* - smart-topology → meshy-t2 (server default) — component-aware low-poly
|
|
8
|
+
* with a native --target-polycount; the budget pick for game-ready
|
|
9
|
+
* geometry.
|
|
10
|
+
*/
|
|
11
|
+
import { Option } from "commander";
|
|
12
|
+
import { parseBool, parseCsv, parseInt10 } from "../internal/flags.js";
|
|
13
|
+
import { UsageError } from "../internal/errors.js";
|
|
14
|
+
import { buildResourceCommand } from "../internal/task-command.js";
|
|
15
|
+
const spec = {
|
|
16
|
+
name: "image-to-3d",
|
|
17
|
+
description: "Generate a 3D model from a single reference image (clean backgrounds and clear edges " +
|
|
18
|
+
"give the best results). Outputs an untextured draft mesh by default — texture the " +
|
|
19
|
+
"confirmed mesh with `retexture`, or pass --should-texture true for one-shot. " +
|
|
20
|
+
"Topology/polycount are not tunable in standard mode — chain `remesh` afterwards; " +
|
|
21
|
+
"smart-topology mode has a native polycount and costs less",
|
|
22
|
+
create: {
|
|
23
|
+
description: "Create an image-to-3d task",
|
|
24
|
+
configure(cmd) {
|
|
25
|
+
return cmd
|
|
26
|
+
.option("--image-url <src>", "reference image; http(s) URL or local file path")
|
|
27
|
+
.option("--input-task-id <id>", "alternative to --image-url: a SUCCEEDED text-to-image or image-to-image task whose output becomes the source image")
|
|
28
|
+
.addOption(new Option("--model-type <kind>", "standard (default; meshy-6 full-detail generation) | smart-topology (meshy-t2 component-aware low-poly: clean topology, separated parts)").choices(["standard", "smart-topology"]))
|
|
29
|
+
.option("--target-polycount <n>", "smart-topology only: target triangle count, 100-15000 (default: 10000). For standard outputs use remesh", parseInt10)
|
|
30
|
+
.option("--should-texture <bool>", "generate textures (default: false — draft white mesh, the preview stage; texture later with retexture)", parseBool)
|
|
31
|
+
.option("--enable-pbr <bool>", "generate normal/metallic/roughness/emission maps (default: true, so game-engine imports carry the full map set)", parseBool)
|
|
32
|
+
.option("--texture-prompt <text>", "text guidance for texturing (max 600 chars)")
|
|
33
|
+
.addOption(new Option("--texture-resolution <res>", "base color texture size (default: 4k)").choices(["2k", "4k", "8k"]))
|
|
34
|
+
.addOption(new Option("--pose-mode <pose>", "a-pose | t-pose pre-pose characters for rigging; auto (default) lets the model decide").choices(["a-pose", "t-pose", "auto"]))
|
|
35
|
+
.option("--image-enhancement <bool>", "optimize the input image before processing (default: true)", parseBool)
|
|
36
|
+
.option("--remove-lighting <bool>", "strip baked lighting from the base color (default: true)", parseBool)
|
|
37
|
+
.option("--target-formats <csv>", "glb,obj,fbx,stl,usdz,3mf (default: glb)", parseCsv);
|
|
38
|
+
},
|
|
39
|
+
toPayload(opts) {
|
|
40
|
+
if (!opts.imageUrl && !opts.inputTaskId && !opts.data) {
|
|
41
|
+
throw new UsageError("provide --image-url or --input-task-id");
|
|
42
|
+
}
|
|
43
|
+
const smart = opts.modelType === "smart-topology";
|
|
44
|
+
if (opts.targetPolycount != null && !smart) {
|
|
45
|
+
throw new UsageError("--target-polycount applies to --model-type smart-topology only; for standard outputs chain `remesh` afterwards");
|
|
46
|
+
}
|
|
47
|
+
// The API rejects texture knobs on untextured runs; catch it before the wire.
|
|
48
|
+
if (opts.shouldTexture !== true && !opts.data) {
|
|
49
|
+
for (const [flag, value] of [
|
|
50
|
+
["--enable-pbr", opts.enablePbr],
|
|
51
|
+
["--texture-resolution", opts.textureResolution],
|
|
52
|
+
["--texture-prompt", opts.texturePrompt],
|
|
53
|
+
]) {
|
|
54
|
+
if (value !== undefined) {
|
|
55
|
+
throw new UsageError(`${flag} requires --should-texture true (the default output is an untextured draft mesh)`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
image_url: opts.imageUrl,
|
|
61
|
+
input_task_id: opts.inputTaskId,
|
|
62
|
+
model_type: opts.modelType,
|
|
63
|
+
target_polycount: opts.targetPolycount,
|
|
64
|
+
should_texture: opts.shouldTexture,
|
|
65
|
+
enable_pbr: opts.enablePbr,
|
|
66
|
+
texture_prompt: opts.texturePrompt,
|
|
67
|
+
texture_resolution: opts.textureResolution,
|
|
68
|
+
pose_mode: opts.poseMode === "auto" ? undefined : opts.poseMode,
|
|
69
|
+
image_enhancement: opts.imageEnhancement,
|
|
70
|
+
remove_lighting: opts.removeLighting,
|
|
71
|
+
target_formats: opts.targetFormats,
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
toDefaults(opts) {
|
|
75
|
+
// Draft-first: the default output is an untextured white mesh (the
|
|
76
|
+
// preview stage of the prompt → image → mesh → texture pipeline);
|
|
77
|
+
// texturing is its own step, and the API rejects texture knobs on
|
|
78
|
+
// untextured runs, so they ride only when texturing is on — then the
|
|
79
|
+
// game-ready defaults apply: full PBR map set, 4k base color. The
|
|
80
|
+
// model is not a choice — it follows the mode (standard → meshy-6,
|
|
81
|
+
// smart-topology → meshy-t2, both server defaults). Smart topology
|
|
82
|
+
// gets the rigging-friendly 10k polycount. GLB-only output — omitting
|
|
83
|
+
// target_formats makes the API produce every format.
|
|
84
|
+
const texturing = opts.shouldTexture === true;
|
|
85
|
+
return {
|
|
86
|
+
should_texture: false,
|
|
87
|
+
enable_pbr: texturing ? true : undefined,
|
|
88
|
+
texture_resolution: texturing ? "4k" : undefined,
|
|
89
|
+
target_polycount: opts.modelType === "smart-topology" ? 10_000 : undefined,
|
|
90
|
+
target_formats: ["glb"],
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
endpointOf: (c) => c.imageTo3d,
|
|
95
|
+
};
|
|
96
|
+
export const imageTo3dCommand = buildResourceCommand(spec);
|
|
97
|
+
//# sourceMappingURL=image-to-3d.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-to-3d.js","sourceRoot":"","sources":["../../src/cmd/image-to-3d.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-to-image.d.ts","sourceRoot":"","sources":["../../src/cmd/image-to-image.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0EH,eAAO,MAAM,mBAAmB,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* image-to-image — https://docs.meshy.ai/en/api/image-to-image
|
|
3
|
+
*/
|
|
4
|
+
import { Option } from "commander";
|
|
5
|
+
import { parseBool, parseCsv } from "../internal/flags.js";
|
|
6
|
+
import { UsageError } from "../internal/errors.js";
|
|
7
|
+
import { ASPECT_RATIOS, ASPECT_RATIO_HELP, DEFAULT_IMAGE_MODEL, IMAGE_MODELS, IMAGE_MODEL_HELP, checkImageCombo, } from "../internal/image-models.js";
|
|
8
|
+
import { buildResourceCommand } from "../internal/task-command.js";
|
|
9
|
+
const spec = {
|
|
10
|
+
name: "image-to-image",
|
|
11
|
+
description: "Instruction-driven image editing and generation from 1-5 reference images — extraction, " +
|
|
12
|
+
"transformation, combination, restyling",
|
|
13
|
+
create: {
|
|
14
|
+
description: "Create an image-to-image task",
|
|
15
|
+
configure(cmd) {
|
|
16
|
+
return cmd
|
|
17
|
+
.addOption(new Option("--ai-model <model>", IMAGE_MODEL_HELP).choices([...IMAGE_MODELS]))
|
|
18
|
+
.option("--prompt <text>", "required — a straightforward, specific instruction, e.g. 'Extract the person on the " +
|
|
19
|
+
"left onto a clean white background' or 'Restyle into chibi cartoon style'. With " +
|
|
20
|
+
"multiple references say 'the first image', 'the second image', ...")
|
|
21
|
+
.option("--reference-image-urls <csv>", "required — 1-5 reference images as CSV; each entry is a URL or local file path", parseCsv)
|
|
22
|
+
.option("--generate-multi-view <bool>", "generate multi-angle views of the subject; mutually exclusive with --aspect-ratio", parseBool)
|
|
23
|
+
.addOption(new Option("--aspect-ratio <ratio>", ASPECT_RATIO_HELP).choices([...ASPECT_RATIOS]));
|
|
24
|
+
},
|
|
25
|
+
toPayload(opts) {
|
|
26
|
+
if (!opts.prompt && !opts.data) {
|
|
27
|
+
throw new UsageError("--prompt is required");
|
|
28
|
+
}
|
|
29
|
+
const urls = opts.referenceImageUrls;
|
|
30
|
+
if ((!urls || urls.length < 1 || urls.length > 5) && !opts.data) {
|
|
31
|
+
throw new UsageError("--reference-image-urls must be a CSV of 1-5 URLs");
|
|
32
|
+
}
|
|
33
|
+
checkImageCombo({
|
|
34
|
+
// With --data in play an unset flag may be supplied there; leave the
|
|
35
|
+
// ratio check to the server rather than validating against a model
|
|
36
|
+
// the request won't use.
|
|
37
|
+
aiModel: opts.aiModel ?? (opts.data ? undefined : DEFAULT_IMAGE_MODEL),
|
|
38
|
+
aspectRatio: opts.aspectRatio,
|
|
39
|
+
generateMultiView: opts.generateMultiView,
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
ai_model: opts.aiModel,
|
|
43
|
+
prompt: opts.prompt,
|
|
44
|
+
reference_image_urls: urls,
|
|
45
|
+
generate_multi_view: opts.generateMultiView,
|
|
46
|
+
aspect_ratio: opts.aspectRatio,
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
toDefaults() {
|
|
50
|
+
return { ai_model: DEFAULT_IMAGE_MODEL };
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
endpointOf: (c) => c.imageToImage,
|
|
54
|
+
};
|
|
55
|
+
export const imageToImageCommand = buildResourceCommand(spec);
|
|
56
|
+
//# sourceMappingURL=image-to-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-to-image.js","sourceRoot":"","sources":["../../src/cmd/image-to-image.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAA4B,MAAM,6BAA6B,CAAC;AAE7F,MAAM,IAAI,GAAwB;IAChC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,0FAA0F;QAC1F,wCAAwC;IAC1C,MAAM,EAAE;QACN,WAAW,EAAE,+BAA+B;QAC5C,SAAS,CAAC,GAAG;YACX,OAAO,GAAG;iBACP,SAAS,CAAC,IAAI,MAAM,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;iBACxF,MAAM,CACL,iBAAiB,EACjB,sFAAsF;gBACpF,kFAAkF;gBAClF,oEAAoE,CACvE;iBACA,MAAM,CACL,8BAA8B,EAC9B,gFAAgF,EAChF,QAAQ,CACT;iBACA,MAAM,CACL,8BAA8B,EAC9B,mFAAmF,EACnF,SAAS,CACV;iBACA,SAAS,CAAC,IAAI,MAAM,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpG,CAAC;QACD,SAAS,CAAC,IAAI;YACZ,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,IAAI,UAAU,CAAC,sBAAsB,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,kBAA0C,CAAC;YAC7D,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChE,MAAM,IAAI,UAAU,CAAC,kDAAkD,CAAC,CAAC;YAC3E,CAAC;YACD,eAAe,CAAC;gBACd,qEAAqE;gBACrE,mEAAmE;gBACnE,yBAAyB;gBACzB,OAAO,EAAG,IAAI,CAAC,OAA8B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC;gBAC9F,WAAW,EAAE,IAAI,CAAC,WAAiC;gBACnD,iBAAiB,EAAE,IAAI,CAAC,iBAAwC;aACjE,CAAC,CAAC;YACH,OAAO;gBACL,QAAQ,EAAE,IAAI,CAAC,OAAO;gBACtB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,oBAAoB,EAAE,IAAI;gBAC1B,mBAAmB,EAAE,IAAI,CAAC,iBAAiB;gBAC3C,YAAY,EAAE,IAAI,CAAC,WAAW;aAC/B,CAAC;QACJ,CAAC;QACD,UAAU;YACR,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC;QAC3C,CAAC;KACF;IACD,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY;CAClC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* make — one command for "give me a 3D model".
|
|
3
|
+
*
|
|
4
|
+
* The per-resource commands mirror the API one endpoint at a time, which
|
|
5
|
+
* leaves the caller to carry task ids between steps by hand. `make` chains the
|
|
6
|
+
* documented flows instead:
|
|
7
|
+
*
|
|
8
|
+
* a prompt → text-to-3d preview → text-to-3d refine
|
|
9
|
+
* an image → image-to-3d (textured)
|
|
10
|
+
*
|
|
11
|
+
* What it deliberately does NOT do: pick a route by inspecting the input,
|
|
12
|
+
* insert an image step ahead of a prompt, or stop for confirmation between
|
|
13
|
+
* stages. Those are judgement calls, and a CLI that makes them silently spends
|
|
14
|
+
* someone else's credits on its own opinion. The resource commands remain the
|
|
15
|
+
* way to compose anything else.
|
|
16
|
+
*
|
|
17
|
+
* When a later step fails, the error carries the finished step's task id and
|
|
18
|
+
* the command that resumes from it, so a retry never re-runs — or re-bills —
|
|
19
|
+
* work that already succeeded.
|
|
20
|
+
*/
|
|
21
|
+
import { Command } from "commander";
|
|
22
|
+
import { type MakePlan } from "../internal/make-plan.js";
|
|
23
|
+
import { type Runtime } from "../internal/runtime.js";
|
|
24
|
+
export declare const makeCommand: Command;
|
|
25
|
+
/**
|
|
26
|
+
* The command that picks the chain back up from a completed step. Only the
|
|
27
|
+
* text route has a resumable hand-off (a preview's latents are what refine
|
|
28
|
+
* consumes); the image route is a single task with nothing to resume.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resumeCommand(plan: MakePlan, completedTaskId: string, runtime: Runtime): string | undefined;
|
|
31
|
+
//# sourceMappingURL=make.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make.d.ts","sourceRoot":"","sources":["../../src/cmd/make.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAK5C,OAAO,EAAY,KAAK,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AAIlF,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAiBrF,eAAO,MAAM,WAAW,SAuCpB,CAAC;AAqGL;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,EACd,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,OAAO,GACf,MAAM,GAAG,SAAS,CAIpB"}
|
package/dist/cmd/make.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* make — one command for "give me a 3D model".
|
|
3
|
+
*
|
|
4
|
+
* The per-resource commands mirror the API one endpoint at a time, which
|
|
5
|
+
* leaves the caller to carry task ids between steps by hand. `make` chains the
|
|
6
|
+
* documented flows instead:
|
|
7
|
+
*
|
|
8
|
+
* a prompt → text-to-3d preview → text-to-3d refine
|
|
9
|
+
* an image → image-to-3d (textured)
|
|
10
|
+
*
|
|
11
|
+
* What it deliberately does NOT do: pick a route by inspecting the input,
|
|
12
|
+
* insert an image step ahead of a prompt, or stop for confirmation between
|
|
13
|
+
* stages. Those are judgement calls, and a CLI that makes them silently spends
|
|
14
|
+
* someone else's credits on its own opinion. The resource commands remain the
|
|
15
|
+
* way to compose anything else.
|
|
16
|
+
*
|
|
17
|
+
* When a later step fails, the error carries the finished step's task id and
|
|
18
|
+
* the command that resumes from it, so a retry never re-runs — or re-bills —
|
|
19
|
+
* work that already succeeded.
|
|
20
|
+
*/
|
|
21
|
+
import { Command, Option } from "commander";
|
|
22
|
+
import { HintedError, UsageError } from "../internal/errors.js";
|
|
23
|
+
import { parseInt10 } from "../internal/flags.js";
|
|
24
|
+
import { resolveImageFields } from "../internal/file-input.js";
|
|
25
|
+
import { logger } from "../internal/logger.js";
|
|
26
|
+
import { planMake } from "../internal/make-plan.js";
|
|
27
|
+
import { emit } from "../internal/output.js";
|
|
28
|
+
import { pollUntilTerminal } from "../internal/poll.js";
|
|
29
|
+
import { PRICING_DOCS } from "../internal/pricing.js";
|
|
30
|
+
import { buildRuntime, readGlobalFlags } from "../internal/runtime.js";
|
|
31
|
+
import { emitTerminalOutcome } from "../internal/task-command.js";
|
|
32
|
+
const DESCRIPTION = "Generate a 3D model in one command. A prompt runs the two-stage text flow " +
|
|
33
|
+
"(preview then refine); an image runs the single textured image-to-3d task. " +
|
|
34
|
+
"Use -o to download the result. Compose anything else from the resource commands";
|
|
35
|
+
export const makeCommand = new Command("make")
|
|
36
|
+
.description(DESCRIPTION)
|
|
37
|
+
.argument("<input>", "a text prompt, a local image path, or an http(s) image URL")
|
|
38
|
+
.addOption(new Option("--dry-run", "print the planned steps and the estimate, then exit without calling the API").default(false))
|
|
39
|
+
.addOption(new Option("--max-credits <n>", "refuse to start when the estimate exceeds this budget")
|
|
40
|
+
.argParser(parseInt10))
|
|
41
|
+
.addOption(new Option("--async", "start the first step and return its task id instead of running the whole chain").default(false))
|
|
42
|
+
.addOption(new Option("--timeout <seconds>", "max seconds to poll each step").default("600"))
|
|
43
|
+
.action(async (input, opts, thisCmd) => {
|
|
44
|
+
const plan = planMake(input);
|
|
45
|
+
const flags = readGlobalFlags(thisCmd);
|
|
46
|
+
// Budget check before anything is created: refusing costs nothing, and a
|
|
47
|
+
// refusal after step one has already billed is not a budget at all.
|
|
48
|
+
if (opts.maxCredits !== undefined && plan.estimatedCredits > opts.maxCredits) {
|
|
49
|
+
throw new UsageError(`estimate ${plan.estimatedCredits} exceeds --max-credits ${opts.maxCredits} ` +
|
|
50
|
+
`(${describeChain(plan)}). Nothing was started.`);
|
|
51
|
+
}
|
|
52
|
+
if (opts.dryRun) {
|
|
53
|
+
emit(planPayload(plan), { format: flags.format });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
await runChain(plan, opts, await buildRuntime(flags));
|
|
57
|
+
});
|
|
58
|
+
async function runChain(plan, opts, runtime) {
|
|
59
|
+
const timeoutSeconds = Number(opts.timeout ?? 600);
|
|
60
|
+
const payloadFor = await buildPayloads(plan);
|
|
61
|
+
/** Task id of the last step that reached SUCCEEDED — what a resume hangs off. */
|
|
62
|
+
let completedTaskId = "";
|
|
63
|
+
for (const step of plan.steps) {
|
|
64
|
+
const endpoint = endpointFor(step, runtime);
|
|
65
|
+
const payload = payloadFor[step.index - 1]?.(completedTaskId) ?? {};
|
|
66
|
+
logger.debug(`make step ${step.index} payload`, payload);
|
|
67
|
+
// The id is announced before polling starts: an interrupted run leaves a
|
|
68
|
+
// task progressing server-side, and the caller needs its id to exist
|
|
69
|
+
// somewhere other than this process's memory.
|
|
70
|
+
const taskId = await endpoint.create(payload);
|
|
71
|
+
announceStart(plan, step, taskId);
|
|
72
|
+
const started = Date.now();
|
|
73
|
+
const { task, timedOut } = await pollUntilTerminal(endpoint, taskId, {
|
|
74
|
+
timeoutSeconds,
|
|
75
|
+
intervalMs: runtime.config.pollIntervalMs,
|
|
76
|
+
});
|
|
77
|
+
const elapsed = (Date.now() - started) / 1000;
|
|
78
|
+
announceOutcome(task, timedOut, elapsed);
|
|
79
|
+
if (timedOut || task.status !== "SUCCEEDED") {
|
|
80
|
+
throw stepFailure(plan, step, task, timedOut, completedTaskId, runtime);
|
|
81
|
+
}
|
|
82
|
+
if (step.index === plan.steps.length) {
|
|
83
|
+
await emitTerminalOutcome(task, false, elapsed, step.resource, runtime);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
completedTaskId = task.id;
|
|
87
|
+
if (opts.async) {
|
|
88
|
+
emit({
|
|
89
|
+
command: "make",
|
|
90
|
+
route: plan.route,
|
|
91
|
+
stopped_after: step.action,
|
|
92
|
+
task_id: task.id,
|
|
93
|
+
status: task.status,
|
|
94
|
+
hint: resumeCommand(plan, task.id, runtime),
|
|
95
|
+
}, { format: runtime.flags.format });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* One payload builder per step, taking the previous step's task id so the
|
|
102
|
+
* chain stays a function of the plan plus what actually ran.
|
|
103
|
+
*
|
|
104
|
+
* Texture settings reuse the resource commands' pinned defaults (full PBR map
|
|
105
|
+
* set, 4k base color, relightable, GLB out) rather than inventing a second set.
|
|
106
|
+
*/
|
|
107
|
+
async function buildPayloads(plan) {
|
|
108
|
+
if (plan.route === "text") {
|
|
109
|
+
return [
|
|
110
|
+
() => ({ mode: "preview", prompt: plan.input, target_formats: ["glb"] }),
|
|
111
|
+
(previewTaskId) => ({
|
|
112
|
+
mode: "refine",
|
|
113
|
+
preview_task_id: previewTaskId,
|
|
114
|
+
enable_pbr: true,
|
|
115
|
+
texture_resolution: "4k",
|
|
116
|
+
remove_lighting: true,
|
|
117
|
+
target_formats: ["glb"],
|
|
118
|
+
}),
|
|
119
|
+
];
|
|
120
|
+
}
|
|
121
|
+
// Resolve the image before anything is created: a missing file or an
|
|
122
|
+
// unreachable URL must fail while the run is still free.
|
|
123
|
+
const resolved = { imageUrl: plan.input };
|
|
124
|
+
await resolveImageFields(resolved);
|
|
125
|
+
return [
|
|
126
|
+
() => ({
|
|
127
|
+
image_url: resolved.imageUrl,
|
|
128
|
+
should_texture: true,
|
|
129
|
+
enable_pbr: true,
|
|
130
|
+
texture_resolution: "4k",
|
|
131
|
+
remove_lighting: true,
|
|
132
|
+
target_formats: ["glb"],
|
|
133
|
+
}),
|
|
134
|
+
];
|
|
135
|
+
}
|
|
136
|
+
function endpointFor(step, runtime) {
|
|
137
|
+
return step.resource === "text-to-3d" ? runtime.client.textTo3d : runtime.client.imageTo3d;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* The command that picks the chain back up from a completed step. Only the
|
|
141
|
+
* text route has a resumable hand-off (a preview's latents are what refine
|
|
142
|
+
* consumes); the image route is a single task with nothing to resume.
|
|
143
|
+
*/
|
|
144
|
+
export function resumeCommand(plan, completedTaskId, runtime) {
|
|
145
|
+
if (plan.route !== "text" || !completedTaskId)
|
|
146
|
+
return undefined;
|
|
147
|
+
const output = runtime.flags.output ? ` -o ${runtime.flags.output}` : "";
|
|
148
|
+
return `meshy text-to-3d create --mode refine --preview-task-id ${completedTaskId}${output}`;
|
|
149
|
+
}
|
|
150
|
+
function stepFailure(plan, step, task, timedOut, completedTaskId, runtime) {
|
|
151
|
+
if (timedOut) {
|
|
152
|
+
return new HintedError({
|
|
153
|
+
message: `make: ${step.label} did not finish within the timeout — task ${task.id} is still running`,
|
|
154
|
+
code: "step_timeout",
|
|
155
|
+
hint: `meshy ${step.resource} wait ${task.id}`,
|
|
156
|
+
exitCode: 8,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// A resume is only offered when an earlier step actually succeeded; without
|
|
160
|
+
// one, a suggested command would be a guess, and a wrong command is worse
|
|
161
|
+
// than none.
|
|
162
|
+
const resume = resumeCommand(plan, completedTaskId, runtime);
|
|
163
|
+
return new HintedError({
|
|
164
|
+
message: task.task_error?.message ||
|
|
165
|
+
`make: ${step.label} ended as ${task.status} — task ${task.id}`,
|
|
166
|
+
code: "step_failed",
|
|
167
|
+
...(resume ? { hint: `${resume} # step ${step.index} failed; step ${step.index - 1} is kept` } : {}),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function planPayload(plan) {
|
|
171
|
+
return {
|
|
172
|
+
command: "make",
|
|
173
|
+
route: plan.route,
|
|
174
|
+
steps: plan.steps.map((s) => ({
|
|
175
|
+
step: s.index,
|
|
176
|
+
resource: s.resource,
|
|
177
|
+
action: s.action,
|
|
178
|
+
estimated_credits: s.credits,
|
|
179
|
+
})),
|
|
180
|
+
estimated_credits: plan.estimatedCredits,
|
|
181
|
+
note: `Estimates only — confirm prices at ${PRICING_DOCS} and your balance with \`meshy balance\`.`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function describeChain(plan) {
|
|
185
|
+
return plan.steps.map((s) => `${s.resource} ${s.action}`).join(" → ");
|
|
186
|
+
}
|
|
187
|
+
/** Progress goes to stderr so stdout stays the machine-readable channel. */
|
|
188
|
+
function announceStart(plan, step, taskId) {
|
|
189
|
+
process.stderr.write(`[${step.index}/${plan.steps.length}] ${step.label} ${taskId}\n`);
|
|
190
|
+
}
|
|
191
|
+
function announceOutcome(task, timedOut, elapsed) {
|
|
192
|
+
const mark = timedOut ? "timed out" : task.status === "SUCCEEDED" ? "ok" : task.status;
|
|
193
|
+
process.stderr.write(` ${mark} in ${elapsed.toFixed(0)}s\n`);
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=make.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"make.js","sourceRoot":"","sources":["../../src/cmd/make.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* multi-color-print — https://docs.meshy.ai/en/api/multi-color-print
|
|
3
|
+
* Converts a SUCCEEDED 3D task into a multi-color 3MF print file.
|
|
4
|
+
*/
|
|
5
|
+
export declare const multiColorPrintCommand: import("commander").Command;
|
|
6
|
+
//# sourceMappingURL=multi-color-print.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-color-print.d.ts","sourceRoot":"","sources":["../../src/cmd/multi-color-print.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8CH,eAAO,MAAM,sBAAsB,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* multi-color-print — https://docs.meshy.ai/en/api/multi-color-print
|
|
3
|
+
* Converts a SUCCEEDED 3D task into a multi-color 3MF print file.
|
|
4
|
+
*/
|
|
5
|
+
import { parseInt10 } from "../internal/flags.js";
|
|
6
|
+
import { UsageError } from "../internal/errors.js";
|
|
7
|
+
import { buildResourceCommand } from "../internal/task-command.js";
|
|
8
|
+
const spec = {
|
|
9
|
+
name: "multi-color-print",
|
|
10
|
+
description: "Convert a 3D model into multi-color 3MF format for 3D printing, with a configurable " +
|
|
11
|
+
"color palette of up to 16 colors",
|
|
12
|
+
create: {
|
|
13
|
+
description: "Create a multi-color-print task",
|
|
14
|
+
configure(cmd) {
|
|
15
|
+
return cmd
|
|
16
|
+
.option("--input-task-id <id>", "SUCCEEDED source task (image-to-3d, multi-image-to-3d, text-to-3d, remesh, or retexture) — takes priority over --model-url")
|
|
17
|
+
.option("--model-url <src>", "3D model as http(s) URL or local file path (.glb/.fbx)")
|
|
18
|
+
.option("--max-colors <n>", "1-16 (default: 4)", parseInt10)
|
|
19
|
+
.option("--max-depth <n>", "quadtree depth 3-6 (default: 4)", parseInt10);
|
|
20
|
+
},
|
|
21
|
+
toPayload(opts) {
|
|
22
|
+
if (!opts.inputTaskId && !opts.modelUrl && !opts.data) {
|
|
23
|
+
throw new UsageError("provide --input-task-id or --model-url");
|
|
24
|
+
}
|
|
25
|
+
const maxColors = opts.maxColors;
|
|
26
|
+
if (maxColors !== undefined && (maxColors < 1 || maxColors > 16)) {
|
|
27
|
+
throw new UsageError("--max-colors must be between 1 and 16");
|
|
28
|
+
}
|
|
29
|
+
const maxDepth = opts.maxDepth;
|
|
30
|
+
if (maxDepth !== undefined && (maxDepth < 3 || maxDepth > 6)) {
|
|
31
|
+
throw new UsageError("--max-depth must be between 3 and 6");
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
input_task_id: opts.inputTaskId,
|
|
35
|
+
model_url: opts.modelUrl,
|
|
36
|
+
max_colors: maxColors,
|
|
37
|
+
max_depth: maxDepth,
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
endpointOf: (c) => c.multiColorPrint,
|
|
42
|
+
};
|
|
43
|
+
export const multiColorPrintCommand = buildResourceCommand(spec);
|
|
44
|
+
//# sourceMappingURL=multi-color-print.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-color-print.js","sourceRoot":"","sources":["../../src/cmd/multi-color-print.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,6BAA6B,CAAC;AAE7F,MAAM,IAAI,GAAwB;IAChC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,sFAAsF;QACtF,kCAAkC;IACpC,MAAM,EAAE;QACN,WAAW,EAAE,iCAAiC;QAC9C,SAAS,CAAC,GAAG;YACX,OAAO,GAAG;iBACP,MAAM,CACL,sBAAsB,EACtB,4HAA4H,CAC7H;iBACA,MAAM,CAAC,mBAAmB,EAAE,wDAAwD,CAAC;iBACrF,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,UAAU,CAAC;iBAC3D,MAAM,CAAC,iBAAiB,EAAE,iCAAiC,EAAE,UAAU,CAAC,CAAC;QAC9E,CAAC;QACD,SAAS,CAAC,IAAI;YACZ,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtD,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAA+B,CAAC;YACvD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;gBACjE,MAAM,IAAI,UAAU,CAAC,uCAAuC,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA8B,CAAC;YACrD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO;gBACL,aAAa,EAAE,IAAI,CAAC,WAAW;gBAC/B,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,QAAQ;aACpB,CAAC;QACJ,CAAC;KACF;IACD,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe;CACrC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-image-to-3d.d.ts","sourceRoot":"","sources":["../../src/cmd/multi-image-to-3d.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkGH,eAAO,MAAM,qBAAqB,6BAA6B,CAAC"}
|