@meshy-ai/cli 0.1.3 → 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.
Files changed (293) hide show
  1. package/.env.example +8 -2
  2. package/README.md +342 -108
  3. package/dist/client/endpoints/animation-catalog.d.ts +37 -0
  4. package/dist/client/endpoints/animation-catalog.d.ts.map +1 -0
  5. package/dist/client/endpoints/animation-catalog.js +55 -0
  6. package/dist/client/endpoints/animation-catalog.js.map +1 -0
  7. package/dist/client/endpoints/balance.d.ts +5 -0
  8. package/dist/client/endpoints/balance.d.ts.map +1 -1
  9. package/dist/client/endpoints/balance.js +5 -1
  10. package/dist/client/endpoints/balance.js.map +1 -1
  11. package/dist/client/endpoints/base.d.ts +41 -7
  12. package/dist/client/endpoints/base.d.ts.map +1 -1
  13. package/dist/client/endpoints/base.js +61 -40
  14. package/dist/client/endpoints/base.js.map +1 -1
  15. package/dist/client/endpoints/showcases.d.ts +31 -0
  16. package/dist/client/endpoints/showcases.d.ts.map +1 -0
  17. package/dist/client/endpoints/showcases.js +49 -0
  18. package/dist/client/endpoints/showcases.js.map +1 -0
  19. package/dist/client/errors.d.ts +1 -0
  20. package/dist/client/errors.d.ts.map +1 -1
  21. package/dist/client/errors.js +1 -1
  22. package/dist/client/errors.js.map +1 -1
  23. package/dist/client/index.d.ts +47 -38
  24. package/dist/client/index.d.ts.map +1 -1
  25. package/dist/client/index.js +89 -120
  26. package/dist/client/index.js.map +1 -1
  27. package/dist/client/resource-registry.d.ts +97 -0
  28. package/dist/client/resource-registry.d.ts.map +1 -0
  29. package/dist/client/resource-registry.js +157 -0
  30. package/dist/client/resource-registry.js.map +1 -0
  31. package/dist/client/transport.d.ts +99 -0
  32. package/dist/client/transport.d.ts.map +1 -0
  33. package/dist/client/transport.js +320 -0
  34. package/dist/client/transport.js.map +1 -0
  35. package/dist/client/types.d.ts +28 -221
  36. package/dist/client/types.d.ts.map +1 -1
  37. package/dist/client/types.js +28 -6
  38. package/dist/client/types.js.map +1 -1
  39. package/dist/cmd/animation-catalog.d.ts +26 -0
  40. package/dist/cmd/animation-catalog.d.ts.map +1 -0
  41. package/dist/cmd/animation-catalog.js +80 -0
  42. package/dist/cmd/animation-catalog.js.map +1 -0
  43. package/dist/cmd/api.d.ts +3 -2
  44. package/dist/cmd/api.d.ts.map +1 -1
  45. package/dist/cmd/api.js +22 -8
  46. package/dist/cmd/api.js.map +1 -1
  47. package/dist/cmd/auth.d.ts.map +1 -1
  48. package/dist/cmd/auth.js +5 -0
  49. package/dist/cmd/auth.js.map +1 -1
  50. package/dist/cmd/balance.d.ts.map +1 -1
  51. package/dist/cmd/balance.js +10 -6
  52. package/dist/cmd/balance.js.map +1 -1
  53. package/dist/cmd/creative-lab.d.ts +26 -0
  54. package/dist/cmd/creative-lab.d.ts.map +1 -0
  55. package/dist/cmd/creative-lab.js +256 -0
  56. package/dist/cmd/creative-lab.js.map +1 -0
  57. package/dist/cmd/delete.d.ts.map +1 -1
  58. package/dist/cmd/delete.js +6 -7
  59. package/dist/cmd/delete.js.map +1 -1
  60. package/dist/cmd/doctor.d.ts +23 -0
  61. package/dist/cmd/doctor.d.ts.map +1 -0
  62. package/dist/cmd/doctor.js +61 -0
  63. package/dist/cmd/doctor.js.map +1 -0
  64. package/dist/cmd/download.d.ts +17 -0
  65. package/dist/cmd/download.d.ts.map +1 -0
  66. package/dist/cmd/download.js +436 -0
  67. package/dist/cmd/download.js.map +1 -0
  68. package/dist/cmd/inspect.d.ts +63 -0
  69. package/dist/cmd/inspect.d.ts.map +1 -0
  70. package/dist/cmd/inspect.js +179 -0
  71. package/dist/cmd/inspect.js.map +1 -0
  72. package/dist/cmd/make.d.ts +13 -3
  73. package/dist/cmd/make.d.ts.map +1 -1
  74. package/dist/cmd/make.js +240 -36
  75. package/dist/cmd/make.js.map +1 -1
  76. package/dist/cmd/mesh.d.ts +13 -0
  77. package/dist/cmd/mesh.d.ts.map +1 -0
  78. package/dist/cmd/mesh.js +67 -0
  79. package/dist/cmd/mesh.js.map +1 -0
  80. package/dist/cmd/project.d.ts +16 -0
  81. package/dist/cmd/project.d.ts.map +1 -0
  82. package/dist/cmd/project.js +136 -0
  83. package/dist/cmd/project.js.map +1 -0
  84. package/dist/cmd/resources.d.ts +5 -0
  85. package/dist/cmd/resources.d.ts.map +1 -1
  86. package/dist/cmd/resources.js +38 -10
  87. package/dist/cmd/resources.js.map +1 -1
  88. package/dist/cmd/showcases.d.ts +10 -0
  89. package/dist/cmd/showcases.d.ts.map +1 -0
  90. package/dist/cmd/showcases.js +63 -0
  91. package/dist/cmd/showcases.js.map +1 -0
  92. package/dist/cmd/slicer.d.ts +12 -0
  93. package/dist/cmd/slicer.d.ts.map +1 -0
  94. package/dist/cmd/slicer.js +46 -0
  95. package/dist/cmd/slicer.js.map +1 -0
  96. package/dist/cmd/uv-unwrap.d.ts +16 -0
  97. package/dist/cmd/uv-unwrap.d.ts.map +1 -0
  98. package/dist/cmd/uv-unwrap.js +52 -0
  99. package/dist/cmd/uv-unwrap.js.map +1 -0
  100. package/dist/index.d.ts +13 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +141 -8
  103. package/dist/index.js.map +1 -1
  104. package/dist/internal/artifacts.d.ts +97 -0
  105. package/dist/internal/artifacts.d.ts.map +1 -0
  106. package/dist/internal/artifacts.js +280 -0
  107. package/dist/internal/artifacts.js.map +1 -0
  108. package/dist/internal/atomic-file.d.ts +39 -0
  109. package/dist/internal/atomic-file.d.ts.map +1 -0
  110. package/dist/internal/atomic-file.js +160 -0
  111. package/dist/internal/atomic-file.js.map +1 -0
  112. package/dist/internal/command-helpers.d.ts +46 -0
  113. package/dist/internal/command-helpers.d.ts.map +1 -0
  114. package/dist/internal/command-helpers.js +61 -0
  115. package/dist/internal/command-helpers.js.map +1 -0
  116. package/dist/internal/config.d.ts +48 -5
  117. package/dist/internal/config.d.ts.map +1 -1
  118. package/dist/internal/config.js +95 -6
  119. package/dist/internal/config.js.map +1 -1
  120. package/dist/internal/context.d.ts +25 -0
  121. package/dist/internal/context.d.ts.map +1 -0
  122. package/dist/internal/context.js +37 -0
  123. package/dist/internal/context.js.map +1 -0
  124. package/dist/internal/credentials.d.ts +11 -0
  125. package/dist/internal/credentials.d.ts.map +1 -1
  126. package/dist/internal/credentials.js +2 -0
  127. package/dist/internal/credentials.js.map +1 -1
  128. package/dist/internal/device-state.js.map +1 -1
  129. package/dist/internal/device.d.ts.map +1 -1
  130. package/dist/internal/doctor.d.ts +94 -0
  131. package/dist/internal/doctor.d.ts.map +1 -0
  132. package/dist/internal/doctor.js +280 -0
  133. package/dist/internal/doctor.js.map +1 -0
  134. package/dist/internal/download.d.ts +147 -13
  135. package/dist/internal/download.d.ts.map +1 -1
  136. package/dist/internal/download.js +735 -142
  137. package/dist/internal/download.js.map +1 -1
  138. package/dist/internal/env-file.d.ts +29 -0
  139. package/dist/internal/env-file.d.ts.map +1 -0
  140. package/dist/internal/env-file.js +95 -0
  141. package/dist/internal/env-file.js.map +1 -0
  142. package/dist/internal/errors.d.ts +74 -1
  143. package/dist/internal/errors.d.ts.map +1 -1
  144. package/dist/internal/errors.js +173 -1
  145. package/dist/internal/errors.js.map +1 -1
  146. package/dist/internal/file-input.d.ts +52 -12
  147. package/dist/internal/file-input.d.ts.map +1 -1
  148. package/dist/internal/file-input.js +162 -33
  149. package/dist/internal/file-input.js.map +1 -1
  150. package/dist/internal/flags.js.map +1 -1
  151. package/dist/internal/global-options.d.ts +6 -4
  152. package/dist/internal/global-options.d.ts.map +1 -1
  153. package/dist/internal/global-options.js +19 -4
  154. package/dist/internal/global-options.js.map +1 -1
  155. package/dist/internal/headless.js.map +1 -1
  156. package/dist/internal/image-models.d.ts.map +1 -1
  157. package/dist/internal/inspect.d.ts +67 -0
  158. package/dist/internal/inspect.d.ts.map +1 -0
  159. package/dist/internal/inspect.js +111 -0
  160. package/dist/internal/inspect.js.map +1 -0
  161. package/dist/internal/lock.d.ts +19 -0
  162. package/dist/internal/lock.d.ts.map +1 -0
  163. package/dist/internal/lock.js +66 -0
  164. package/dist/internal/lock.js.map +1 -0
  165. package/dist/internal/logger.d.ts.map +1 -1
  166. package/dist/internal/material-links.d.ts +115 -0
  167. package/dist/internal/material-links.d.ts.map +1 -0
  168. package/dist/internal/material-links.js +577 -0
  169. package/dist/internal/material-links.js.map +1 -0
  170. package/dist/internal/obj-transform.d.ts +115 -0
  171. package/dist/internal/obj-transform.d.ts.map +1 -0
  172. package/dist/internal/obj-transform.js +649 -0
  173. package/dist/internal/obj-transform.js.map +1 -0
  174. package/dist/internal/operation-store.d.ts +123 -0
  175. package/dist/internal/operation-store.d.ts.map +1 -0
  176. package/dist/internal/operation-store.js +229 -0
  177. package/dist/internal/operation-store.js.map +1 -0
  178. package/dist/internal/output.d.ts +20 -2
  179. package/dist/internal/output.d.ts.map +1 -1
  180. package/dist/internal/output.js +32 -4
  181. package/dist/internal/output.js.map +1 -1
  182. package/dist/internal/paths.d.ts +89 -0
  183. package/dist/internal/paths.d.ts.map +1 -0
  184. package/dist/internal/paths.js +168 -0
  185. package/dist/internal/paths.js.map +1 -0
  186. package/dist/internal/payload.d.ts +15 -0
  187. package/dist/internal/payload.d.ts.map +1 -1
  188. package/dist/internal/payload.js +50 -3
  189. package/dist/internal/payload.js.map +1 -1
  190. package/dist/internal/poll.d.ts +30 -4
  191. package/dist/internal/poll.d.ts.map +1 -1
  192. package/dist/internal/poll.js +99 -16
  193. package/dist/internal/poll.js.map +1 -1
  194. package/dist/internal/pricing.d.ts.map +1 -1
  195. package/dist/internal/project-store.d.ts +197 -0
  196. package/dist/internal/project-store.d.ts.map +1 -0
  197. package/dist/internal/project-store.js +467 -0
  198. package/dist/internal/project-store.js.map +1 -0
  199. package/dist/internal/result.d.ts +50 -0
  200. package/dist/internal/result.d.ts.map +1 -0
  201. package/dist/internal/result.js +41 -0
  202. package/dist/internal/result.js.map +1 -0
  203. package/dist/internal/runtime.d.ts +35 -5
  204. package/dist/internal/runtime.d.ts.map +1 -1
  205. package/dist/internal/runtime.js +68 -18
  206. package/dist/internal/runtime.js.map +1 -1
  207. package/dist/internal/slicers.d.ts +117 -0
  208. package/dist/internal/slicers.d.ts.map +1 -0
  209. package/dist/internal/slicers.js +314 -0
  210. package/dist/internal/slicers.js.map +1 -0
  211. package/dist/internal/stream.d.ts +58 -0
  212. package/dist/internal/stream.d.ts.map +1 -0
  213. package/dist/internal/stream.js +280 -0
  214. package/dist/internal/stream.js.map +1 -0
  215. package/dist/internal/task-command.d.ts +128 -11
  216. package/dist/internal/task-command.d.ts.map +1 -1
  217. package/dist/internal/task-command.js +991 -111
  218. package/dist/internal/task-command.js.map +1 -1
  219. package/dist/internal/task-view.d.ts +56 -0
  220. package/dist/internal/task-view.d.ts.map +1 -0
  221. package/dist/internal/task-view.js +95 -0
  222. package/dist/internal/task-view.js.map +1 -0
  223. package/dist/internal/update-notifier.d.ts +5 -1
  224. package/dist/internal/update-notifier.d.ts.map +1 -1
  225. package/dist/internal/update-notifier.js +7 -3
  226. package/dist/internal/update-notifier.js.map +1 -1
  227. package/dist/internal/version.js.map +1 -1
  228. package/dist/root.d.ts +10 -0
  229. package/dist/root.d.ts.map +1 -1
  230. package/dist/root.js +75 -10
  231. package/dist/root.js.map +1 -1
  232. package/package.json +11 -10
  233. package/skills/meshy-cli/SKILL.md +140 -59
  234. package/dist/client/endpoints/analyze-printability.d.ts +0 -5
  235. package/dist/client/endpoints/analyze-printability.d.ts.map +0 -1
  236. package/dist/client/endpoints/analyze-printability.js +0 -7
  237. package/dist/client/endpoints/analyze-printability.js.map +0 -1
  238. package/dist/client/endpoints/animate.d.ts +0 -6
  239. package/dist/client/endpoints/animate.d.ts.map +0 -1
  240. package/dist/client/endpoints/animate.js +0 -8
  241. package/dist/client/endpoints/animate.js.map +0 -1
  242. package/dist/client/endpoints/convert.d.ts +0 -5
  243. package/dist/client/endpoints/convert.d.ts.map +0 -1
  244. package/dist/client/endpoints/convert.js +0 -7
  245. package/dist/client/endpoints/convert.js.map +0 -1
  246. package/dist/client/endpoints/image-to-3d.d.ts +0 -5
  247. package/dist/client/endpoints/image-to-3d.d.ts.map +0 -1
  248. package/dist/client/endpoints/image-to-3d.js +0 -7
  249. package/dist/client/endpoints/image-to-3d.js.map +0 -1
  250. package/dist/client/endpoints/image-to-image.d.ts +0 -5
  251. package/dist/client/endpoints/image-to-image.d.ts.map +0 -1
  252. package/dist/client/endpoints/image-to-image.js +0 -7
  253. package/dist/client/endpoints/image-to-image.js.map +0 -1
  254. package/dist/client/endpoints/multi-color-print.d.ts +0 -5
  255. package/dist/client/endpoints/multi-color-print.d.ts.map +0 -1
  256. package/dist/client/endpoints/multi-color-print.js +0 -7
  257. package/dist/client/endpoints/multi-color-print.js.map +0 -1
  258. package/dist/client/endpoints/multi-image-to-3d.d.ts +0 -5
  259. package/dist/client/endpoints/multi-image-to-3d.d.ts.map +0 -1
  260. package/dist/client/endpoints/multi-image-to-3d.js +0 -7
  261. package/dist/client/endpoints/multi-image-to-3d.js.map +0 -1
  262. package/dist/client/endpoints/remesh.d.ts +0 -5
  263. package/dist/client/endpoints/remesh.d.ts.map +0 -1
  264. package/dist/client/endpoints/remesh.js +0 -7
  265. package/dist/client/endpoints/remesh.js.map +0 -1
  266. package/dist/client/endpoints/repair-printability.d.ts +0 -5
  267. package/dist/client/endpoints/repair-printability.d.ts.map +0 -1
  268. package/dist/client/endpoints/repair-printability.js +0 -7
  269. package/dist/client/endpoints/repair-printability.js.map +0 -1
  270. package/dist/client/endpoints/resize.d.ts +0 -5
  271. package/dist/client/endpoints/resize.d.ts.map +0 -1
  272. package/dist/client/endpoints/resize.js +0 -7
  273. package/dist/client/endpoints/resize.js.map +0 -1
  274. package/dist/client/endpoints/retexture.d.ts +0 -5
  275. package/dist/client/endpoints/retexture.d.ts.map +0 -1
  276. package/dist/client/endpoints/retexture.js +0 -7
  277. package/dist/client/endpoints/retexture.js.map +0 -1
  278. package/dist/client/endpoints/rigging.d.ts +0 -6
  279. package/dist/client/endpoints/rigging.d.ts.map +0 -1
  280. package/dist/client/endpoints/rigging.js +0 -8
  281. package/dist/client/endpoints/rigging.js.map +0 -1
  282. package/dist/client/endpoints/text-to-3d.d.ts +0 -6
  283. package/dist/client/endpoints/text-to-3d.d.ts.map +0 -1
  284. package/dist/client/endpoints/text-to-3d.js +0 -8
  285. package/dist/client/endpoints/text-to-3d.js.map +0 -1
  286. package/dist/client/endpoints/text-to-image.d.ts +0 -5
  287. package/dist/client/endpoints/text-to-image.d.ts.map +0 -1
  288. package/dist/client/endpoints/text-to-image.js +0 -7
  289. package/dist/client/endpoints/text-to-image.js.map +0 -1
  290. package/dist/client/endpoints/text-to-motion.d.ts +0 -6
  291. package/dist/client/endpoints/text-to-motion.d.ts.map +0 -1
  292. package/dist/client/endpoints/text-to-motion.js +0 -8
  293. package/dist/client/endpoints/text-to-motion.js.map +0 -1
