@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
package/.env.example ADDED
@@ -0,0 +1,14 @@
1
+ # Required: your Meshy API key (https://www.meshy.ai/api)
2
+ MESHY_API_KEY=YOUR_MESHY_API_KEY_HERE
3
+
4
+ # Optional base URL overrides (defaults shown)
5
+ # MESHY_BASE_URL_V1=https://api.meshy.ai/openapi/v1
6
+ # MESHY_BASE_URL_V2=https://api.meshy.ai/openapi/v2
7
+
8
+ # Optional timeouts / polling
9
+ # MESHY_CONNECT_TIMEOUT_MS=10000
10
+ # MESHY_READ_TIMEOUT_MS=120000
11
+ # MESHY_POLL_INTERVAL_MS=3000
12
+
13
+ # Optional log level: debug | info | warn | error | silent
14
+ # MESHY_LOG_LEVEL=warn
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 <Yujia>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,376 @@
1
+ # meshy-cli
2
+
3
+ A small, well-structured command-line interface for the [Meshy AI API](https://docs.meshy.ai/) — text-to-3D, image-to-3D (standard and smart-topology), remesh, convert, resize, rigging, animation, retexture, 2D image generation, multi-color print output, and the `balance` endpoint. Built for humans and AI agents.
4
+
5
+ Two layers. `meshy make` chains the documented flows so that one command
6
+ produces one model. Underneath, a per-endpoint command for every resource
7
+ shares a uniform `create / get / list / wait / delete` verb surface, with a raw
8
+ `api` passthrough for endpoints the CLI doesn't model yet and a `skills/`
9
+ directory of agent-facing documentation.
10
+
11
+ The flag surface is deliberately curated rather than a 1:1 mirror of the API: deprecated parameters (`symmetry_mode`, `hd_texture`, `is_a_t_pose`) are not exposed, geometry knobs live on `remesh` and sizing on `resize` instead of every generation command, and defaults are pinned to game-ready values (PBR maps on, 4k textures — same credit cost as the bare defaults). Everything the API accepts remains reachable through `--data`.
12
+
13
+ ## Install
14
+
15
+ Requires Node 20+.
16
+
17
+ ```bash
18
+ npm i -g meshy-cli # installs `meshy-cli` and `meshy`
19
+ meshy --help
20
+ ```
21
+
22
+ The same build is also published under the scoped alias
23
+ [`@meshy-ai/cli`](https://www.npmjs.com/package/@meshy-ai/cli)
24
+ (`npm i -g @meshy-ai/cli`) — identical contents, pick whichever name you
25
+ remember; don't install both.
26
+
27
+ ### Development
28
+
29
+ ```bash
30
+ # straight from git (`prepare` builds dist for you)
31
+ npm i -g git+https://github.com/meshy-dev/meshy-cli.git
32
+
33
+ # or clone for local development
34
+ pnpm install
35
+ pnpm build
36
+ node dist/index.js --help
37
+ pnpm link --global # exposes `meshy` / `meshy-cli` on $PATH
38
+ ```
39
+
40
+ ## Auth
41
+
42
+ Log in once and the credential is stored for you:
43
+
44
+ ```bash
45
+ meshy auth login # opens the browser (OAuth, loopback + PKCE)
46
+ meshy auth login --with-key msy_your_key_here # paste an existing API key instead
47
+ meshy auth status # what's in effect, and does it work
48
+ ```
49
+
50
+ The default `auth login` opens `https://www.meshy.ai/oauth/authorize` in your
51
+ browser, starts a loopback server on port 8765 (override with `--port`), and
52
+ waits for the callback. The authorize URL is always printed to **stderr** so you
53
+ can copy-paste it if the browser doesn't open automatically.
54
+
55
+ In headless or agent contexts where a browser is not available, use
56
+ `--with-key` or set `MESHY_API_KEY` instead. Set `MESHY_CLI_NO_BROWSER=1` to
57
+ suppress the browser-open attempt (the URL is still printed to stderr).
58
+
59
+ Or keep it in the environment — unchanged, and still the right choice for CI:
60
+
61
+ ```bash
62
+ export MESHY_API_KEY=msy_your_key_here
63
+ meshy-cli --api-key msy_... balance # or per-call
64
+ ```
65
+
66
+ Get a key at <https://www.meshy.ai/settings/api>.
67
+
68
+ **Resolution order:** `--api-key` › `MESHY_API_KEY` › the active stored profile.
69
+ The environment variable stays ahead of the stored credential on purpose, so a
70
+ CI runner is never overridden by whatever a developer once logged into on that
71
+ machine. With none of the three, commands exit `3` and print the command that
72
+ fixes it.
73
+
74
+ **Where it lives:** `~/.config/meshy/credentials.json`, mode `0600`, on every
75
+ platform (`MESHY_CONFIG_DIR` or `MESHY_CREDENTIALS_PATH` move it). Writes go
76
+ through a cross-process lock and a temp-file rename, because several agents
77
+ driving this CLI at once is the normal case. A non-production `--base-url-v1`
78
+ reads and writes `credentials.dev.json` instead, so staging cannot clobber a
79
+ production login.
80
+
81
+ **OAuth token refresh:** when the stored OAuth access token is within 60 seconds
82
+ of expiry (or already expired), the CLI silently refreshes it using the stored
83
+ refresh token before running the command. A refresh failure with an unexpired
84
+ token is swallowed (the existing token is used); a failure with an expired token
85
+ exits `3` with a hint to run `meshy auth login`.
86
+
87
+ **Profiles:** `auth login --profile work`, `auth list`, `auth use work`,
88
+ `auth logout [--all]`.
89
+
90
+ ## One model, one command
91
+
92
+ `make` chains the documented flows so a caller who wants a model does not have
93
+ to pick an endpoint and carry task ids between steps:
94
+
95
+ ```bash
96
+ meshy make "a red sports car" -o car.glb # text-to-3d preview → refine
97
+ meshy make ./cat.png -o out/cat/ # image-to-3d, textured
98
+ ```
99
+
100
+ The input decides the chain: a prompt runs the two-stage text flow, an image
101
+ runs the single textured `image-to-3d` task. There is no third judgement — no
102
+ route picked by inspecting the input, no image step inserted ahead of a prompt,
103
+ no pause between stages. Those are opinions, and a CLI that acts on its own
104
+ opinions spends someone else's credits. Compose anything else from the resource
105
+ commands below.
106
+
107
+ ```bash
108
+ meshy make "a red sports car" --dry-run # the steps and the estimate, no spend
109
+ meshy make "a red sports car" --max-credits 25 # refuse to start when over budget
110
+ ```
111
+
112
+ Both guards run before the first task is created. If a later step fails, the
113
+ error's `hint` is the command that resumes from the finished step — running it
114
+ beats starting over, which would pay for that step twice.
115
+
116
+ ## At a glance
117
+
118
+ ```bash
119
+ # account
120
+ meshy-cli balance
121
+
122
+ # text → 3D (sync by default: blocks until the task finishes)
123
+ meshy-cli text-to-3d create --mode preview --prompt "a red sports car"
124
+ meshy-cli text-to-3d create --mode refine --preview-task-id <id>
125
+
126
+ # image → 3D
127
+ meshy-cli image-to-3d create --image-url https://example.com/cat.png
128
+
129
+ # smart topology: component-aware low-poly with a native polycount
130
+ meshy-cli image-to-3d create --image-url cat.png --model-type smart-topology --target-polycount 10000
131
+
132
+ # fire-and-forget (--async): returns the task_id immediately, query later
133
+ TASK=$(meshy-cli text-to-image create --prompt "mountain landscape" --async | jq -r .task_id)
134
+ meshy-cli text-to-image get "$TASK"
135
+ meshy-cli text-to-image wait "$TASK" -o /tmp/result.json
136
+
137
+ # raw passthrough for any endpoint
138
+ meshy-cli api GET /balance
139
+ meshy-cli api POST /text-to-3d --data '{"mode":"preview","prompt":"a cactus"}'
140
+ ```
141
+
142
+ ## Resources
143
+
144
+ One command per endpoint. They are all registered and all supported, but they
145
+ are indexed by `meshy resources` rather than listed in `meshy --help` — that
146
+ help text is read on every invocation (an agent pays for the whole surface each
147
+ time), so it should not grow with the API. `meshy <resource> --help` documents
148
+ each one in full.
149
+
150
+ | Command | Meshy endpoint | Docs |
151
+ |---|---|---|
152
+ | `balance` | `GET /balance` | [docs](https://docs.meshy.ai/en/api/balance) |
153
+ | `text-to-3d` | `/text-to-3d` (v2) | [docs](https://docs.meshy.ai/en/api/text-to-3d) |
154
+ | `image-to-3d` | `/image-to-3d` | [docs](https://docs.meshy.ai/en/api/image-to-3d) |
155
+ | `multi-image-to-3d` | `/multi-image-to-3d` | [docs](https://docs.meshy.ai/en/api/multi-image-to-3d) |
156
+ | `remesh` | `/remesh` | [docs](https://docs.meshy.ai/en/api/remesh) |
157
+ | `convert` | `/convert` | [docs](https://docs.meshy.ai/en/api/convert) |
158
+ | `resize` | `/resize` | [docs](https://docs.meshy.ai/en/api/resize) |
159
+ | `rigging` | `/rigging` | [docs](https://docs.meshy.ai/en/api/rigging) |
160
+ | `animate` | `/animations` | [docs](https://docs.meshy.ai/en/api/animations) |
161
+ | `retexture` | `/retexture` | [docs](https://docs.meshy.ai/en/api/retexture) |
162
+ | `text-to-image` | `/text-to-image` | [docs](https://docs.meshy.ai/en/api/text-to-image) |
163
+ | `image-to-image` | `/image-to-image` | [docs](https://docs.meshy.ai/en/api/image-to-image) |
164
+ | `multi-color-print` | `/print/multi-color` | [docs](https://docs.meshy.ai/en/api/multi-color-print) |
165
+ | `analyze-printability` | `/print/analyze` | [docs](https://docs.meshy.ai/en/api/analyze-printability) |
166
+ | `repair-printability` | `/print/repair` | [docs](https://docs.meshy.ai/en/api/repair-printability) |
167
+
168
+ Per-resource actions (all single-HTTP-call):
169
+
170
+ ```
171
+ meshy-cli <resource> create [flags] [--data <json>] [--async] [--timeout <s>]
172
+ meshy-cli <resource> get <task-id>
173
+ meshy-cli <resource> list [--page <n>] [--page-size <n>] [--sort-by <field>]
174
+ meshy-cli <resource> wait <task-id> [--timeout <s>]
175
+ meshy-cli <resource> delete <task-id>
176
+ ```
177
+
178
+ Top-level shortcut:
179
+
180
+ ```
181
+ meshy-cli delete <task-id>
182
+ # Meshy's DELETE is unified across resources, but GET is not, so
183
+ # `get`/`wait` live only on their resource.
184
+ ```
185
+
186
+ `create` is **synchronous by default** — it polls until the task reaches a
187
+ terminal status (`SUCCEEDED` / `FAILED` / `CANCELED`) or `--timeout` hits.
188
+ Pass `--async` to return the `task_id` immediately; then call
189
+ `<resource> get <id>` or `<resource> wait <id>` when you need the result.
190
+
191
+ ## Saving artifacts with `-o`
192
+
193
+ When `-o` is set on a `create`/`wait`/`get`, the CLI downloads every artifact
194
+ the task produced, writes a sidecar metadata file, and prints a status report
195
+ instead of JSON. Single-file outputs get a per-file `<stem>_meta.json`
196
+ (e.g. `front.jpeg` → `front_meta.json`) so two outputs can share one
197
+ directory; directory-mode outputs share a single `meta.json`.
198
+
199
+ ```bash
200
+ # Single-artifact task — pass a file path. Extension is autocorrected
201
+ # against the response Content-Type; sharp transcodes between
202
+ # jpg/png/webp/gif/tiff/avif so the file truly has the requested format.
203
+ meshy-cli text-to-image create --ai-model nano-banana --prompt "a leaf" \
204
+ -o assets/leaf.jpeg
205
+
206
+ # Multi-artifact task (3D, multi-view 2D, animation) — pass a directory.
207
+ # Files land with role-based names: model.glb, thumbnail.png,
208
+ # texture_0_base_color.png, animation_glb.glb, …
209
+ meshy-cli image-to-3d wait <id> -o out/robot/
210
+ ```
211
+
212
+ Existing files at the target abort with a clear `UsageError` — no silent
213
+ overwrite. Without `-o`, the CLI keeps its pre-download JSON behavior
214
+ (machine-readable summary on stdout).
215
+
216
+ ## Image and 3D-model inputs
217
+
218
+ Flags that take a media source (`--image-url`, `--image-urls`,
219
+ `--reference-image-urls`, `--texture-image-url`, `--image-style-url`,
220
+ `--model-url`) accept:
221
+
222
+ - **http(s) URLs** — preflighted with HEAD so unreachable sources fail fast.
223
+ - **Local file paths** — absolute or relative to cwd. MIME-sniffed via magic
224
+ bytes (with extension fallback) and inlined as `data:` URIs on the wire.
225
+
226
+ You do not need to host files. `data:` URIs on the command line are rejected
227
+ explicitly — pass a local path instead. Missing files and 4xx/5xx responses
228
+ exit with code `2` and a flag-prefixed message before any task is created.
229
+
230
+ ## Global flags
231
+
232
+ | Flag | Purpose |
233
+ |------|---------|
234
+ | `--api-key <key>` | Override `MESHY_API_KEY` |
235
+ | `--base-url-v1 <url>` / `--base-url-v2 <url>` | Override endpoints (staging/proxy) |
236
+ | `--format json\|pretty\|ndjson` | Stdout format when `-o` is not set (default `json`) |
237
+ | `-o, --output <path>` | Download artifacts to a file/directory; write `meta.json`; switch stdout to a status report |
238
+ | `-v, --verbose` | Debug logging to stderr |
239
+ | `--log-level <level>` | `debug \| info \| warn \| error \| silent` |
240
+
241
+ ## Exit codes
242
+
243
+ | Code | Meaning |
244
+ |------|---------|
245
+ | 0 | success |
246
+ | 1 | generic / server |
247
+ | 2 | usage (flag parse error) |
248
+ | 3 | auth (`401`) |
249
+ | 4 | validation (`400`, `422`) |
250
+ | 5 | not found (`404`) |
251
+ | 6 | rate limit (`429`) |
252
+ | 7 | network |
253
+ | 8 | timed out waiting for a task |
254
+ | 9 | credit exhausted (`402`) |
255
+
256
+ ## Environment variables
257
+
258
+ | Variable | Default |
259
+ |---|---|
260
+ | `MESHY_API_KEY` | — (required unless a profile is stored) |
261
+ | `MESHY_BASE_URL_V1` | `https://api.meshy.ai/openapi/v1` |
262
+ | `MESHY_BASE_URL_V2` | `https://api.meshy.ai/openapi/v2` |
263
+ | `MESHY_OAUTH_AUTHORIZE_URL` | `https://www.meshy.ai/oauth/authorize` — override for staging/testing |
264
+ | `MESHY_CLI_NO_BROWSER` | unset — set to `1` to suppress browser open (URL still printed to stderr) |
265
+ | `MESHY_CONNECT_TIMEOUT_MS` | `10000` |
266
+ | `MESHY_READ_TIMEOUT_MS` | `120000` |
267
+ | `MESHY_POLL_INTERVAL_MS` | `3000` |
268
+ | `MESHY_LOG_LEVEL` | `warn` |
269
+ | `MESHY_CLI_NO_UPDATE_NOTIFIER` | unset — any non-empty value disables update checks; CI envs (`CI`, `GITHUB_ACTIONS`, `BUILD_NUMBER`, `RUN_ID`) auto-skip |
270
+
271
+ ## Update notifications
272
+
273
+ meshy-cli checks the npm registry for a newer version at most once per 24 hours. The result is cached at `~/.config/meshy/update-state.json`. The refresh runs in a detached background process so it can never slow down or fail a command.
274
+
275
+ When a newer version is available:
276
+
277
+ - **JSON object outputs** (`--format json` when the result is an object) carry a top-level `_notice.update = { current, latest, message, command }` so agents can relay it to the user.
278
+ - **ndjson arrays** carry `_notice.update` on the **first line only** (the first element, if it is a plain object).
279
+ - **Plain JSON arrays** (`--format json` with an array result) are intentionally left untouched — there is no clean metadata slot in a JSON array without breaking the schema.
280
+ - **Humans on an interactive terminal** get a single line on stderr after the command output.
281
+ - **stdout is never polluted** — the notice never appears on stdout.
282
+ - **Skipped automatically** in CI environments and for development builds.
283
+
284
+ ## Agent skills
285
+
286
+ The `skills/` directory contains markdown-based skills for AI coding agents
287
+ (Claude Code, etc.):
288
+
289
+ - [`skills/meshy-cli`](skills/meshy-cli/SKILL.md) — a single skill covering
290
+ setup, `make`, the shared verb contract, the API constraints that produce
291
+ failed tasks when ignored, and the exit-code table.
292
+
293
+ It is deliberately short. A skill is loaded into an agent's context on every
294
+ invocation, so length is a running cost; anything an agent can look up on
295
+ demand (`meshy resources`, `meshy <resource> --help`,
296
+ <https://docs.meshy.ai/en/api/>) is linked rather than copied.
297
+
298
+ ## Project layout
299
+
300
+ ```
301
+ meshy-cli/
302
+ ├── src/
303
+ │ ├── index.ts # CLI entry
304
+ │ ├── root.ts # root command + global flag wiring
305
+ │ ├── cmd/ # make + resources + api/balance/delete + one file per endpoint
306
+ │ ├── client/ # Meshy HTTP client (v1 + v2 fetchers, typed endpoints)
307
+ │ └── internal/
308
+ │ ├── config.ts # env + flag → runtime config
309
+ │ ├── runtime.ts # lazy client/config construction
310
+ │ ├── make-plan.ts # make's route choice + step list (pure, offline)
311
+ │ ├── pricing.ts # credit estimates for the chains make runs
312
+ │ ├── task-command.ts # create/get/list/wait/delete factory
313
+ │ ├── poll.ts # backoff polling until terminal
314
+ │ ├── file-input.ts # image + 3D-model flag resolution (URL or local)
315
+ │ ├── download.ts # -o artifact download, meta.json, extension fix
316
+ │ ├── report.ts # Status: SUCCESS / FAIL stdout formatter
317
+ │ ├── output.ts # json / pretty / ndjson writers
318
+ │ ├── payload.ts # --data parsing, mergePayload, dropNullish
319
+ │ ├── flags.ts # parseBool / parseInt10 / parseCsv helpers
320
+ │ ├── errors.ts # UsageError + exit-code mapping
321
+ │ ├── global-options.ts # mirror --format etc. onto subcommands
322
+ │ └── logger.ts # leveled stderr logger
323
+ ├── tests/ # node:test unit + integration tests
324
+ ├── skills/ # agent-facing markdown skill (published with the package)
325
+ ├── internal-assets/ # not published, not mirrored — see its README
326
+ ├── package.json
327
+ ├── tsconfig.json
328
+ └── README.md
329
+ ```
330
+
331
+ ## Design notes
332
+
333
+ - **Two layers, one of them opinion-free.** `make` chains endpoints; the
334
+ resource commands expose them one at a time. `make` picks its chain from the
335
+ input type alone and stops there. Every richer decision — going through an
336
+ image first, confirming a shape before texturing, a polycount that rigs well
337
+ — is a judgement about someone else's asset and someone else's credits, so it
338
+ stays with the caller rather than being baked into a default.
339
+ - **Plan first, then spend.** `make` computes the whole chain before creating
340
+ anything, so `--dry-run` and a real run share one code path and one estimate.
341
+ `--max-credits` refuses on that estimate; a budget enforced after step one has
342
+ billed is not a budget.
343
+ - **Two fetchers.** `text-to-3d` lives under `/openapi/v2`, everything else on
344
+ `/openapi/v1`. The client holds both and routes per endpoint.
345
+ - **Uniform verbs.** A single `buildResourceCommand` factory generates
346
+ `get`/`list`/`wait`/`delete` for every resource. Resource modules only
347
+ contribute their unique `create` flag shape.
348
+ - **`--data` escape hatch.** Every `create` accepts a raw JSON object (or
349
+ `@file.json`) that merges with structured flags. Use this when Meshy ships a
350
+ new field before the CLI models it.
351
+ - **Stdout is reserved for command output.** Logs and errors go to stderr so
352
+ pipes (`| jq`, `-o file`) stay clean.
353
+
354
+ ## Releasing
355
+
356
+ Versions are tag-driven and fully automated — there is no manual publish
357
+ step. `package.json` is the single source of truth for the version (the CLI
358
+ reads it at startup, and a test asserts `VERSION === package.json#version`).
359
+
360
+ ```bash
361
+ # 1. bump the version (also updates the lockfile-free metadata)
362
+ npm version patch # or minor / major
363
+ # 2. push the commit and the tag
364
+ git push && git push --tags
365
+ ```
366
+
367
+ Pushing the `vX.Y.Z` tag runs
368
+ [`.github/workflows/release.yml`](.github/workflows/release.yml):
369
+ typecheck → test → build → verify tag == `package.json#version` →
370
+ `npm publish --access public` for both `meshy-cli` and the scoped alias
371
+ `@meshy-ai/cli`. One-time prerequisites: the repo must be public and an
372
+ `NPM_TOKEN` secret with publish rights must be configured.
373
+
374
+ ## License
375
+
376
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,5 @@
1
+ import { TaskEndpoint, type HttpFetch } from "./base.js";
2
+ export declare class AnalyzePrintabilityEndpoint extends TaskEndpoint {
3
+ constructor(http: HttpFetch);
4
+ }
5
+ //# sourceMappingURL=analyze-printability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-printability.d.ts","sourceRoot":"","sources":["../../../src/client/endpoints/analyze-printability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEzD,qBAAa,2BAA4B,SAAQ,YAAY;gBAC/C,IAAI,EAAE,SAAS;CAG5B"}
@@ -0,0 +1,7 @@
1
+ import { TaskEndpoint } from "./base.js";
2
+ export class AnalyzePrintabilityEndpoint extends TaskEndpoint {
3
+ constructor(http) {
4
+ super(http, "/print/analyze");
5
+ }
6
+ }
7
+ //# sourceMappingURL=analyze-printability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-printability.js","sourceRoot":"","sources":["../../../src/client/endpoints/analyze-printability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,WAAW,CAAC;AAEzD,MAAM,OAAO,2BAA4B,SAAQ,YAAY;IAC3D,YAAY,IAAe;QACzB,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { TaskEndpoint, type HttpFetch } from "./base.js";
2
+ /** POST /openapi/v1/animations — plural path. */
3
+ export declare class AnimateEndpoint extends TaskEndpoint {
4
+ constructor(http: HttpFetch);
5
+ }
6
+ //# sourceMappingURL=animate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animate.d.ts","sourceRoot":"","sources":["../../../src/client/endpoints/animate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEzD,iDAAiD;AACjD,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,IAAI,EAAE,SAAS;CAG5B"}
@@ -0,0 +1,8 @@
1
+ import { TaskEndpoint } from "./base.js";
2
+ /** POST /openapi/v1/animations — plural path. */
3
+ export class AnimateEndpoint extends TaskEndpoint {
4
+ constructor(http) {
5
+ super(http, "/animations");
6
+ }
7
+ }
8
+ //# sourceMappingURL=animate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animate.js","sourceRoot":"","sources":["../../../src/client/endpoints/animate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,WAAW,CAAC;AAEzD,iDAAiD;AACjD,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C,YAAY,IAAe;QACzB,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /** GET /openapi/v1/balance */
2
+ import { type Balance } from "../types.js";
3
+ import type { HttpFetch } from "./base.js";
4
+ export declare class BalanceEndpoint {
5
+ private readonly http;
6
+ constructor(http: HttpFetch);
7
+ get(): Promise<Balance>;
8
+ }
9
+ //# sourceMappingURL=balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../../src/client/endpoints/balance.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAG9B,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;gBAErB,IAAI,EAAE,SAAS;IAIrB,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAgB9B"}
@@ -0,0 +1,27 @@
1
+ /** GET /openapi/v1/balance */
2
+ import { mapHttpError, MeshyApiError } from "../errors.js";
3
+ import { BalanceSchema } from "../types.js";
4
+ export class BalanceEndpoint {
5
+ http;
6
+ constructor(http) {
7
+ this.http = http;
8
+ }
9
+ async get() {
10
+ const resp = await this.http("/balance", { method: "GET" });
11
+ if (!resp.ok)
12
+ throw await mapHttpError(resp, "/balance");
13
+ const raw = await resp.json();
14
+ const parsed = BalanceSchema.safeParse(raw);
15
+ if (!parsed.success) {
16
+ throw new MeshyApiError({
17
+ message: `unexpected balance shape: ${parsed.error.message}`,
18
+ status: resp.status,
19
+ code: "server",
20
+ path: "/balance",
21
+ body: raw,
22
+ });
23
+ }
24
+ return parsed.data;
25
+ }
26
+ }
27
+ //# sourceMappingURL=balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/client/endpoints/balance.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAG1D,MAAM,OAAO,eAAe;IACT,IAAI,CAAY;IAEjC,YAAY,IAAe;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,MAAM,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACzD,MAAM,GAAG,GAAY,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,aAAa,CAAC;gBACtB,OAAO,EAAE,6BAA6B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC5D,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,GAAG;aACV,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Base class for async-task Meshy endpoints:
3
+ * POST /<resource> → { result: <task_id> }
4
+ * GET /<resource>/:id → Task
5
+ * GET /<resource> → Task[]
6
+ * DELETE /<resource>/:id → 200
7
+ */
8
+ import { type Task } from "../types.js";
9
+ export type HttpFetch = (path: string, init?: RequestInit) => Promise<Response>;
10
+ export interface ListParams {
11
+ page_num?: number;
12
+ page_size?: number;
13
+ sort_by?: string;
14
+ }
15
+ export declare class TaskEndpoint {
16
+ readonly resourcePath: string;
17
+ protected readonly http: HttpFetch;
18
+ constructor(http: HttpFetch, resourcePath: string);
19
+ create(payload: Record<string, unknown>): Promise<string>;
20
+ retrieve(taskId: string): Promise<Task>;
21
+ list(params?: ListParams): Promise<Task[]>;
22
+ delete(taskId: string): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/client/endpoints/base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAGL,KAAK,IAAI,EACV,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEhF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;gBAEvB,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;IAQ3C,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBzD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvC,IAAI,CAAC,MAAM,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAgB9C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAM5C"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Base class for async-task Meshy endpoints:
3
+ * POST /<resource> → { result: <task_id> }
4
+ * GET /<resource>/:id → Task
5
+ * GET /<resource> → Task[]
6
+ * DELETE /<resource>/:id → 200
7
+ */
8
+ import { mapHttpError, MeshyApiError } from "../errors.js";
9
+ import { TaskCreateResponseSchema, TaskSchema, } from "../types.js";
10
+ export class TaskEndpoint {
11
+ resourcePath;
12
+ http;
13
+ constructor(http, resourcePath) {
14
+ if (!resourcePath.startsWith("/")) {
15
+ throw new Error(`resourcePath must start with "/" (got ${resourcePath})`);
16
+ }
17
+ this.http = http;
18
+ this.resourcePath = resourcePath;
19
+ }
20
+ async create(payload) {
21
+ const resp = await this.http(this.resourcePath, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(payload ?? {}),
25
+ });
26
+ if (!resp.ok)
27
+ throw await mapHttpError(resp, this.resourcePath);
28
+ const raw = await resp.json();
29
+ const parsed = TaskCreateResponseSchema.safeParse(raw);
30
+ if (!parsed.success) {
31
+ throw new MeshyApiError({
32
+ message: `unexpected response from POST ${this.resourcePath}: ${parsed.error.message}`,
33
+ status: resp.status,
34
+ code: "server",
35
+ path: this.resourcePath,
36
+ body: raw,
37
+ });
38
+ }
39
+ return parsed.data.result;
40
+ }
41
+ async retrieve(taskId) {
42
+ if (!taskId)
43
+ throw new Error("task_id is required");
44
+ const path = `${this.resourcePath}/${encodeURIComponent(taskId)}`;
45
+ const resp = await this.http(path, { method: "GET" });
46
+ if (!resp.ok)
47
+ throw await mapHttpError(resp, path);
48
+ const raw = await resp.json();
49
+ const parsed = TaskSchema.safeParse(raw);
50
+ if (!parsed.success) {
51
+ throw new MeshyApiError({
52
+ message: `unexpected task shape from GET ${path}: ${parsed.error.message}`,
53
+ status: resp.status,
54
+ code: "server",
55
+ path,
56
+ body: raw,
57
+ });
58
+ }
59
+ return parsed.data;
60
+ }
61
+ async list(params = {}) {
62
+ const search = new URLSearchParams();
63
+ search.set("page_num", String(params.page_num ?? 1));
64
+ search.set("page_size", String(params.page_size ?? 10));
65
+ search.set("sort_by", params.sort_by ?? "-created_at");
66
+ const path = `${this.resourcePath}?${search.toString()}`;
67
+ const resp = await this.http(path, { method: "GET" });
68
+ if (!resp.ok)
69
+ throw await mapHttpError(resp, this.resourcePath);
70
+ const raw = await resp.json();
71
+ if (!Array.isArray(raw))
72
+ return [];
73
+ return raw.map((t) => {
74
+ const parsed = TaskSchema.safeParse(t);
75
+ return parsed.success ? parsed.data : t;
76
+ });
77
+ }
78
+ async delete(taskId) {
79
+ if (!taskId)
80
+ throw new Error("task_id is required");
81
+ const path = `${this.resourcePath}/${encodeURIComponent(taskId)}`;
82
+ const resp = await this.http(path, { method: "DELETE" });
83
+ if (!resp.ok)
84
+ throw await mapHttpError(resp, path);
85
+ }
86
+ }
87
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/client/endpoints/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { TaskEndpoint, type HttpFetch } from "./base.js";
2
+ export declare class ConvertEndpoint extends TaskEndpoint {
3
+ constructor(http: HttpFetch);
4
+ }
5
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/client/endpoints/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEzD,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,IAAI,EAAE,SAAS;CAG5B"}
@@ -0,0 +1,7 @@
1
+ import { TaskEndpoint } from "./base.js";
2
+ export class ConvertEndpoint extends TaskEndpoint {
3
+ constructor(http) {
4
+ super(http, "/convert");
5
+ }
6
+ }
7
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/client/endpoints/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,WAAW,CAAC;AAEzD,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C,YAAY,IAAe;QACzB,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1B,CAAC;CACF"}