@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.
Files changed (265) hide show
  1. package/.env.example +14 -0
  2. package/LICENSE +21 -0
  3. package/README.md +376 -0
  4. package/dist/client/endpoints/analyze-printability.d.ts +5 -0
  5. package/dist/client/endpoints/analyze-printability.d.ts.map +1 -0
  6. package/dist/client/endpoints/analyze-printability.js +7 -0
  7. package/dist/client/endpoints/analyze-printability.js.map +1 -0
  8. package/dist/client/endpoints/animate.d.ts +6 -0
  9. package/dist/client/endpoints/animate.d.ts.map +1 -0
  10. package/dist/client/endpoints/animate.js +8 -0
  11. package/dist/client/endpoints/animate.js.map +1 -0
  12. package/dist/client/endpoints/balance.d.ts +9 -0
  13. package/dist/client/endpoints/balance.d.ts.map +1 -0
  14. package/dist/client/endpoints/balance.js +27 -0
  15. package/dist/client/endpoints/balance.js.map +1 -0
  16. package/dist/client/endpoints/base.d.ts +24 -0
  17. package/dist/client/endpoints/base.d.ts.map +1 -0
  18. package/dist/client/endpoints/base.js +87 -0
  19. package/dist/client/endpoints/base.js.map +1 -0
  20. package/dist/client/endpoints/convert.d.ts +5 -0
  21. package/dist/client/endpoints/convert.d.ts.map +1 -0
  22. package/dist/client/endpoints/convert.js +7 -0
  23. package/dist/client/endpoints/convert.js.map +1 -0
  24. package/dist/client/endpoints/image-to-3d.d.ts +5 -0
  25. package/dist/client/endpoints/image-to-3d.d.ts.map +1 -0
  26. package/dist/client/endpoints/image-to-3d.js +7 -0
  27. package/dist/client/endpoints/image-to-3d.js.map +1 -0
  28. package/dist/client/endpoints/image-to-image.d.ts +5 -0
  29. package/dist/client/endpoints/image-to-image.d.ts.map +1 -0
  30. package/dist/client/endpoints/image-to-image.js +7 -0
  31. package/dist/client/endpoints/image-to-image.js.map +1 -0
  32. package/dist/client/endpoints/multi-color-print.d.ts +5 -0
  33. package/dist/client/endpoints/multi-color-print.d.ts.map +1 -0
  34. package/dist/client/endpoints/multi-color-print.js +7 -0
  35. package/dist/client/endpoints/multi-color-print.js.map +1 -0
  36. package/dist/client/endpoints/multi-image-to-3d.d.ts +5 -0
  37. package/dist/client/endpoints/multi-image-to-3d.d.ts.map +1 -0
  38. package/dist/client/endpoints/multi-image-to-3d.js +7 -0
  39. package/dist/client/endpoints/multi-image-to-3d.js.map +1 -0
  40. package/dist/client/endpoints/remesh.d.ts +5 -0
  41. package/dist/client/endpoints/remesh.d.ts.map +1 -0
  42. package/dist/client/endpoints/remesh.js +7 -0
  43. package/dist/client/endpoints/remesh.js.map +1 -0
  44. package/dist/client/endpoints/repair-printability.d.ts +5 -0
  45. package/dist/client/endpoints/repair-printability.d.ts.map +1 -0
  46. package/dist/client/endpoints/repair-printability.js +7 -0
  47. package/dist/client/endpoints/repair-printability.js.map +1 -0
  48. package/dist/client/endpoints/resize.d.ts +5 -0
  49. package/dist/client/endpoints/resize.d.ts.map +1 -0
  50. package/dist/client/endpoints/resize.js +7 -0
  51. package/dist/client/endpoints/resize.js.map +1 -0
  52. package/dist/client/endpoints/retexture.d.ts +5 -0
  53. package/dist/client/endpoints/retexture.d.ts.map +1 -0
  54. package/dist/client/endpoints/retexture.js +7 -0
  55. package/dist/client/endpoints/retexture.js.map +1 -0
  56. package/dist/client/endpoints/rigging.d.ts +6 -0
  57. package/dist/client/endpoints/rigging.d.ts.map +1 -0
  58. package/dist/client/endpoints/rigging.js +8 -0
  59. package/dist/client/endpoints/rigging.js.map +1 -0
  60. package/dist/client/endpoints/text-to-3d.d.ts +6 -0
  61. package/dist/client/endpoints/text-to-3d.d.ts.map +1 -0
  62. package/dist/client/endpoints/text-to-3d.js +8 -0
  63. package/dist/client/endpoints/text-to-3d.js.map +1 -0
  64. package/dist/client/endpoints/text-to-image.d.ts +5 -0
  65. package/dist/client/endpoints/text-to-image.d.ts.map +1 -0
  66. package/dist/client/endpoints/text-to-image.js +7 -0
  67. package/dist/client/endpoints/text-to-image.js.map +1 -0
  68. package/dist/client/errors.d.ts +23 -0
  69. package/dist/client/errors.d.ts.map +1 -0
  70. package/dist/client/errors.js +82 -0
  71. package/dist/client/errors.js.map +1 -0
  72. package/dist/client/index.d.ts +48 -0
  73. package/dist/client/index.d.ts.map +1 -0
  74. package/dist/client/index.js +147 -0
  75. package/dist/client/index.js.map +1 -0
  76. package/dist/client/types.d.ts +298 -0
  77. package/dist/client/types.d.ts.map +1 -0
  78. package/dist/client/types.js +97 -0
  79. package/dist/client/types.js.map +1 -0
  80. package/dist/cmd/analyze-printability.d.ts +8 -0
  81. package/dist/cmd/analyze-printability.d.ts.map +1 -0
  82. package/dist/cmd/analyze-printability.js +34 -0
  83. package/dist/cmd/analyze-printability.js.map +1 -0
  84. package/dist/cmd/animate.d.ts +9 -0
  85. package/dist/cmd/animate.d.ts.map +1 -0
  86. package/dist/cmd/animate.js +51 -0
  87. package/dist/cmd/animate.js.map +1 -0
  88. package/dist/cmd/api.d.ts +9 -0
  89. package/dist/cmd/api.d.ts.map +1 -0
  90. package/dist/cmd/api.js +50 -0
  91. package/dist/cmd/api.js.map +1 -0
  92. package/dist/cmd/auth.d.ts +19 -0
  93. package/dist/cmd/auth.d.ts.map +1 -0
  94. package/dist/cmd/auth.js +583 -0
  95. package/dist/cmd/auth.js.map +1 -0
  96. package/dist/cmd/balance.d.ts +6 -0
  97. package/dist/cmd/balance.d.ts.map +1 -0
  98. package/dist/cmd/balance.js +14 -0
  99. package/dist/cmd/balance.js.map +1 -0
  100. package/dist/cmd/convert.d.ts +8 -0
  101. package/dist/cmd/convert.d.ts.map +1 -0
  102. package/dist/cmd/convert.js +40 -0
  103. package/dist/cmd/convert.js.map +1 -0
  104. package/dist/cmd/delete.d.ts +7 -0
  105. package/dist/cmd/delete.d.ts.map +1 -0
  106. package/dist/cmd/delete.js +19 -0
  107. package/dist/cmd/delete.js.map +1 -0
  108. package/dist/cmd/image-to-3d.d.ts +12 -0
  109. package/dist/cmd/image-to-3d.d.ts.map +1 -0
  110. package/dist/cmd/image-to-3d.js +97 -0
  111. package/dist/cmd/image-to-3d.js.map +1 -0
  112. package/dist/cmd/image-to-image.d.ts +5 -0
  113. package/dist/cmd/image-to-image.d.ts.map +1 -0
  114. package/dist/cmd/image-to-image.js +56 -0
  115. package/dist/cmd/image-to-image.js.map +1 -0
  116. package/dist/cmd/make.d.ts +31 -0
  117. package/dist/cmd/make.d.ts.map +1 -0
  118. package/dist/cmd/make.js +195 -0
  119. package/dist/cmd/make.js.map +1 -0
  120. package/dist/cmd/multi-color-print.d.ts +6 -0
  121. package/dist/cmd/multi-color-print.d.ts.map +1 -0
  122. package/dist/cmd/multi-color-print.js +44 -0
  123. package/dist/cmd/multi-color-print.js.map +1 -0
  124. package/dist/cmd/multi-image-to-3d.d.ts +5 -0
  125. package/dist/cmd/multi-image-to-3d.d.ts.map +1 -0
  126. package/dist/cmd/multi-image-to-3d.js +72 -0
  127. package/dist/cmd/multi-image-to-3d.js.map +1 -0
  128. package/dist/cmd/remesh.d.ts +8 -0
  129. package/dist/cmd/remesh.d.ts.map +1 -0
  130. package/dist/cmd/remesh.js +49 -0
  131. package/dist/cmd/remesh.js.map +1 -0
  132. package/dist/cmd/repair-printability.d.ts +7 -0
  133. package/dist/cmd/repair-printability.d.ts.map +1 -0
  134. package/dist/cmd/repair-printability.js +32 -0
  135. package/dist/cmd/repair-printability.js.map +1 -0
  136. package/dist/cmd/resize.d.ts +8 -0
  137. package/dist/cmd/resize.d.ts.map +1 -0
  138. package/dist/cmd/resize.js +51 -0
  139. package/dist/cmd/resize.js.map +1 -0
  140. package/dist/cmd/resources.d.ts +18 -0
  141. package/dist/cmd/resources.d.ts.map +1 -0
  142. package/dist/cmd/resources.js +59 -0
  143. package/dist/cmd/resources.js.map +1 -0
  144. package/dist/cmd/retexture.d.ts +5 -0
  145. package/dist/cmd/retexture.d.ts.map +1 -0
  146. package/dist/cmd/retexture.js +64 -0
  147. package/dist/cmd/retexture.js.map +1 -0
  148. package/dist/cmd/rigging.d.ts +6 -0
  149. package/dist/cmd/rigging.d.ts.map +1 -0
  150. package/dist/cmd/rigging.js +40 -0
  151. package/dist/cmd/rigging.js.map +1 -0
  152. package/dist/cmd/text-to-3d.d.ts +14 -0
  153. package/dist/cmd/text-to-3d.d.ts.map +1 -0
  154. package/dist/cmd/text-to-3d.js +76 -0
  155. package/dist/cmd/text-to-3d.js.map +1 -0
  156. package/dist/cmd/text-to-image.d.ts +5 -0
  157. package/dist/cmd/text-to-image.d.ts.map +1 -0
  158. package/dist/cmd/text-to-image.js +53 -0
  159. package/dist/cmd/text-to-image.js.map +1 -0
  160. package/dist/index.d.ts +6 -0
  161. package/dist/index.d.ts.map +1 -0
  162. package/dist/index.js +46 -0
  163. package/dist/index.js.map +1 -0
  164. package/dist/internal/config.d.ts +46 -0
  165. package/dist/internal/config.d.ts.map +1 -0
  166. package/dist/internal/config.js +94 -0
  167. package/dist/internal/config.js.map +1 -0
  168. package/dist/internal/credentials.d.ts +106 -0
  169. package/dist/internal/credentials.d.ts.map +1 -0
  170. package/dist/internal/credentials.js +297 -0
  171. package/dist/internal/credentials.js.map +1 -0
  172. package/dist/internal/device-state.d.ts +45 -0
  173. package/dist/internal/device-state.d.ts.map +1 -0
  174. package/dist/internal/device-state.js +180 -0
  175. package/dist/internal/device-state.js.map +1 -0
  176. package/dist/internal/device.d.ts +79 -0
  177. package/dist/internal/device.d.ts.map +1 -0
  178. package/dist/internal/device.js +374 -0
  179. package/dist/internal/device.js.map +1 -0
  180. package/dist/internal/download.d.ts +34 -0
  181. package/dist/internal/download.d.ts.map +1 -0
  182. package/dist/internal/download.js +283 -0
  183. package/dist/internal/download.js.map +1 -0
  184. package/dist/internal/errors.d.ts +66 -0
  185. package/dist/internal/errors.d.ts.map +1 -0
  186. package/dist/internal/errors.js +169 -0
  187. package/dist/internal/errors.js.map +1 -0
  188. package/dist/internal/file-input.d.ts +24 -0
  189. package/dist/internal/file-input.d.ts.map +1 -0
  190. package/dist/internal/file-input.js +164 -0
  191. package/dist/internal/file-input.js.map +1 -0
  192. package/dist/internal/flags.d.ts +9 -0
  193. package/dist/internal/flags.d.ts.map +1 -0
  194. package/dist/internal/flags.js +31 -0
  195. package/dist/internal/flags.js.map +1 -0
  196. package/dist/internal/global-options.d.ts +16 -0
  197. package/dist/internal/global-options.d.ts.map +1 -0
  198. package/dist/internal/global-options.js +57 -0
  199. package/dist/internal/global-options.js.map +1 -0
  200. package/dist/internal/headless.d.ts +69 -0
  201. package/dist/internal/headless.d.ts.map +1 -0
  202. package/dist/internal/headless.js +101 -0
  203. package/dist/internal/headless.js.map +1 -0
  204. package/dist/internal/image-models.d.ts +20 -0
  205. package/dist/internal/image-models.d.ts.map +1 -0
  206. package/dist/internal/image-models.js +40 -0
  207. package/dist/internal/image-models.js.map +1 -0
  208. package/dist/internal/logger.d.ts +14 -0
  209. package/dist/internal/logger.d.ts.map +1 -0
  210. package/dist/internal/logger.js +42 -0
  211. package/dist/internal/logger.js.map +1 -0
  212. package/dist/internal/make-plan.d.ts +41 -0
  213. package/dist/internal/make-plan.d.ts.map +1 -0
  214. package/dist/internal/make-plan.js +67 -0
  215. package/dist/internal/make-plan.js.map +1 -0
  216. package/dist/internal/oauth.d.ts +95 -0
  217. package/dist/internal/oauth.d.ts.map +1 -0
  218. package/dist/internal/oauth.js +365 -0
  219. package/dist/internal/oauth.js.map +1 -0
  220. package/dist/internal/output.d.ts +15 -0
  221. package/dist/internal/output.d.ts.map +1 -0
  222. package/dist/internal/output.js +66 -0
  223. package/dist/internal/output.js.map +1 -0
  224. package/dist/internal/payload.d.ts +9 -0
  225. package/dist/internal/payload.d.ts.map +1 -0
  226. package/dist/internal/payload.js +42 -0
  227. package/dist/internal/payload.js.map +1 -0
  228. package/dist/internal/poll.d.ts +17 -0
  229. package/dist/internal/poll.d.ts.map +1 -0
  230. package/dist/internal/poll.js +27 -0
  231. package/dist/internal/poll.js.map +1 -0
  232. package/dist/internal/pricing.d.ts +23 -0
  233. package/dist/internal/pricing.d.ts.map +1 -0
  234. package/dist/internal/pricing.js +24 -0
  235. package/dist/internal/pricing.js.map +1 -0
  236. package/dist/internal/report.d.ts +40 -0
  237. package/dist/internal/report.d.ts.map +1 -0
  238. package/dist/internal/report.js +48 -0
  239. package/dist/internal/report.js.map +1 -0
  240. package/dist/internal/runtime.d.ts +66 -0
  241. package/dist/internal/runtime.d.ts.map +1 -0
  242. package/dist/internal/runtime.js +160 -0
  243. package/dist/internal/runtime.js.map +1 -0
  244. package/dist/internal/task-command.d.ts +39 -0
  245. package/dist/internal/task-command.d.ts.map +1 -0
  246. package/dist/internal/task-command.js +189 -0
  247. package/dist/internal/task-command.js.map +1 -0
  248. package/dist/internal/update-notifier.d.ts +160 -0
  249. package/dist/internal/update-notifier.d.ts.map +1 -0
  250. package/dist/internal/update-notifier.js +445 -0
  251. package/dist/internal/update-notifier.js.map +1 -0
  252. package/dist/internal/user-agent.d.ts +6 -0
  253. package/dist/internal/user-agent.d.ts.map +1 -0
  254. package/dist/internal/user-agent.js +7 -0
  255. package/dist/internal/user-agent.js.map +1 -0
  256. package/dist/internal/version.d.ts +2 -0
  257. package/dist/internal/version.d.ts.map +1 -0
  258. package/dist/internal/version.js +11 -0
  259. package/dist/internal/version.js.map +1 -0
  260. package/dist/root.d.ts +13 -0
  261. package/dist/root.d.ts.map +1 -0
  262. package/dist/root.js +148 -0
  263. package/dist/root.js.map +1 -0
  264. package/package.json +65 -0
  265. package/skills/meshy-cli/SKILL.md +99 -0
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Download a completed task's artifacts to the local filesystem.
3
+ *
4
+ * Two target shapes:
5
+ * 1. File path (e.g. `character/front.jpeg`) — used when the task has a
6
+ * single downloadable artifact (most 2D image tasks). The Content-Type
7
+ * of the HTTP response is authoritative; if the user-supplied extension
8
+ * disagrees, the file is saved with the correct extension instead.
9
+ * 2. Directory path (anything without a recognized file extension) — used
10
+ * when the task emits multiple artifacts (3D models, thumbnails,
11
+ * textures, animation outputs). Each artifact is named after its role
12
+ * (model.glb, thumbnail.png, texture_0_base_color.png, ...).
13
+ *
14
+ * A `meta.json` alongside the artifacts records the full task response plus
15
+ * the saved paths for later reference.
16
+ */
17
+ import { createWriteStream, existsSync, mkdirSync, writeFileSync } from "node:fs";
18
+ import { dirname, extname, join } from "node:path";
19
+ import { Readable } from "node:stream";
20
+ import { pipeline } from "node:stream/promises";
21
+ import sharp from "sharp";
22
+ import { UsageError } from "./errors.js";
23
+ import { logger } from "./logger.js";
24
+ /** Extensions sharp can transcode between. */
25
+ const CONVERTIBLE_IMAGE_EXTS = new Set(["jpg", "jpeg", "png", "webp", "gif", "tiff", "tif", "avif"]);
26
+ export function enumerateArtifacts(task) {
27
+ const out = [];
28
+ if (task.model_urls) {
29
+ for (const [ext, url] of Object.entries(task.model_urls)) {
30
+ if (typeof url === "string" && url) {
31
+ out.push({ key: `model_${ext}`, url, preferredExt: ext.toLowerCase() });
32
+ }
33
+ }
34
+ }
35
+ if (task.thumbnail_url) {
36
+ out.push({ key: "thumbnail", url: task.thumbnail_url, preferredExt: "png" });
37
+ }
38
+ if (Array.isArray(task.texture_urls)) {
39
+ task.texture_urls.forEach((set, i) => {
40
+ for (const [name, url] of Object.entries(set)) {
41
+ if (typeof url === "string" && url) {
42
+ out.push({ key: `texture_${i}_${name}`, url, preferredExt: "png" });
43
+ }
44
+ }
45
+ });
46
+ }
47
+ if (Array.isArray(task.image_urls)) {
48
+ task.image_urls.forEach((url, i) => {
49
+ if (typeof url === "string" && url) {
50
+ out.push({ key: `image_${i}`, url, preferredExt: "" });
51
+ }
52
+ });
53
+ }
54
+ // Rigging / animate-style endpoints nest outputs under `result`.
55
+ if (task.result && typeof task.result === "object") {
56
+ for (const [key, value] of Object.entries(task.result)) {
57
+ if (typeof value !== "string" || !/^https?:/.test(value))
58
+ continue;
59
+ const extMatch = key.match(/_(fbx|glb|usdz|obj|png|jpg|jpeg|webp)_url$/i);
60
+ const preferredExt = extMatch ? extMatch[1].toLowerCase() : "";
61
+ out.push({ key, url: value, preferredExt });
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ /** Heuristic: does this look like a file path (has an extension) or a dir? */
67
+ export function looksLikeFile(path) {
68
+ return /\.[A-Za-z0-9]{2,6}$/.test(path);
69
+ }
70
+ export async function downloadArtifacts(task, outputPath, resource) {
71
+ const artifacts = enumerateArtifacts(task);
72
+ if (artifacts.length === 0) {
73
+ // Report-only tasks (analyze-printability) carry their result in a
74
+ // structured field instead of downloadable files. Persist the full task
75
+ // JSON so `-o` still means "give me the result on disk".
76
+ if (task.printability != null) {
77
+ return saveReportOnly(task, outputPath, resource);
78
+ }
79
+ throw new Error(`task ${task.id} has no downloadable artifacts`);
80
+ }
81
+ if (looksLikeFile(outputPath) && artifacts.length > 1) {
82
+ throw new UsageError(`task ${task.id} produced ${artifacts.length} artifacts — '${outputPath}' looks like a file. ` +
83
+ `Pass a directory path for --output instead (e.g. '${stripExt(outputPath)}').`);
84
+ }
85
+ const singleFileMode = looksLikeFile(outputPath);
86
+ // Plan every path we'd write up front so we can bail before any network
87
+ // work when a destination already exists. This prevents silent overwrite
88
+ // of prior runs.
89
+ let targetDir;
90
+ const plannedArtifactPaths = [];
91
+ if (singleFileMode) {
92
+ targetDir = dirname(outputPath) || ".";
93
+ plannedArtifactPaths.push(outputPath);
94
+ }
95
+ else {
96
+ targetDir = outputPath;
97
+ for (const artifact of artifacts) {
98
+ plannedArtifactPaths.push(join(targetDir, deriveFilename(artifact)));
99
+ }
100
+ }
101
+ // Per-file meta in single-file mode (`-o a.png` → `a_meta.json`) so two
102
+ // outputs can share a directory without trampling each other. Directory
103
+ // mode keeps the plain `meta.json` alongside the artifacts.
104
+ const metadataPath = singleFileMode
105
+ ? `${stripExt(outputPath)}_meta.json`
106
+ : join(targetDir, "meta.json");
107
+ const existing = [...plannedArtifactPaths, metadataPath].filter((p) => existsSync(p));
108
+ if (existing.length > 0) {
109
+ throw new UsageError(`refusing to overwrite existing file(s):\n ${existing.join("\n ")}\n` +
110
+ `(delete them or choose a different --output path to rerun)`);
111
+ }
112
+ mkdirSync(targetDir, { recursive: true });
113
+ const saved = [];
114
+ if (singleFileMode) {
115
+ saved.push(await downloadArtifact(artifacts[0], outputPath));
116
+ }
117
+ else {
118
+ for (const artifact of artifacts) {
119
+ const targetPath = join(targetDir, deriveFilename(artifact));
120
+ saved.push(await downloadArtifact(artifact, targetPath));
121
+ }
122
+ }
123
+ writeMeta(task, resource, metadataPath, saved);
124
+ return { savedFiles: saved, metadataPath };
125
+ }
126
+ function deriveFilename(artifact) {
127
+ if (artifact.key.startsWith("model_")) {
128
+ const ext = artifact.key.slice("model_".length);
129
+ return `model.${ext}`;
130
+ }
131
+ if (artifact.key === "thumbnail") {
132
+ return `thumbnail.${artifact.preferredExt || "png"}`;
133
+ }
134
+ // Keys from `result.*_url` (animate / rigging) arrive like
135
+ // "animation_glb_url". The trailing "_url" is structural; the real name
136
+ // is what precedes it.
137
+ const stem = artifact.key.replace(/_url$/, "");
138
+ // Unknown extension → leave it off; downloadArtifact will append the
139
+ // content-type-derived extension so we don't emit a bogus `.bin`.
140
+ return artifact.preferredExt ? `${stem}.${artifact.preferredExt}` : stem;
141
+ }
142
+ function stripExt(path) {
143
+ const ext = extname(path);
144
+ return ext ? path.slice(0, -ext.length) : path;
145
+ }
146
+ async function downloadArtifact(artifact, targetPath) {
147
+ logger.debug(`GET ${artifact.url}`);
148
+ const resp = await fetch(artifact.url);
149
+ if (!resp.ok) {
150
+ throw new Error(`download failed for ${artifact.key} (${resp.status} ${resp.statusText})`);
151
+ }
152
+ if (!resp.body)
153
+ throw new Error(`empty body for ${artifact.url}`);
154
+ const contentType = resp.headers.get("content-type") ?? "";
155
+ const actualExt = extFromContentType(contentType);
156
+ const requestedExt = extname(targetPath).slice(1).toLowerCase();
157
+ mkdirSync(dirname(targetPath), { recursive: true });
158
+ // No extension requested (e.g. unknown-format image artifact) — pick one
159
+ // from the content-type so the file has a reasonable suffix.
160
+ if (!requestedExt && actualExt) {
161
+ const finalPath = `${targetPath}.${actualExt}`;
162
+ await pipeline(Readable.fromWeb(resp.body), createWriteStream(finalPath));
163
+ return finalPath;
164
+ }
165
+ // Fast path: extensions agree (or the server didn't specify one) — stream through.
166
+ if (!actualExt ||
167
+ !requestedExt ||
168
+ actualExt === requestedExt ||
169
+ extEquivalent(actualExt, requestedExt)) {
170
+ await pipeline(Readable.fromWeb(resp.body), createWriteStream(targetPath));
171
+ return targetPath;
172
+ }
173
+ // Extensions differ. Buffer the body so we can either transcode or rename.
174
+ const buffer = Buffer.from(await resp.arrayBuffer());
175
+ // Both sides are image formats sharp understands — convert.
176
+ if (CONVERTIBLE_IMAGE_EXTS.has(actualExt) && CONVERTIBLE_IMAGE_EXTS.has(requestedExt)) {
177
+ logger.debug(`converting ${actualExt} → ${requestedExt} for ${artifact.key}`);
178
+ await convertImage(buffer, requestedExt, targetPath);
179
+ return targetPath;
180
+ }
181
+ // Can't convert safely — save with the true extension so the file isn't a lie.
182
+ const base = targetPath.slice(0, targetPath.length - (requestedExt.length + 1));
183
+ const fallback = `${base}.${actualExt}`;
184
+ logger.warn(`extension mismatch for ${artifact.key}: requested .${requestedExt}, got ${contentType || "?"}; ` +
185
+ `cannot transcode ${actualExt} → ${requestedExt}, saving as ${fallback}`);
186
+ await pipeline(Readable.from(buffer), createWriteStream(fallback));
187
+ return fallback;
188
+ }
189
+ async function convertImage(buffer, targetExt, targetPath) {
190
+ const pipe = sharp(buffer);
191
+ switch (targetExt) {
192
+ case "jpg":
193
+ case "jpeg":
194
+ await pipe.jpeg({ quality: 92 }).toFile(targetPath);
195
+ return;
196
+ case "png":
197
+ await pipe.png().toFile(targetPath);
198
+ return;
199
+ case "webp":
200
+ await pipe.webp({ quality: 92 }).toFile(targetPath);
201
+ return;
202
+ case "gif":
203
+ await pipe.gif().toFile(targetPath);
204
+ return;
205
+ case "tiff":
206
+ case "tif":
207
+ await pipe.tiff().toFile(targetPath);
208
+ return;
209
+ case "avif":
210
+ await pipe.avif({ quality: 60 }).toFile(targetPath);
211
+ return;
212
+ default:
213
+ throw new Error(`unsupported image target extension: ${targetExt}`);
214
+ }
215
+ }
216
+ function extFromContentType(ct) {
217
+ const base = ct.split(";")[0].trim().toLowerCase();
218
+ const map = {
219
+ "image/jpeg": "jpg",
220
+ "image/png": "png",
221
+ "image/webp": "webp",
222
+ "image/gif": "gif",
223
+ "image/tiff": "tiff",
224
+ "image/bmp": "bmp",
225
+ "model/gltf-binary": "glb",
226
+ "model/gltf+json": "gltf",
227
+ "model/obj": "obj",
228
+ "model/vnd.usdz+zip": "usdz",
229
+ "model/stl": "stl",
230
+ "model/3mf": "3mf",
231
+ "application/json": "json",
232
+ "video/mp4": "mp4",
233
+ };
234
+ return map[base] ?? "";
235
+ }
236
+ function extEquivalent(a, b) {
237
+ const groups = [new Set(["jpg", "jpeg"]), new Set(["tif", "tiff"])];
238
+ return groups.some((g) => g.has(a) && g.has(b));
239
+ }
240
+ /**
241
+ * Save a no-artifact task (e.g. analyze-printability) to disk. Two layouts:
242
+ * - `-o report.json` (or any .json file): write the full task object there;
243
+ * no sidecar (the file IS the report).
244
+ * - `-o some/dir/` (or any non-file path): write `meta.json` inside,
245
+ * matching the directory-mode layout used elsewhere.
246
+ * Other single-file extensions are rejected — the data is JSON, lying about
247
+ * the extension would be worse than a clear error.
248
+ */
249
+ function saveReportOnly(task, outputPath, resource) {
250
+ const singleFileMode = looksLikeFile(outputPath);
251
+ if (singleFileMode) {
252
+ const ext = extname(outputPath).slice(1).toLowerCase();
253
+ if (ext !== "json") {
254
+ throw new UsageError(`${resource} produces a JSON report — pass '-o <path>.json' or a directory path (got '${outputPath}').`);
255
+ }
256
+ if (existsSync(outputPath)) {
257
+ throw new UsageError(`refusing to overwrite existing file:\n ${outputPath}\n` +
258
+ `(delete it or choose a different --output path to rerun)`);
259
+ }
260
+ mkdirSync(dirname(outputPath) || ".", { recursive: true });
261
+ writeFileSync(outputPath, `${JSON.stringify({ resource, task, downloaded_at: new Date().toISOString() }, null, 2)}\n`, "utf8");
262
+ return { savedFiles: [], metadataPath: outputPath };
263
+ }
264
+ const metadataPath = join(outputPath, "meta.json");
265
+ if (existsSync(metadataPath)) {
266
+ throw new UsageError(`refusing to overwrite existing file:\n ${metadataPath}\n` +
267
+ `(delete it or choose a different --output path to rerun)`);
268
+ }
269
+ mkdirSync(outputPath, { recursive: true });
270
+ writeMeta(task, resource, metadataPath, []);
271
+ return { savedFiles: [], metadataPath };
272
+ }
273
+ function writeMeta(task, resource, path, savedFiles) {
274
+ const meta = {
275
+ resource,
276
+ task,
277
+ saved_files: savedFiles,
278
+ downloaded_at: new Date().toISOString(),
279
+ };
280
+ mkdirSync(dirname(path), { recursive: true });
281
+ writeFileSync(path, `${JSON.stringify(meta, null, 2)}\n`, "utf8");
282
+ }
283
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/internal/download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,8CAA8C;AAC9C,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAWrG,MAAM,UAAU,kBAAkB,CAAC,IAAU;IAC3C,MAAM,GAAG,GAAe,EAAE,CAAC;IAE3B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACnC,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,EAAE,CAAC;oBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC1E,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAU,EACV,UAAkB,EAClB,QAAgB;IAEhB,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,mEAAmE;QACnE,wEAAwE;QACxE,yDAAyD;QACzD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;YAC9B,OAAO,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,gCAAgC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,aAAa,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,UAAU,CAClB,QAAQ,IAAI,CAAC,EAAE,aAAa,SAAS,CAAC,MAAM,iBAAiB,UAAU,uBAAuB;YAC5F,qDAAqD,QAAQ,CAAC,UAAU,CAAC,KAAK,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,cAAc,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAEjD,wEAAwE;IACxE,yEAAyE;IACzE,iBAAiB;IACjB,IAAI,SAAiB,CAAC;IACtB,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAC1C,IAAI,cAAc,EAAE,CAAC;QACnB,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC;QACvC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,UAAU,CAAC;QACvB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,wEAAwE;IACxE,wEAAwE;IACxE,4DAA4D;IAC5D,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,YAAY;QACrC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,CAAC,GAAG,oBAAoB,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAClB,8CAA8C,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;YACrE,4DAA4D,CAC/D,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,MAAM,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,QAAkB;IACxC,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,SAAS,GAAG,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,aAAa,QAAQ,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC;IACvD,CAAC;IACD,2DAA2D;IAC3D,wEAAwE;IACxE,uBAAuB;IACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/C,qEAAqE;IACrE,kEAAkE;IAClE,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,UAAkB;IACpE,MAAM,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAElE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,yEAAyE;IACzE,6DAA6D;IAC7D,IAAI,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,GAAG,UAAU,IAAI,SAAS,EAAE,CAAC;QAC/C,MAAM,QAAQ,CACZ,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAA2D,CAAC,EAClF,iBAAiB,CAAC,SAAS,CAAC,CAC7B,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,mFAAmF;IACnF,IACE,CAAC,SAAS;QACV,CAAC,YAAY;QACb,SAAS,KAAK,YAAY;QAC1B,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,EACtC,CAAC;QACD,MAAM,QAAQ,CACZ,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAA2D,CAAC,EAClF,iBAAiB,CAAC,UAAU,CAAC,CAC9B,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,2EAA2E;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAErD,4DAA4D;IAC5D,IAAI,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACtF,MAAM,CAAC,KAAK,CAAC,cAAc,SAAS,MAAM,YAAY,QAAQ,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9E,MAAM,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACrD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,+EAA+E;IAC/E,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC;IACxC,MAAM,CAAC,IAAI,CACT,0BAA0B,QAAQ,CAAC,GAAG,gBAAgB,YAAY,SAAS,WAAW,IAAI,GAAG,IAAI;QAC/F,oBAAoB,SAAS,MAAM,YAAY,eAAe,QAAQ,EAAE,CAC3E,CAAC;IACF,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,SAAiB,EAAE,UAAkB;IAC/E,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACT,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,OAAO;QACT,KAAK,KAAK;YACR,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpC,OAAO;QACT,KAAK,MAAM;YACT,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,OAAO;QACT,KAAK,KAAK;YACR,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpC,OAAO;QACT,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK;YACR,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrC,OAAO;QACT,KAAK,MAAM;YACT,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpD,OAAO;QACT;YACE,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAU;IACpC,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,GAAG,GAA2B;QAClC,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,KAAK;QAClB,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,KAAK;QAClB,mBAAmB,EAAE,KAAK;QAC1B,iBAAiB,EAAE,MAAM;QACzB,WAAW,EAAE,KAAK;QAClB,oBAAoB,EAAE,MAAM;QAC5B,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,KAAK;QAClB,kBAAkB,EAAE,MAAM;QAC1B,WAAW,EAAE,KAAK;KACnB,CAAC;IACF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,cAAc,CAAC,IAAU,EAAE,UAAkB,EAAE,QAAgB;IACtE,MAAM,cAAc,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,UAAU,CAClB,GAAG,QAAQ,6EAA6E,UAAU,KAAK,CACxG,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,UAAU,CAClB,2CAA2C,UAAU,IAAI;gBACvD,0DAA0D,CAC7D,CAAC;QACJ,CAAC;QACD,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,aAAa,CACX,UAAU,EACV,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC3F,MAAM,CACP,CAAC;QACF,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAClB,2CAA2C,YAAY,IAAI;YACzD,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IACD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,IAAU,EAAE,QAAgB,EAAE,IAAY,EAAE,UAAoB;IACjF,MAAM,IAAI,GAAG;QACX,QAAQ;QACR,IAAI;QACJ,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;IACF,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Terminal error presentation — routes a caught error to stderr with a
3
+ * human-friendly line, emits the structured payload when --format=json, and
4
+ * maps MeshyApiError codes to conventional exit codes for scripting.
5
+ */
6
+ import { type OutputFormat } from "./output.js";
7
+ export declare const EXIT_CODES: {
8
+ readonly OK: 0;
9
+ readonly GENERIC: 1;
10
+ readonly USAGE: 2;
11
+ readonly AUTH: 3;
12
+ readonly VALIDATION: 4;
13
+ readonly NOT_FOUND: 5;
14
+ readonly RATE_LIMIT: 6;
15
+ readonly NETWORK: 7;
16
+ readonly TIMED_OUT: 8;
17
+ readonly CREDIT: 9;
18
+ };
19
+ export declare class UsageError extends Error {
20
+ constructor(message: string);
21
+ }
22
+ /**
23
+ * An error that carries the command which fixes it.
24
+ *
25
+ * Agents parse stdout, not the prose on stderr, so a recoverable failure has to
26
+ * say how to recover *in the payload*: `hint` is a command the caller can run
27
+ * verbatim. Errors with no known remedy stay plain — a wrong guess is worse
28
+ * than no hint.
29
+ */
30
+ export declare class HintedError extends Error {
31
+ readonly code: string;
32
+ readonly hint?: string;
33
+ readonly docs?: string;
34
+ /**
35
+ * Overrides the exit code this error maps to. Set it when the failure has a
36
+ * conventional code that `code` alone doesn't imply — a chained step that
37
+ * times out is still a timeout (8), not a generic failure.
38
+ */
39
+ readonly exitCode?: number;
40
+ constructor(params: {
41
+ message: string;
42
+ code: string;
43
+ hint?: string;
44
+ docs?: string;
45
+ exitCode?: number;
46
+ });
47
+ }
48
+ export declare const SESSION_REVOKED_HINT = "Session revoked or expired. Run: meshy auth login";
49
+ export declare const CREDENTIAL_REJECTED_HINT = "Credential rejected or revoked. Run: meshy auth login (or: meshy auth login --with-key msy_...)";
50
+ /** No credential at all — the error every new user meets first. */
51
+ export declare function authRequiredError(detail?: string): HintedError;
52
+ export declare function exitCodeFor(err: unknown): number;
53
+ export declare function reportError(err: unknown, format: OutputFormat): void;
54
+ /**
55
+ * The payload shape stays additive: `hint` and `docs` join the existing
56
+ * name/message/status/code/path fields rather than moving everything under an
57
+ * `{ok:false, error:{…}}` envelope. Successful commands emit bare API payloads
58
+ * with no `ok` field, so an envelope on failures only would force consumers to
59
+ * probe for two different shapes.
60
+ */
61
+ export declare function toErrorPayload(err: unknown): {
62
+ name: string;
63
+ message: string;
64
+ [k: string]: unknown;
65
+ };
66
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAQ,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtD,eAAO,MAAM,UAAU;;;;;;;;;;;CAWb,CAAC;AAEX,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;GAOG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAEf,MAAM,EAAE;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;CAQF;AAID,eAAO,MAAM,oBAAoB,sDAAsD,CAAC;AACxF,eAAO,MAAM,wBAAwB,qGAAkD,CAAC;AAExF,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAO9D;AAyBD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CA0BhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAapE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CA4BpG"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Terminal error presentation — routes a caught error to stderr with a
3
+ * human-friendly line, emits the structured payload when --format=json, and
4
+ * maps MeshyApiError codes to conventional exit codes for scripting.
5
+ */
6
+ import { MeshyApiError } from "../client/errors.js";
7
+ import { emit } from "./output.js";
8
+ export const EXIT_CODES = {
9
+ OK: 0,
10
+ GENERIC: 1,
11
+ USAGE: 2,
12
+ AUTH: 3,
13
+ VALIDATION: 4,
14
+ NOT_FOUND: 5,
15
+ RATE_LIMIT: 6,
16
+ NETWORK: 7,
17
+ TIMED_OUT: 8,
18
+ CREDIT: 9,
19
+ };
20
+ export class UsageError extends Error {
21
+ constructor(message) {
22
+ super(message);
23
+ this.name = "UsageError";
24
+ }
25
+ }
26
+ /**
27
+ * An error that carries the command which fixes it.
28
+ *
29
+ * Agents parse stdout, not the prose on stderr, so a recoverable failure has to
30
+ * say how to recover *in the payload*: `hint` is a command the caller can run
31
+ * verbatim. Errors with no known remedy stay plain — a wrong guess is worse
32
+ * than no hint.
33
+ */
34
+ export class HintedError extends Error {
35
+ code;
36
+ hint;
37
+ docs;
38
+ /**
39
+ * Overrides the exit code this error maps to. Set it when the failure has a
40
+ * conventional code that `code` alone doesn't imply — a chained step that
41
+ * times out is still a timeout (8), not a generic failure.
42
+ */
43
+ exitCode;
44
+ constructor(params) {
45
+ super(params.message);
46
+ this.name = "HintedError";
47
+ this.code = params.code;
48
+ this.hint = params.hint;
49
+ this.docs = params.docs;
50
+ this.exitCode = params.exitCode;
51
+ }
52
+ }
53
+ const DOCS_AUTH = "https://docs.meshy.ai/en/api/authentication";
54
+ const LOGIN_HINT = "Run: meshy auth login (or: meshy auth login --with-key msy_...)";
55
+ export const SESSION_REVOKED_HINT = "Session revoked or expired. Run: meshy auth login";
56
+ export const CREDENTIAL_REJECTED_HINT = `Credential rejected or revoked. ${LOGIN_HINT}`;
57
+ /** No credential at all — the error every new user meets first. */
58
+ export function authRequiredError(detail) {
59
+ return new HintedError({
60
+ message: detail ?? "No credentials found.",
61
+ code: "unauthenticated",
62
+ hint: LOGIN_HINT,
63
+ docs: DOCS_AUTH,
64
+ });
65
+ }
66
+ /**
67
+ * Remedies for API failures, keyed by MeshyApiError.code so the mapping lives
68
+ * in one place instead of at every call site.
69
+ */
70
+ function hintForApiError(err) {
71
+ switch (err.code) {
72
+ case "auth":
73
+ if (err.credentialKind === "api_key") {
74
+ return { hint: CREDENTIAL_REJECTED_HINT, docs: DOCS_AUTH };
75
+ }
76
+ // oauth or unknown → session-revoked hint
77
+ return { hint: SESSION_REVOKED_HINT, docs: DOCS_AUTH };
78
+ case "credit":
79
+ return {
80
+ hint: "Out of credits. Confirm with: meshy balance — then top up at https://www.meshy.ai/pricing",
81
+ };
82
+ case "rate_limit":
83
+ return { hint: "Rate limited. Pause before retrying, or lower request concurrency." };
84
+ default:
85
+ return {};
86
+ }
87
+ }
88
+ export function exitCodeFor(err) {
89
+ if (err instanceof UsageError)
90
+ return EXIT_CODES.USAGE;
91
+ if (err instanceof HintedError) {
92
+ // An explicit exitCode wins — the raiser knew the conventional code for
93
+ // its own failure (a chained `make` step that times out is a timeout).
94
+ // Otherwise map by code: "unauthenticated" → AUTH(3); "oauth_timeout" →
95
+ // TIMED_OUT(8) (device flow expired_token, loopback waitForCallback
96
+ // timeout, manual prompt timeout all share it); everything else →
97
+ // GENERIC(1).
98
+ if (err.exitCode !== undefined)
99
+ return err.exitCode;
100
+ if (err.code === "unauthenticated")
101
+ return EXIT_CODES.AUTH;
102
+ if (err.code === "oauth_timeout")
103
+ return EXIT_CODES.TIMED_OUT;
104
+ return EXIT_CODES.GENERIC;
105
+ }
106
+ if (err instanceof MeshyApiError) {
107
+ switch (err.code) {
108
+ case "auth": return EXIT_CODES.AUTH;
109
+ case "validation": return EXIT_CODES.VALIDATION;
110
+ case "not_found": return EXIT_CODES.NOT_FOUND;
111
+ case "rate_limit": return EXIT_CODES.RATE_LIMIT;
112
+ case "network": return EXIT_CODES.NETWORK;
113
+ case "credit": return EXIT_CODES.CREDIT;
114
+ case "server": return EXIT_CODES.GENERIC;
115
+ }
116
+ }
117
+ return EXIT_CODES.GENERIC;
118
+ }
119
+ export function reportError(err, format) {
120
+ const payload = toErrorPayload(err);
121
+ process.stderr.write(`error: ${payload.message}\n`);
122
+ if (typeof payload["hint"] === "string") {
123
+ process.stderr.write(`hint: ${payload["hint"]}\n`);
124
+ }
125
+ if (format !== "pretty") {
126
+ try {
127
+ emit(payload, { format });
128
+ }
129
+ catch {
130
+ /* ignore: stderr already carries the human message */
131
+ }
132
+ }
133
+ }
134
+ /**
135
+ * The payload shape stays additive: `hint` and `docs` join the existing
136
+ * name/message/status/code/path fields rather than moving everything under an
137
+ * `{ok:false, error:{…}}` envelope. Successful commands emit bare API payloads
138
+ * with no `ok` field, so an envelope on failures only would force consumers to
139
+ * probe for two different shapes.
140
+ */
141
+ export function toErrorPayload(err) {
142
+ if (err instanceof MeshyApiError) {
143
+ return { ...err.toJSON(), ...hintForApiError(err), name: err.name, message: err.message };
144
+ }
145
+ if (err instanceof HintedError) {
146
+ // DeviceFlowError (a HintedError subclass) carries an oauthErrorCode field
147
+ // that machine consumers need to distinguish access_denied / invalid_grant /
148
+ // expired_token etc. Serialise it as `oauth_error` (snake_case, consistent
149
+ // with the rest of the JSON error payload) without importing the subclass
150
+ // (which would create a circular dependency through device.ts → errors.ts).
151
+ const errAsUnknown = err;
152
+ const oauthError = typeof errAsUnknown["oauthErrorCode"] === "string"
153
+ ? errAsUnknown["oauthErrorCode"]
154
+ : undefined;
155
+ return {
156
+ name: err.name,
157
+ message: err.message,
158
+ code: err.code,
159
+ ...(oauthError !== undefined ? { oauth_error: oauthError } : {}),
160
+ ...(err.hint ? { hint: err.hint } : {}),
161
+ ...(err.docs ? { docs: err.docs } : {}),
162
+ };
163
+ }
164
+ if (err instanceof Error) {
165
+ return { name: err.name, message: err.message };
166
+ }
167
+ return { name: "Error", message: String(err) };
168
+ }
169
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Resolve user-supplied image and model inputs into something Meshy accepts.
3
+ *
4
+ * Accepted inputs (both images and 3D models):
5
+ * - http(s) URLs — preflighted with HEAD so unreachable sources fail fast.
6
+ * - Local file paths (absolute or relative to cwd) — read, MIME-sniffed,
7
+ * and inlined as data URIs. Users don't have to host files themselves.
8
+ *
9
+ * Base64 data URIs on the command line aren't accepted — the whole point of
10
+ * local-path support is to spare the user from encoding them manually.
11
+ */
12
+ /** camelCase option names that hold image inputs. */
13
+ export declare const IMAGE_FIELDS: {
14
+ scalar: readonly ["imageUrl", "imageStyleUrl"];
15
+ list: readonly ["imageUrls", "referenceImageUrls"];
16
+ };
17
+ /** camelCase option names that hold 3D model inputs. */
18
+ export declare const MODEL_FIELDS: {
19
+ scalar: readonly ["modelUrl"];
20
+ list: readonly [];
21
+ };
22
+ export declare function resolveImageFields(opts: Record<string, unknown>): Promise<void>;
23
+ export declare function resolveModelFields(opts: Record<string, unknown>): Promise<void>;
24
+ //# sourceMappingURL=file-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-input.d.ts","sourceRoot":"","sources":["../../src/internal/file-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,qDAAqD;AACrD,eAAO,MAAM,YAAY;;;CASxB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,YAAY;;;CAGxB,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAErF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAErF"}