@@ -0,0 +1,280 @@
1
+ /**
2
+ * doctor — read-only environment diagnosis.
3
+ *
4
+ * The default run is fully local and must complete with no credential, no
5
+ * network and an empty config directory. It reports versions, which credential
6
+ * sources are *present* — never their values: the stored profile is stat'ed
7
+ * and not parsed, the flag and env var become booleans, and an explicit
8
+ * `--api-key-file` is run through the same parser API commands use with only
9
+ * its verdict kept — the effective base URLs, workspace writability and
10
+ * whether the cwd holds a `.env` candidate (named, never read: there is no
11
+ * auto-discovery, D-016). Nothing here refreshes an OAuth token or writes.
12
+ *
13
+ * `--check-api` resolves the credential exactly like an API command (flags →
14
+ * env → key file → stored profile) and makes one GET /balance — the only free
15
+ * authenticated endpoint. `--check-slicers` runs the local slicer detection.
16
+ * Neither is implied by the other (D-024). Everything else stays offline.
17
+ */
18
+ import { accessSync, constants as fsConstants, statSync } from "node:fs";
19
+ import { resolve as resolvePath } from "node:path";
20
+ import { MeshyClient } from "../client/index.js";
21
+ import { DEFAULT_BASE_URL_V1, DEFAULT_BASE_URL_V2, deriveCreativeLabBase, derivePublicWebBase, loadConfig, } from "./config.js";
22
+ import { credentialsPath } from "./credentials.js";
23
+ import { loadEnvFile } from "./env-file.js";
24
+ import { configOverridesFrom } from "./runtime.js";
25
+ import { detectSlicers as detectSlicersImpl } from "./slicers.js";
26
+ import { VERSION } from "./version.js";
27
+ const REQUIRED_NODE_MAJOR = 24;
28
+ const CWD_ENV_CANDIDATES = [".env", ".env.local"];
29
+ /** Mirrors config.ts: an empty or placeholder key means "unset". */
30
+ const PLACEHOLDER_KEYS = new Set(["", "YOUR_MESHY_API_KEY_HERE"]);
31
+ function keyPresent(value) {
32
+ return typeof value === "string" && !PLACEHOLDER_KEYS.has(value.trim());
33
+ }
34
+ function stripTrail(s) {
35
+ return s.replace(/\/+$/, "");
36
+ }
37
+ function messageOf(err) {
38
+ return err instanceof Error ? err.message : String(err);
39
+ }
40
+ function isFile(path) {
41
+ try {
42
+ return statSync(path).isFile();
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ /** Replace every known secret in free text; paths and verdicts are all a report needs. */
49
+ function scrub(text, secrets) {
50
+ let out = text;
51
+ for (const secret of secrets) {
52
+ if (secret.length >= 4)
53
+ out = out.split(secret).join("[redacted]");
54
+ }
55
+ return out;
56
+ }
57
+ function summarizeSlicers(detection) {
58
+ if (detection && typeof detection === "object") {
59
+ const d = detection;
60
+ const found = Array.isArray(d.slicers) ? d.slicers : null;
61
+ if (found) {
62
+ const names = found.map((s) => (s && typeof s === "object" && typeof s.name === "string" ? s.name : "?"));
63
+ const platform = typeof d.platform === "string" ? d.platform : process.platform;
64
+ return found.length === 0
65
+ ? `no registered slicer detected on ${platform}`
66
+ : `${found.length} slicer(s) detected on ${platform}: ${names.join(", ")}`;
67
+ }
68
+ }
69
+ return "slicer detection completed";
70
+ }
71
+ /** Run the diagnosis and also return the raw API failure for exit-code mapping. */
72
+ export async function runDoctorDetailed(opts) {
73
+ const { flags } = opts;
74
+ const env = opts.env ?? process.env;
75
+ const cwd = opts.cwd ?? process.cwd();
76
+ const checks = [];
77
+ const secrets = [];
78
+ if (typeof flags.apiKey === "string")
79
+ secrets.push(flags.apiKey.trim());
80
+ if (typeof env["MESHY_API_KEY"] === "string")
81
+ secrets.push(env["MESHY_API_KEY"].trim());
82
+ // --- CLI and runtime -----------------------------------------------------
83
+ const nodeMajor = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
84
+ const nodeOk = Number.isFinite(nodeMajor) && nodeMajor >= REQUIRED_NODE_MAJOR;
85
+ checks.push({ id: "cli", status: "ok", detail: `meshy-cli ${VERSION} on node ${process.version} (${process.platform} ${process.arch})` });
86
+ checks.push({
87
+ id: "node",
88
+ status: nodeOk ? "ok" : "fail",
89
+ detail: nodeOk
90
+ ? `node ${process.version} satisfies the required >=${REQUIRED_NODE_MAJOR}`
91
+ : `node ${process.version} is below the required >=${REQUIRED_NODE_MAJOR}; install Node ${REQUIRED_NODE_MAJOR} or newer`,
92
+ });
93
+ // --- Base URLs (same precedence as config.ts, resolved without a credential) ---
94
+ const v1 = stripTrail(flags.baseUrlV1 ?? env["MESHY_BASE_URL_V1"] ?? DEFAULT_BASE_URL_V1);
95
+ const v2 = stripTrail(flags.baseUrlV2 ?? env["MESHY_BASE_URL_V2"] ?? DEFAULT_BASE_URL_V2);
96
+ const explicitCreativeLab = flags.baseUrlCreativeLab ?? env["MESHY_BASE_URL_CREATIVE_LAB"];
97
+ const creativeLab = explicitCreativeLab ? stripTrail(explicitCreativeLab) : deriveCreativeLabBase(v1);
98
+ const publicWeb = derivePublicWebBase(v1);
99
+ let v1Parses = true;
100
+ try {
101
+ new URL(v1);
102
+ }
103
+ catch {
104
+ v1Parses = false;
105
+ }
106
+ checks.push({
107
+ id: "base_urls",
108
+ status: v1Parses && creativeLab !== null ? "ok" : "warn",
109
+ detail: !v1Parses
110
+ ? `v1 base ${JSON.stringify(v1)} is not a valid URL (check --base-url-v1 / MESHY_BASE_URL_V1)`
111
+ : creativeLab === null
112
+ ? `v1 ${v1}; v2 ${v2}; Creative Lab base cannot be derived from a non-standard v1 path — pass --base-url-creative-lab when using creative-lab commands`
113
+ : `v1 ${v1}; v2 ${v2}; creative-lab ${creativeLab}; public-web ${publicWeb}`,
114
+ });
115
+ // --- Credential sources: presence only ----------------------------------
116
+ const flagPresent = keyPresent(flags.apiKey);
117
+ const envPresent = keyPresent(env["MESHY_API_KEY"]);
118
+ let apiKeyFilePath = null;
119
+ let apiKeyFileUsable = false;
120
+ if (flags.envFile) {
121
+ apiKeyFilePath = resolvePath(cwd, flags.envFile);
122
+ try {
123
+ const loaded = loadEnvFile(flags.envFile, cwd);
124
+ apiKeyFilePath = loaded.path;
125
+ if (loaded.apiKey)
126
+ secrets.push(loaded.apiKey.trim());
127
+ const ignored = loaded.otherKeys.length > 0 ? `; ${loaded.otherKeys.length} other key(s) ignored: ${loaded.otherKeys.join(", ")}` : "";
128
+ if (keyPresent(loaded.apiKey)) {
129
+ apiKeyFileUsable = true;
130
+ checks.push({ id: "api_key_file", status: "ok", detail: `${loaded.path} defines MESHY_API_KEY (value not shown${ignored})` });
131
+ }
132
+ else {
133
+ checks.push({ id: "api_key_file", status: "fail", detail: `${loaded.path} defines no usable MESHY_API_KEY (missing, empty or placeholder${ignored})` });
134
+ }
135
+ }
136
+ catch (err) {
137
+ checks.push({ id: "api_key_file", status: "fail", detail: messageOf(err) });
138
+ }
139
+ }
140
+ else {
141
+ checks.push({ id: "api_key_file", status: "skipped", detail: "--api-key-file not given" });
142
+ }
143
+ const storedPath = credentialsPath(v1, env);
144
+ const storedExists = isFile(storedPath);
145
+ const anySource = flagPresent || envPresent || apiKeyFileUsable || storedExists;
146
+ checks.push({
147
+ id: "credentials",
148
+ status: anySource ? "ok" : "warn",
149
+ detail: `sources present: --api-key=${flagPresent ? "yes" : "no"}, MESHY_API_KEY=${envPresent ? "yes" : "no"}, ` +
150
+ `--api-key-file=${flags.envFile ? (apiKeyFileUsable ? "usable" : "unusable") : "none"}, ` +
151
+ `stored profile=${storedExists ? "present" : "absent"} (${storedPath}); values are never read by doctor` +
152
+ (anySource ? "" : ". API commands need --api-key, MESHY_API_KEY, --api-key-file <file> or `meshy auth login`"),
153
+ });
154
+ // --- Workspace -----------------------------------------------------------
155
+ let workspace = { path: null, writable: null };
156
+ if (flags.workspace) {
157
+ const abs = resolvePath(cwd, flags.workspace);
158
+ workspace = { path: abs, writable: null };
159
+ let st = null;
160
+ try {
161
+ st = statSync(abs);
162
+ }
163
+ catch {
164
+ st = null;
165
+ }
166
+ if (!st) {
167
+ checks.push({ id: "workspace", status: "warn", detail: `${abs} does not exist yet; local tools will create it on first write` });
168
+ }
169
+ else if (!st.isDirectory()) {
170
+ workspace.writable = false;
171
+ checks.push({ id: "workspace", status: "fail", detail: `${abs} is not a directory` });
172
+ }
173
+ else {
174
+ try {
175
+ accessSync(abs, fsConstants.W_OK);
176
+ workspace.writable = true;
177
+ checks.push({ id: "workspace", status: "ok", detail: `${abs} is a writable directory` });
178
+ }
179
+ catch {
180
+ workspace.writable = false;
181
+ checks.push({ id: "workspace", status: "fail", detail: `${abs} is not writable by this user` });
182
+ }
183
+ }
184
+ }
185
+ else {
186
+ checks.push({ id: "workspace", status: "skipped", detail: "--workspace not given (files land next to their targets)" });
187
+ }
188
+ // --- cwd .env candidates: names only --------------------------------------
189
+ const cwdEnvCandidates = CWD_ENV_CANDIDATES.filter((name) => isFile(resolvePath(cwd, name)));
190
+ checks.push({
191
+ id: "cwd_env_files",
192
+ status: "ok",
193
+ detail: cwdEnvCandidates.length === 0
194
+ ? `no .env or .env.local in ${cwd} (none is ever read automatically)`
195
+ : `${cwdEnvCandidates.join(", ")} found in ${cwd}; not read — pass --api-key-file <file> to use one`,
196
+ });
197
+ const report = {
198
+ cli: { version: VERSION, node: process.version, platform: process.platform, arch: process.arch },
199
+ local_ready: nodeOk && VERSION.length > 0,
200
+ api_ready: null,
201
+ checks,
202
+ credential_sources: {
203
+ flag: flagPresent,
204
+ env: envPresent,
205
+ api_key_file: apiKeyFilePath,
206
+ stored_profile: { path: storedPath, exists: storedExists },
207
+ },
208
+ base_urls: { v1, v2, creative_lab: creativeLab, public_web: publicWeb },
209
+ workspace,
210
+ cwd_env_candidates: cwdEnvCandidates,
211
+ slicers: null,
212
+ api: null,
213
+ };
214
+ // --- --check-api: one free GET /balance ------------------------------------
215
+ let apiFailure = null;
216
+ if (opts.checkApi) {
217
+ let config = null;
218
+ try {
219
+ config = loadConfig(configOverridesFrom(flags));
220
+ secrets.push(config.apiKey);
221
+ }
222
+ catch (err) {
223
+ apiFailure = { stage: "credentials", error: err };
224
+ report.api_ready = false;
225
+ report.api = { error: messageOf(err) };
226
+ checks.push({ id: "api", status: "fail", detail: `no usable credential: ${messageOf(err)}` });
227
+ }
228
+ if (config) {
229
+ const resolved = config;
230
+ const probe = opts.probeBalance ?? (async () => (await new MeshyClient(resolved).balance.get()).balance);
231
+ try {
232
+ const balance = await probe();
233
+ report.api_ready = true;
234
+ report.api = { balance };
235
+ checks.push({
236
+ id: "api",
237
+ status: "ok",
238
+ detail: `GET ${resolved.baseUrlV1}/balance succeeded with the ${resolved.credentialSource} credential; balance ${balance}`,
239
+ });
240
+ }
241
+ catch (err) {
242
+ apiFailure = { stage: "balance", error: err };
243
+ report.api_ready = false;
244
+ report.api = { error: messageOf(err) };
245
+ checks.push({ id: "api", status: "fail", detail: `GET /balance failed: ${messageOf(err)}` });
246
+ }
247
+ }
248
+ }
249
+ else {
250
+ checks.push({ id: "api", status: "skipped", detail: "not requested (pass --check-api for one free GET /balance)" });
251
+ }
252
+ // --- --check-slicers: local detection only ---------------------------------
253
+ if (opts.checkSlicers) {
254
+ try {
255
+ const detect = opts.detectSlicers ?? ((overrides) => detectSlicersImpl(overrides));
256
+ // Detection reads the real platform/filesystem; only the environment block is injectable.
257
+ const detection = detect(opts.env ? { env: opts.env } : undefined);
258
+ report.slicers = detection;
259
+ checks.push({ id: "slicers", status: "ok", detail: summarizeSlicers(detection) });
260
+ }
261
+ catch (err) {
262
+ report.slicers = { error: messageOf(err) };
263
+ checks.push({ id: "slicers", status: "fail", detail: `slicer detection failed: ${messageOf(err)}` });
264
+ }
265
+ }
266
+ else {
267
+ checks.push({ id: "slicers", status: "skipped", detail: "not requested (pass --check-slicers)" });
268
+ }
269
+ // Free text is the only place a secret could slip through; strip every known value.
270
+ for (const check of checks)
271
+ check.detail = scrub(check.detail, secrets);
272
+ if (report.api && "error" in report.api)
273
+ report.api = { error: scrub(report.api.error, secrets) };
274
+ return { report, apiFailure };
275
+ }
276
+ /** Run the diagnosis; never throws for a missing credential or a failed check. */
277
+ export async function runDoctor(opts) {
278
+ return (await runDoctorDetailed(opts)).report;
279
+ }
280
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/internal/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,124 @@
1
1
  /**
2
- * Download a completed task's artifacts to the local filesystem.
2
+ * Asset downloads with explicit boundaries.
3
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, ...).
4
+ * Every byte that lands on disk goes through `fetchToTemp`: http(s) only, no
5
+ * embedded credentials, no Authorization or Cookie ever attached (asset hosts
6
+ * are not the API), redirects re-validated hop by hop (max 5), private
7
+ * network literals refused (loopback is allowed for local test servers), a
8
+ * hard size cap enforced while streaming, sha256 computed on the way. The
9
+ * temp file lives in the target directory and is published exclusively
10
+ * (`link`), or replaced atomically with --overwrite; the final path — after
11
+ * any MIME-driven extension change — is checked against the authorised root.
13
12
  *
14
- * A `meta.json` alongside the artifacts records the full task response plus
15
- * the saved paths for later reference.
13
+ * Two entry points share the core:
14
+ * downloadArtifacts — the 0.2.0 `-o` behaviour (all artifacts, role-based
15
+ * names, meta.json sidecar); output shape unchanged. An
16
+ * explicit `root` (the --workspace) confines every path.
17
+ * downloadAssets — the selective downloader behind `meshy download` and
18
+ * the v1 manifest.
19
+ * Both relink OBJ → MTL → texture references after the set has landed (see
20
+ * material-links.ts), so a saved OBJ loads with the files beside it.
16
21
  */
17
22
  import type { Task } from "../client/types.js";
23
+ import { safeSegment, type AuthorisedRoot } from "./paths.js";
24
+ import { type Asset } from "./artifacts.js";
25
+ import { type MaterialLinkReport } from "./material-links.js";
26
+ export declare const DEFAULT_DOWNLOAD_LIMITS: {
27
+ /** 2 GiB — engineering default, not a Meshy limit. */
28
+ readonly maxBytes: number;
29
+ readonly timeoutMs: 300000;
30
+ readonly maxRedirects: 5;
31
+ };
32
+ export interface DownloadLimits {
33
+ maxBytes: number;
34
+ timeoutMs: number;
35
+ maxRedirects: number;
36
+ }
37
+ export interface DownloadPolicy {
38
+ /** Plain http is accepted only for loopback hosts (local test servers). */
39
+ allowHttpLoopback: boolean;
40
+ /** Private-network literals (10/8, 172.16/12, 192.168/16, link-local) are refused unless set. */
41
+ allowPrivateNetwork: boolean;
42
+ }
43
+ export declare const DEFAULT_DOWNLOAD_POLICY: DownloadPolicy;
44
+ export interface FetchOptions {
45
+ limits?: Partial<DownloadLimits>;
46
+ policy?: Partial<DownloadPolicy>;
47
+ fetchImpl?: typeof fetch;
48
+ signal?: AbortSignal;
49
+ }
50
+ export interface FetchedFile {
51
+ tmpPath: string;
52
+ bytes: number;
53
+ sha256: string;
54
+ contentType: string | null;
55
+ finalUrl: string;
56
+ status: number;
57
+ }
58
+ /** Validate an asset URL against the policy; throws CliError (local_io) with a clear reason. */
59
+ export declare function validateAssetUrl(raw: string, policy: DownloadPolicy, label?: string): URL;
60
+ /**
61
+ * Stream a URL into a temp file next to `target`, following at most
62
+ * `maxRedirects` re-validated redirects, without any credential header.
63
+ */
64
+ export declare function fetchToTemp(rawUrl: string, target: string, opts?: FetchOptions): Promise<FetchedFile>;
65
+ /** URL without its query string — signed parameters never reach logs or messages. */
66
+ export declare function redact(url: URL | string): string;
67
+ export declare function extFromContentType(ct: string | null): string;
68
+ /**
69
+ * Reject bodies that cannot be what the asset claims: an HTML error page
70
+ * served as a model, a non-GLB under .glb, a non-ZIP under .zip.
71
+ */
72
+ export declare function validateContent(tmpPath: string, expectedFormat: string | null, kind: Asset["kind"], contentType: string | null): void;
73
+ export interface DownloadedFile {
74
+ key: string;
75
+ path: string;
76
+ relative_path: string | null;
77
+ bytes: number;
78
+ sha256: string;
79
+ content_type: string | null;
80
+ format: string | null;
81
+ container_format: string | null;
82
+ extracted: boolean | null;
83
+ status: "written" | "failed" | "skipped";
84
+ error: string | null;
85
+ publish_method: string | null;
86
+ /** True when the file's material references were rewritten to the saved names (OBJ/MTL only). */
87
+ relinked: boolean;
88
+ }
89
+ export interface DownloadAssetsOptions extends FetchOptions {
90
+ /** Directory mode. */
91
+ targetDir?: string;
92
+ /** Single-file mode (exactly one asset). */
93
+ targetFile?: string;
94
+ overwrite?: boolean;
95
+ /** Authorised root every final path must stay inside — frozen before the first transfer (a string is frozen here). */
96
+ root: string | AuthorisedRoot;
97
+ /** Validate magic/content-type for models (the legacy wrapper turns this off). */
98
+ validateContent?: boolean;
99
+ /** Bounded URL refresh hook (API source): returns fresh URLs by key or null. */
100
+ refreshUrls?: () => Promise<Map<string, string> | null>;
101
+ onFile?: (file: DownloadedFile) => void;
102
+ }
103
+ export interface DownloadAssetsResult {
104
+ files: DownloadedFile[];
105
+ /** True when every requested asset was written. */
106
+ complete: boolean;
107
+ warnings: Array<{
108
+ code: string;
109
+ message: string;
110
+ }>;
111
+ /** OBJ/MTL/texture reference report when the set contained a text OBJ. */
112
+ materialLinks: MaterialLinkReport | null;
113
+ }
114
+ /**
115
+ * Download the given assets one by one. Each file is published on its own;
116
+ * a failure stops the loop and the result lists what was written so far.
117
+ * No rollback deletes anything the user already had.
118
+ */
119
+ export declare function downloadAssets(assets: readonly Asset[], opts: DownloadAssetsOptions): Promise<DownloadAssetsResult>;
120
+ /** Last path segment of an asset URL (decoded), the name the server knew the file by; null when unparseable. */
121
+ export declare function basenameOfUrl(url: string): string | null;
18
122
  export interface Artifact {
19
123
  /** Stable slot name ("model_glb", "image_0", "texture_0_base_color", ...) */
20
124
  key: string;
@@ -22,13 +126,43 @@ export interface Artifact {
22
126
  url: string;
23
127
  /** Expected extension inferred from the slot name (no dot, may be empty). */
24
128
  preferredExt: string;
129
+ /** File name to save under when the slot name is not `<stem>.<ext>` (Creative Lab parts, bundles). */
130
+ filename?: string;
25
131
  }
26
132
  export declare function enumerateArtifacts(task: Task): Artifact[];
27
133
  /** Heuristic: does this look like a file path (has an extension) or a dir? */
28
134
  export declare function looksLikeFile(path: string): boolean;
135
+ export interface LegacyDownloadedFile {
136
+ /** Legacy artifact slot ("model_glb", "thumbnail", "texture_0_base_color", …). */
137
+ key: string;
138
+ /** Final absolute path (after any content-type driven rename) — or the planned path for a failed entry. */
139
+ path: string;
140
+ bytes: number;
141
+ sha256: string;
142
+ content_type: string | null;
143
+ status: "written" | "failed";
144
+ error: string | null;
145
+ /** True when the file's material references were rewritten to the saved names. */
146
+ relinked: boolean;
147
+ }
29
148
  export interface DownloadResult {
30
149
  savedFiles: string[];
31
150
  metadataPath: string;
151
+ /** OBJ/MTL/texture reference report when the artifacts contained a text OBJ. */
152
+ materialLinks: MaterialLinkReport | null;
153
+ /**
154
+ * Per-file manifest in download order. When the download stops early the
155
+ * same list (written files + the failed one) travels on the thrown
156
+ * CliError's `result.downloads`, so nothing already on disk is forgotten.
157
+ */
158
+ files: LegacyDownloadedFile[];
159
+ }
160
+ export interface DownloadArtifactsOptions {
161
+ /** Authorised root (the --workspace, frozen when the flags were read); every directory and file must resolve inside it. Default: the output directory itself. A string is frozen here. */
162
+ root?: string | AuthorisedRoot;
163
+ /** Cooperative cancellation (SIGINT): aborts the in-flight transfer and stops every later download, relink and publish. */
164
+ signal?: AbortSignal;
32
165
  }
33
- export declare function downloadArtifacts(task: Task, outputPath: string, resource: string): Promise<DownloadResult>;
166
+ export declare function downloadArtifacts(task: Task, outputPath: string, resource: string, opts?: DownloadArtifactsOptions): Promise<DownloadResult>;
167
+ export { safeSegment as _safeSegmentForTests };
34
168
  //# sourceMappingURL=download.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/internal/download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAO/C,MAAM,WAAW,QAAQ;IACvB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,CAgDzD;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CA6DzB"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/internal/download.ts"],"names":[],"mappings":"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"}