@meshy-ai/cli 0.2.0 → 0.3.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 +8 -2
- package/README.md +342 -108
- package/dist/client/endpoints/animation-catalog.d.ts +37 -0
- package/dist/client/endpoints/animation-catalog.d.ts.map +1 -0
- package/dist/client/endpoints/animation-catalog.js +55 -0
- package/dist/client/endpoints/animation-catalog.js.map +1 -0
- package/dist/client/endpoints/balance.d.ts +5 -0
- package/dist/client/endpoints/balance.d.ts.map +1 -1
- package/dist/client/endpoints/balance.js +5 -1
- package/dist/client/endpoints/balance.js.map +1 -1
- package/dist/client/endpoints/base.d.ts +41 -7
- package/dist/client/endpoints/base.d.ts.map +1 -1
- package/dist/client/endpoints/base.js +61 -40
- package/dist/client/endpoints/base.js.map +1 -1
- package/dist/client/endpoints/showcases.d.ts +31 -0
- package/dist/client/endpoints/showcases.d.ts.map +1 -0
- package/dist/client/endpoints/showcases.js +49 -0
- package/dist/client/endpoints/showcases.js.map +1 -0
- package/dist/client/errors.d.ts +1 -0
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +1 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/index.d.ts +47 -38
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +89 -120
- package/dist/client/index.js.map +1 -1
- package/dist/client/resource-registry.d.ts +97 -0
- package/dist/client/resource-registry.d.ts.map +1 -0
- package/dist/client/resource-registry.js +157 -0
- package/dist/client/resource-registry.js.map +1 -0
- package/dist/client/transport.d.ts +99 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +320 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/types.d.ts +17 -6
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js +28 -6
- package/dist/client/types.js.map +1 -1
- package/dist/cmd/animation-catalog.d.ts +26 -0
- package/dist/cmd/animation-catalog.d.ts.map +1 -0
- package/dist/cmd/animation-catalog.js +80 -0
- package/dist/cmd/animation-catalog.js.map +1 -0
- package/dist/cmd/api.d.ts +3 -2
- package/dist/cmd/api.d.ts.map +1 -1
- package/dist/cmd/api.js +22 -8
- package/dist/cmd/api.js.map +1 -1
- package/dist/cmd/auth.d.ts.map +1 -1
- package/dist/cmd/auth.js +5 -0
- package/dist/cmd/auth.js.map +1 -1
- package/dist/cmd/balance.d.ts.map +1 -1
- package/dist/cmd/balance.js +10 -6
- package/dist/cmd/balance.js.map +1 -1
- package/dist/cmd/creative-lab.d.ts +26 -0
- package/dist/cmd/creative-lab.d.ts.map +1 -0
- package/dist/cmd/creative-lab.js +256 -0
- package/dist/cmd/creative-lab.js.map +1 -0
- package/dist/cmd/delete.d.ts.map +1 -1
- package/dist/cmd/delete.js +6 -7
- package/dist/cmd/delete.js.map +1 -1
- package/dist/cmd/doctor.d.ts +23 -0
- package/dist/cmd/doctor.d.ts.map +1 -0
- package/dist/cmd/doctor.js +61 -0
- package/dist/cmd/doctor.js.map +1 -0
- package/dist/cmd/download.d.ts +17 -0
- package/dist/cmd/download.d.ts.map +1 -0
- package/dist/cmd/download.js +436 -0
- package/dist/cmd/download.js.map +1 -0
- package/dist/cmd/inspect.d.ts +63 -0
- package/dist/cmd/inspect.d.ts.map +1 -0
- package/dist/cmd/inspect.js +179 -0
- package/dist/cmd/inspect.js.map +1 -0
- package/dist/cmd/make.d.ts +13 -3
- package/dist/cmd/make.d.ts.map +1 -1
- package/dist/cmd/make.js +240 -36
- package/dist/cmd/make.js.map +1 -1
- package/dist/cmd/mesh.d.ts +13 -0
- package/dist/cmd/mesh.d.ts.map +1 -0
- package/dist/cmd/mesh.js +67 -0
- package/dist/cmd/mesh.js.map +1 -0
- package/dist/cmd/project.d.ts +16 -0
- package/dist/cmd/project.d.ts.map +1 -0
- package/dist/cmd/project.js +136 -0
- package/dist/cmd/project.js.map +1 -0
- package/dist/cmd/resources.d.ts +5 -0
- package/dist/cmd/resources.d.ts.map +1 -1
- package/dist/cmd/resources.js +38 -10
- package/dist/cmd/resources.js.map +1 -1
- package/dist/cmd/showcases.d.ts +10 -0
- package/dist/cmd/showcases.d.ts.map +1 -0
- package/dist/cmd/showcases.js +63 -0
- package/dist/cmd/showcases.js.map +1 -0
- package/dist/cmd/slicer.d.ts +12 -0
- package/dist/cmd/slicer.d.ts.map +1 -0
- package/dist/cmd/slicer.js +46 -0
- package/dist/cmd/slicer.js.map +1 -0
- package/dist/cmd/uv-unwrap.d.ts +16 -0
- package/dist/cmd/uv-unwrap.d.ts.map +1 -0
- package/dist/cmd/uv-unwrap.js +52 -0
- package/dist/cmd/uv-unwrap.js.map +1 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +141 -8
- package/dist/index.js.map +1 -1
- package/dist/internal/artifacts.d.ts +97 -0
- package/dist/internal/artifacts.d.ts.map +1 -0
- package/dist/internal/artifacts.js +280 -0
- package/dist/internal/artifacts.js.map +1 -0
- package/dist/internal/atomic-file.d.ts +39 -0
- package/dist/internal/atomic-file.d.ts.map +1 -0
- package/dist/internal/atomic-file.js +160 -0
- package/dist/internal/atomic-file.js.map +1 -0
- package/dist/internal/command-helpers.d.ts +46 -0
- package/dist/internal/command-helpers.d.ts.map +1 -0
- package/dist/internal/command-helpers.js +61 -0
- package/dist/internal/command-helpers.js.map +1 -0
- package/dist/internal/config.d.ts +48 -5
- package/dist/internal/config.d.ts.map +1 -1
- package/dist/internal/config.js +95 -6
- package/dist/internal/config.js.map +1 -1
- package/dist/internal/context.d.ts +25 -0
- package/dist/internal/context.d.ts.map +1 -0
- package/dist/internal/context.js +37 -0
- package/dist/internal/context.js.map +1 -0
- package/dist/internal/credentials.d.ts +11 -0
- package/dist/internal/credentials.d.ts.map +1 -1
- package/dist/internal/credentials.js +2 -0
- package/dist/internal/credentials.js.map +1 -1
- package/dist/internal/doctor.d.ts +94 -0
- package/dist/internal/doctor.d.ts.map +1 -0
- package/dist/internal/doctor.js +280 -0
- package/dist/internal/doctor.js.map +1 -0
- package/dist/internal/download.d.ts +147 -13
- package/dist/internal/download.d.ts.map +1 -1
- package/dist/internal/download.js +735 -142
- package/dist/internal/download.js.map +1 -1
- package/dist/internal/env-file.d.ts +29 -0
- package/dist/internal/env-file.d.ts.map +1 -0
- package/dist/internal/env-file.js +95 -0
- package/dist/internal/env-file.js.map +1 -0
- package/dist/internal/errors.d.ts +74 -1
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +173 -1
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/file-input.d.ts +52 -12
- package/dist/internal/file-input.d.ts.map +1 -1
- package/dist/internal/file-input.js +162 -33
- package/dist/internal/file-input.js.map +1 -1
- package/dist/internal/global-options.d.ts +6 -4
- package/dist/internal/global-options.d.ts.map +1 -1
- package/dist/internal/global-options.js +19 -4
- package/dist/internal/global-options.js.map +1 -1
- package/dist/internal/inspect.d.ts +67 -0
- package/dist/internal/inspect.d.ts.map +1 -0
- package/dist/internal/inspect.js +111 -0
- package/dist/internal/inspect.js.map +1 -0
- package/dist/internal/lock.d.ts +19 -0
- package/dist/internal/lock.d.ts.map +1 -0
- package/dist/internal/lock.js +66 -0
- package/dist/internal/lock.js.map +1 -0
- package/dist/internal/material-links.d.ts +115 -0
- package/dist/internal/material-links.d.ts.map +1 -0
- package/dist/internal/material-links.js +577 -0
- package/dist/internal/material-links.js.map +1 -0
- package/dist/internal/obj-transform.d.ts +115 -0
- package/dist/internal/obj-transform.d.ts.map +1 -0
- package/dist/internal/obj-transform.js +649 -0
- package/dist/internal/obj-transform.js.map +1 -0
- package/dist/internal/operation-store.d.ts +123 -0
- package/dist/internal/operation-store.d.ts.map +1 -0
- package/dist/internal/operation-store.js +229 -0
- package/dist/internal/operation-store.js.map +1 -0
- package/dist/internal/output.d.ts +20 -2
- package/dist/internal/output.d.ts.map +1 -1
- package/dist/internal/output.js +32 -4
- package/dist/internal/output.js.map +1 -1
- package/dist/internal/paths.d.ts +89 -0
- package/dist/internal/paths.d.ts.map +1 -0
- package/dist/internal/paths.js +168 -0
- package/dist/internal/paths.js.map +1 -0
- package/dist/internal/payload.d.ts +15 -0
- package/dist/internal/payload.d.ts.map +1 -1
- package/dist/internal/payload.js +50 -3
- package/dist/internal/payload.js.map +1 -1
- package/dist/internal/poll.d.ts +30 -4
- package/dist/internal/poll.d.ts.map +1 -1
- package/dist/internal/poll.js +99 -16
- package/dist/internal/poll.js.map +1 -1
- package/dist/internal/project-store.d.ts +197 -0
- package/dist/internal/project-store.d.ts.map +1 -0
- package/dist/internal/project-store.js +467 -0
- package/dist/internal/project-store.js.map +1 -0
- package/dist/internal/result.d.ts +50 -0
- package/dist/internal/result.d.ts.map +1 -0
- package/dist/internal/result.js +41 -0
- package/dist/internal/result.js.map +1 -0
- package/dist/internal/runtime.d.ts +35 -5
- package/dist/internal/runtime.d.ts.map +1 -1
- package/dist/internal/runtime.js +68 -18
- package/dist/internal/runtime.js.map +1 -1
- package/dist/internal/slicers.d.ts +117 -0
- package/dist/internal/slicers.d.ts.map +1 -0
- package/dist/internal/slicers.js +314 -0
- package/dist/internal/slicers.js.map +1 -0
- package/dist/internal/stream.d.ts +58 -0
- package/dist/internal/stream.d.ts.map +1 -0
- package/dist/internal/stream.js +280 -0
- package/dist/internal/stream.js.map +1 -0
- package/dist/internal/task-command.d.ts +128 -11
- package/dist/internal/task-command.d.ts.map +1 -1
- package/dist/internal/task-command.js +991 -111
- package/dist/internal/task-command.js.map +1 -1
- package/dist/internal/task-view.d.ts +56 -0
- package/dist/internal/task-view.d.ts.map +1 -0
- package/dist/internal/task-view.js +95 -0
- package/dist/internal/task-view.js.map +1 -0
- package/dist/internal/update-notifier.d.ts +5 -1
- package/dist/internal/update-notifier.d.ts.map +1 -1
- package/dist/internal/update-notifier.js +7 -3
- package/dist/internal/update-notifier.js.map +1 -1
- package/dist/root.d.ts +10 -0
- package/dist/root.d.ts.map +1 -1
- package/dist/root.js +75 -10
- package/dist/root.js.map +1 -1
- package/package.json +3 -2
- package/skills/meshy-cli/SKILL.md +140 -59
- package/dist/client/endpoints/analyze-printability.d.ts +0 -5
- package/dist/client/endpoints/analyze-printability.d.ts.map +0 -1
- package/dist/client/endpoints/analyze-printability.js +0 -7
- package/dist/client/endpoints/analyze-printability.js.map +0 -1
- package/dist/client/endpoints/animate.d.ts +0 -6
- package/dist/client/endpoints/animate.d.ts.map +0 -1
- package/dist/client/endpoints/animate.js +0 -8
- package/dist/client/endpoints/animate.js.map +0 -1
- package/dist/client/endpoints/convert.d.ts +0 -5
- package/dist/client/endpoints/convert.d.ts.map +0 -1
- package/dist/client/endpoints/convert.js +0 -7
- package/dist/client/endpoints/convert.js.map +0 -1
- package/dist/client/endpoints/image-to-3d.d.ts +0 -5
- package/dist/client/endpoints/image-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/image-to-3d.js +0 -7
- package/dist/client/endpoints/image-to-3d.js.map +0 -1
- package/dist/client/endpoints/image-to-image.d.ts +0 -5
- package/dist/client/endpoints/image-to-image.d.ts.map +0 -1
- package/dist/client/endpoints/image-to-image.js +0 -7
- package/dist/client/endpoints/image-to-image.js.map +0 -1
- package/dist/client/endpoints/multi-color-print.d.ts +0 -5
- package/dist/client/endpoints/multi-color-print.d.ts.map +0 -1
- package/dist/client/endpoints/multi-color-print.js +0 -7
- package/dist/client/endpoints/multi-color-print.js.map +0 -1
- package/dist/client/endpoints/multi-image-to-3d.d.ts +0 -5
- package/dist/client/endpoints/multi-image-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/multi-image-to-3d.js +0 -7
- package/dist/client/endpoints/multi-image-to-3d.js.map +0 -1
- package/dist/client/endpoints/remesh.d.ts +0 -5
- package/dist/client/endpoints/remesh.d.ts.map +0 -1
- package/dist/client/endpoints/remesh.js +0 -7
- package/dist/client/endpoints/remesh.js.map +0 -1
- package/dist/client/endpoints/repair-printability.d.ts +0 -5
- package/dist/client/endpoints/repair-printability.d.ts.map +0 -1
- package/dist/client/endpoints/repair-printability.js +0 -7
- package/dist/client/endpoints/repair-printability.js.map +0 -1
- package/dist/client/endpoints/resize.d.ts +0 -5
- package/dist/client/endpoints/resize.d.ts.map +0 -1
- package/dist/client/endpoints/resize.js +0 -7
- package/dist/client/endpoints/resize.js.map +0 -1
- package/dist/client/endpoints/retexture.d.ts +0 -5
- package/dist/client/endpoints/retexture.d.ts.map +0 -1
- package/dist/client/endpoints/retexture.js +0 -7
- package/dist/client/endpoints/retexture.js.map +0 -1
- package/dist/client/endpoints/rigging.d.ts +0 -6
- package/dist/client/endpoints/rigging.d.ts.map +0 -1
- package/dist/client/endpoints/rigging.js +0 -8
- package/dist/client/endpoints/rigging.js.map +0 -1
- package/dist/client/endpoints/text-to-3d.d.ts +0 -6
- package/dist/client/endpoints/text-to-3d.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-3d.js +0 -8
- package/dist/client/endpoints/text-to-3d.js.map +0 -1
- package/dist/client/endpoints/text-to-image.d.ts +0 -5
- package/dist/client/endpoints/text-to-image.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-image.js +0 -7
- package/dist/client/endpoints/text-to-image.js.map +0 -1
- package/dist/client/endpoints/text-to-motion.d.ts +0 -6
- package/dist/client/endpoints/text-to-motion.d.ts.map +0 -1
- package/dist/client/endpoints/text-to-motion.js +0 -8
- package/dist/client/endpoints/text-to-motion.js.map +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Face-count gate — the verdict logic behind `meshy inspect faces`.
|
|
3
|
+
*
|
|
4
|
+
* The legacy Skill's check-faces script defaulted a missing face_count to 0 and
|
|
5
|
+
* printed a passing line for a model it never measured. Nothing here fabricates
|
|
6
|
+
* a number: only a finite, non-negative integer that the task actually carries
|
|
7
|
+
* is "known"; everything else is `unknown`, which the command turns into exit
|
|
8
|
+
* 13 rather than a pass (D-009). Strings are never parsed into numbers — a
|
|
9
|
+
* `"1234"` that the server never meant as a count must not become one here.
|
|
10
|
+
*
|
|
11
|
+
* The gate answers exactly one question — is face_count <= the caller's limit?
|
|
12
|
+
* It knows nothing about rigging eligibility (mesh shape, textures, humanoid
|
|
13
|
+
* proportions), so nothing in this module says "rig-ready". When it fails it
|
|
14
|
+
* can describe a remesh that would help; it never runs one.
|
|
15
|
+
*/
|
|
16
|
+
import { isTerminalStatus } from "../client/types.js";
|
|
17
|
+
/** The remesh endpoint's accepted target_polycount range (see cmd/remesh.ts). */
|
|
18
|
+
export const REMESH_POLYCOUNT_RANGE = { min: 100, max: 300_000 };
|
|
19
|
+
/** Task ids are echoed into a shell command only when they are plain tokens. */
|
|
20
|
+
const SAFE_TASK_ID = /^[A-Za-z0-9._:-]+$/;
|
|
21
|
+
function assertLimit(limit) {
|
|
22
|
+
if (typeof limit !== "number" || !Number.isInteger(limit) || limit < 1) {
|
|
23
|
+
throw new RangeError(`face-count limit must be a positive integer (got ${String(limit)})`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function describe(value) {
|
|
27
|
+
if (Array.isArray(value))
|
|
28
|
+
return "array";
|
|
29
|
+
if (value === null)
|
|
30
|
+
return "null";
|
|
31
|
+
return typeof value;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Judge a raw face_count against `limit`. Only a finite, non-negative integer is
|
|
35
|
+
* a known count; `<= limit` passes, anything larger fails, everything else is
|
|
36
|
+
* unknown with a reason that names what was wrong.
|
|
37
|
+
*/
|
|
38
|
+
export function judgeFaceCount(raw, limit) {
|
|
39
|
+
assertLimit(limit);
|
|
40
|
+
const unknown = (reason) => ({ face_count: null, limit, comparison: "lte", verdict: "unknown", reason });
|
|
41
|
+
if (raw === undefined)
|
|
42
|
+
return unknown("face_count missing");
|
|
43
|
+
if (raw === null)
|
|
44
|
+
return unknown("face_count is null");
|
|
45
|
+
if (typeof raw === "string") {
|
|
46
|
+
const shown = raw.length > 40 ? `${raw.slice(0, 40)}…` : raw;
|
|
47
|
+
return unknown(`face_count is a string, not a number (${JSON.stringify(shown)} is not parsed)`);
|
|
48
|
+
}
|
|
49
|
+
if (typeof raw !== "number")
|
|
50
|
+
return unknown(`face_count is not a number (got ${describe(raw)})`);
|
|
51
|
+
if (!Number.isFinite(raw))
|
|
52
|
+
return unknown(`face_count is not a finite number (got ${String(raw)})`);
|
|
53
|
+
if (!Number.isInteger(raw) || raw < 0)
|
|
54
|
+
return unknown(`face_count is not a non-negative integer (got ${raw})`);
|
|
55
|
+
if (raw <= limit)
|
|
56
|
+
return { face_count: raw, limit, comparison: "lte", verdict: "pass", reason: null };
|
|
57
|
+
return {
|
|
58
|
+
face_count: raw,
|
|
59
|
+
limit,
|
|
60
|
+
comparison: "lte",
|
|
61
|
+
verdict: "fail",
|
|
62
|
+
reason: `face_count ${raw} exceeds the limit ${limit} by ${raw - limit}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Read the top-level `face_count` of a task object. Nothing is derived from
|
|
67
|
+
* other fields and nothing is defaulted: an absent key is reported as absent.
|
|
68
|
+
*/
|
|
69
|
+
export function faceCountFromTask(task) {
|
|
70
|
+
const status = typeof task["status"] === "string" ? task["status"] : null;
|
|
71
|
+
if (Object.prototype.hasOwnProperty.call(task, "face_count")) {
|
|
72
|
+
return { value: task["face_count"], source: "face_count", status };
|
|
73
|
+
}
|
|
74
|
+
return { value: undefined, source: "none", status };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Judge a whole task: the top-level face_count against `limit`. A task that
|
|
78
|
+
* has not finished and carries no count is unknown *because it is still
|
|
79
|
+
* running* — the reason says so instead of implying the field will never come.
|
|
80
|
+
*/
|
|
81
|
+
export function judgeTask(task, limit) {
|
|
82
|
+
const { value, status } = faceCountFromTask(task);
|
|
83
|
+
const verdict = judgeFaceCount(value, limit);
|
|
84
|
+
if (verdict.verdict === "unknown" && (value === undefined || value === null) && status !== null && !isTerminalStatus(status)) {
|
|
85
|
+
return { ...verdict, reason: `task is ${status}; no face count yet` };
|
|
86
|
+
}
|
|
87
|
+
return verdict;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Describe — never execute — the remesh that would bring a model under `limit`.
|
|
91
|
+
* The target is clamped to the range the remesh endpoint accepts.
|
|
92
|
+
*/
|
|
93
|
+
export function remeshSuggestion(taskId, limit) {
|
|
94
|
+
const target = Math.min(Math.max(Math.trunc(limit), REMESH_POLYCOUNT_RANGE.min), REMESH_POLYCOUNT_RANGE.max);
|
|
95
|
+
const flags = `--target-polycount ${target} --output-schema v1`;
|
|
96
|
+
if (taskId && SAFE_TASK_ID.test(taskId)) {
|
|
97
|
+
const command = `meshy remesh create --input-task-id ${taskId} ${flags}`;
|
|
98
|
+
return {
|
|
99
|
+
description: `Reduce the polycount with a remesh task targeting ${target} faces (billable; not executed by inspect — run it yourself): ${command}`,
|
|
100
|
+
command,
|
|
101
|
+
executed: false,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const why = taskId ? "the task id contains characters that are not safe to echo into a command" : "the source task id is unknown";
|
|
105
|
+
return {
|
|
106
|
+
description: `Reduce the polycount with a remesh task targeting ${target} faces (billable; not executed by inspect). ${why}; run: meshy remesh create --model-url <file-or-url> ${flags}`,
|
|
107
|
+
command: null,
|
|
108
|
+
executed: false,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/internal/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process exclusive lock on a directory-scoped lock file.
|
|
3
|
+
*
|
|
4
|
+
* O_EXCL creation is the atomic primitive (Node exposes no flock). A lock
|
|
5
|
+
* older than `staleMs` is treated as abandoned by a crashed process and
|
|
6
|
+
* broken. Waiting is a blocking sleep because every store that uses this is
|
|
7
|
+
* synchronous by design; the wait is bounded and a timeout is a structured
|
|
8
|
+
* error rather than a hang.
|
|
9
|
+
*/
|
|
10
|
+
export interface LockOptions {
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
staleMs?: number;
|
|
13
|
+
/** Test hook to observe contention. */
|
|
14
|
+
onWait?: () => void;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_LOCK_TIMEOUT_MS = 10000;
|
|
17
|
+
export declare const DEFAULT_LOCK_STALE_MS = 60000;
|
|
18
|
+
export declare function withFileLock<T>(lockPath: string, fn: () => T, opts?: LockOptions): T;
|
|
19
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/internal/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAM5C,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,GAAE,WAAgB,GAAG,CAAC,CA0CxF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process exclusive lock on a directory-scoped lock file.
|
|
3
|
+
*
|
|
4
|
+
* O_EXCL creation is the atomic primitive (Node exposes no flock). A lock
|
|
5
|
+
* older than `staleMs` is treated as abandoned by a crashed process and
|
|
6
|
+
* broken. Waiting is a blocking sleep because every store that uses this is
|
|
7
|
+
* synchronous by design; the wait is bounded and a timeout is a structured
|
|
8
|
+
* error rather than a hang.
|
|
9
|
+
*/
|
|
10
|
+
import { closeSync, mkdirSync, openSync, statSync, unlinkSync } from "node:fs";
|
|
11
|
+
import { dirname } from "node:path";
|
|
12
|
+
import { CliError } from "./errors.js";
|
|
13
|
+
export const DEFAULT_LOCK_TIMEOUT_MS = 10_000;
|
|
14
|
+
export const DEFAULT_LOCK_STALE_MS = 60_000;
|
|
15
|
+
function sleepSync(ms) {
|
|
16
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
17
|
+
}
|
|
18
|
+
export function withFileLock(lockPath, fn, opts = {}) {
|
|
19
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
|
|
20
|
+
const staleMs = opts.staleMs ?? DEFAULT_LOCK_STALE_MS;
|
|
21
|
+
mkdirSync(dirname(lockPath), { recursive: true, mode: 0o700 });
|
|
22
|
+
const deadline = Date.now() + timeoutMs;
|
|
23
|
+
let fd;
|
|
24
|
+
for (;;) {
|
|
25
|
+
try {
|
|
26
|
+
fd = openSync(lockPath, "wx", 0o600);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (err.code !== "EEXIST")
|
|
31
|
+
throw err;
|
|
32
|
+
try {
|
|
33
|
+
if (Date.now() - statSync(lockPath).mtimeMs > staleMs) {
|
|
34
|
+
unlinkSync(lockPath);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Holder released between open and stat — retry immediately.
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (Date.now() >= deadline) {
|
|
43
|
+
throw new CliError({
|
|
44
|
+
code: "local_io",
|
|
45
|
+
message: `timed out after ${timeoutMs}ms waiting for the lock ${lockPath}. If no other meshy process is running, delete that file.`,
|
|
46
|
+
recovery: { action: "retry", automatic: false },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
opts.onWait?.();
|
|
50
|
+
sleepSync(25);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
return fn();
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
closeSync(fd);
|
|
58
|
+
try {
|
|
59
|
+
unlinkSync(lockPath);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* already gone */
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/internal/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AASvC,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,QAAgB,EAAE,EAAW,EAAE,IAAI,GAAgB,EAAE;IACnF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,uBAAuB,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,qBAAqB,CAAC;IACtD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI,EAAU,CAAC;IACf,SAAS,CAAC;QACR,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACrC,MAAM;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;oBACtD,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACrB,SAAS;gBACX,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,6DAA6D;gBAC7D,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,QAAQ,CAAC;oBACjB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,mBAAmB,SAAS,2BAA2B,QAAQ,2DAA2D;oBACnI,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;iBAChD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAChB,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC;YACH,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Material relinking for downloaded OBJ sets.
|
|
3
|
+
*
|
|
4
|
+
* Meshy serves an OBJ, its MTL and the textures as separate URLs and the CLI
|
|
5
|
+
* saves them under stable names (model.obj, model.mtl, texture_0_base_color.png
|
|
6
|
+
* …). The OBJ, however, names its MTL the way the server knew it (`mtllib
|
|
7
|
+
* box.mtl`) and the MTL names its textures the same way, so a faithfully
|
|
8
|
+
* downloaded set can still be unloadable. Once every file of a set has landed,
|
|
9
|
+
* this module rewrites those references to the names actually on disk and
|
|
10
|
+
* reports every link it resolved — and every one it could not. Only the two
|
|
11
|
+
* text files the CLI itself just wrote are touched; nothing is renamed, the
|
|
12
|
+
* rewritten paths are listed, and their digests are re-taken by the caller.
|
|
13
|
+
*
|
|
14
|
+
* A texture reference is resolved only when exactly one downloaded texture
|
|
15
|
+
* matches, in this order: the name the server served a texture under (the
|
|
16
|
+
* URL's last segment — `body.png` for `…/body.png`), which is the only evidence
|
|
17
|
+
* of *which* image the MTL meant; a saved file of that name, but only when it
|
|
18
|
+
* is not known to come from a different source (the CLI's generated names
|
|
19
|
+
* `texture_<n>_<channel>` can collide with a server-side name of another
|
|
20
|
+
* texture — that is an ambiguity, not a match); the same name ignoring
|
|
21
|
+
* extension and directories; a channel word inside the referenced name
|
|
22
|
+
* (…_normal.png); the channel implied by the MTL key (map_Kd → base color);
|
|
23
|
+
* finally "the only texture there is" when the MTL has exactly one distinct
|
|
24
|
+
* reference. Several candidates for the same rule is an *ambiguity*: the
|
|
25
|
+
* reference stays as written, the candidates are listed and the report is
|
|
26
|
+
* `incomplete` — the CLI never picks the first of several material groups'
|
|
27
|
+
* textures.
|
|
28
|
+
*
|
|
29
|
+
* The first three rules are *identity* evidence; the channel and only-texture
|
|
30
|
+
* rules are *heuristics*. Resolution therefore runs in two passes over the
|
|
31
|
+
* whole MTL: every distinct reference is resolved on its own first, then the
|
|
32
|
+
* heuristic results are checked against each other — a texture that several
|
|
33
|
+
* different references would fall back to (whichever channel rule each one
|
|
34
|
+
* took to get there, in whichever order they appear) serves none of them, and a
|
|
35
|
+
* reference that different keys would send to different textures is not
|
|
36
|
+
* rewritten either. Two material groups collapsing onto one image without
|
|
37
|
+
* evidence that they name the same file is exactly the guess this module must
|
|
38
|
+
* not make; a reference with identity evidence keeps its texture regardless.
|
|
39
|
+
* Unresolved references are reported the same way. The whole pass is
|
|
40
|
+
* cooperative: an abort signal stops it before the next read, write or
|
|
41
|
+
* publication, leaving no temp file behind.
|
|
42
|
+
*/
|
|
43
|
+
import { type Warning } from "./errors.js";
|
|
44
|
+
export interface LinkableFile {
|
|
45
|
+
/** Stable asset key (`model.obj`, `model_mtl`, `texture.0.base_color`, `texture_0_normal` …). */
|
|
46
|
+
key: string;
|
|
47
|
+
/** Absolute path as written. */
|
|
48
|
+
path: string;
|
|
49
|
+
/** The file name the server served the asset under (last URL path segment), when known. */
|
|
50
|
+
sourceName?: string | null;
|
|
51
|
+
}
|
|
52
|
+
export type LinkMethod = "unchanged" | "exact" | "source_name" | "source_stem" | "channel_in_name" | "channel_of_key" | "only_texture" | "downloaded_mtl" | "ambiguous" | "unresolved";
|
|
53
|
+
export interface ReferenceLink {
|
|
54
|
+
/** 1-based line in the file that carried the reference. */
|
|
55
|
+
line: number;
|
|
56
|
+
/** `newmtl` group the map belongs to (MTL only). */
|
|
57
|
+
material: string | null;
|
|
58
|
+
/** The reference as written before relinking. */
|
|
59
|
+
reference: string;
|
|
60
|
+
/** Saved file name the reference now points at, or null when it stays as written. */
|
|
61
|
+
resolved_to: string | null;
|
|
62
|
+
/** How the link was decided. */
|
|
63
|
+
method: LinkMethod;
|
|
64
|
+
/** Saved names that matched when the reference was ambiguous. */
|
|
65
|
+
candidates?: string[];
|
|
66
|
+
/** Why an apparently matching saved name was not accepted (identity conflict). */
|
|
67
|
+
note?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface TextureDescriptor {
|
|
70
|
+
key: string;
|
|
71
|
+
/** Saved file name. */
|
|
72
|
+
name: string;
|
|
73
|
+
/** Name the server served it under, when known. */
|
|
74
|
+
source_name: string | null;
|
|
75
|
+
/** `texture_urls` set index (material group) the texture came from. */
|
|
76
|
+
set: number | null;
|
|
77
|
+
/** Canonical channel (basecolor, normal, …) from the asset key. */
|
|
78
|
+
channel: string | null;
|
|
79
|
+
}
|
|
80
|
+
export interface MaterialLinkReport {
|
|
81
|
+
obj: string;
|
|
82
|
+
mtl: string | null;
|
|
83
|
+
textures: TextureDescriptor[];
|
|
84
|
+
mtllib: ReferenceLink[];
|
|
85
|
+
texture_maps: ReferenceLink[];
|
|
86
|
+
/** Absolute paths whose content was rewritten. */
|
|
87
|
+
rewritten: string[];
|
|
88
|
+
/** `complete` when every reference points at a downloaded file; `incomplete` when any stayed as written. */
|
|
89
|
+
status: "complete" | "incomplete";
|
|
90
|
+
warnings: Warning[];
|
|
91
|
+
}
|
|
92
|
+
/** Set index and channel encoded in an asset key: `texture.0.base_color` / `texture_0_base_color`. */
|
|
93
|
+
export declare function describeTextureKey(key: string): {
|
|
94
|
+
set: number | null;
|
|
95
|
+
channel: string | null;
|
|
96
|
+
};
|
|
97
|
+
/** @deprecated kept for callers of the round-1 API. */
|
|
98
|
+
export declare function channelOfTextureKey(key: string): string | null;
|
|
99
|
+
/** Channel word inside a referenced file name (`texture_normal.png`, `Body_BaseColor.jpg`). */
|
|
100
|
+
export declare function channelInFileName(name: string): string | null;
|
|
101
|
+
/** sha256 + size of a file, for manifests that must describe what is actually on disk. */
|
|
102
|
+
export declare function fileDigest(path: string): {
|
|
103
|
+
bytes: number;
|
|
104
|
+
sha256: string;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Relink the OBJ/MTL/texture files of one download. Returns null when the set
|
|
108
|
+
* has no text OBJ (nothing to relink). Never throws for unresolved or
|
|
109
|
+
* ambiguous references; those become warnings, `resolved_to: null` entries
|
|
110
|
+
* and `status: "incomplete"`.
|
|
111
|
+
*/
|
|
112
|
+
export declare function relinkMaterials(files: readonly LinkableFile[], opts?: {
|
|
113
|
+
signal?: AbortSignal;
|
|
114
|
+
}): Promise<MaterialLinkReport | null>;
|
|
115
|
+
//# sourceMappingURL=material-links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-links.d.ts","sourceRoot":"","sources":["../../src/internal/material-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AASH,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,WAAW,YAAY;IAC3B,iGAAiG;IACjG,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,OAAO,GACP,aAAa,GACb,aAAa,GACb,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,WAAW,GACX,YAAY,CAAC;AAEjB,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gCAAgC;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uEAAuE;IACvE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,mEAAmE;IACnE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,kDAAkD;IAClD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4GAA4G;IAC5G,MAAM,EAAE,UAAU,GAAG,YAAY,CAAC;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AA2DD,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAI9F;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE9D;AAED,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc7D;AAwBD,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAG1E;AA8QD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA2I7I"}
|