@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,583 @@
1
+ /**
2
+ * auth — inspect and manage stored credentials.
3
+ *
4
+ * These subcommands cannot go through buildRuntime(): it calls loadConfig(),
5
+ * which throws when there is no credential yet, and "there is no credential
6
+ * yet" is exactly the state `auth login` and `auth status` exist to handle.
7
+ * They resolve config themselves instead.
8
+ *
9
+ * Login modes:
10
+ * - loopback (default on GUI): browser-based OAuth + PKCE callback server
11
+ * - manual (--manual): PKCE + OOB redirect_uri, user pastes code
12
+ * - device (--device or headless auto): RFC 8628 device authorization grant
13
+ * - no-wait (--no-wait): device flow stage 1 only, emits flow_id and exits
14
+ * - resume (--device-flow <id> / --device-code <code>): poll a saved flow
15
+ * - --with-key: store an existing API key
16
+ */
17
+ import * as readline from "node:readline";
18
+ import { Command } from "commander";
19
+ import { MeshyClient, MeshyApiError } from "../client/index.js";
20
+ import { loadConfig } from "../internal/config.js";
21
+ import { credentialsPath, deleteCredentialsFile, maskSecret, readCredentials, removeProfile, saveProfile, setActiveProfile, DEFAULT_PROFILE, } from "../internal/credentials.js";
22
+ import { deviceAuthorization, DeviceFlowNotSupportedError, ensureRequestedScopesGranted, pollDeviceToken, } from "../internal/device.js";
23
+ import { deleteDeviceFlow, deviceFlowsPath, generateFlowId, loadDeviceFlowByDeviceCode, loadDeviceFlowByFlowId, saveDeviceFlow, } from "../internal/device-state.js";
24
+ import { CREDENTIAL_REJECTED_HINT, EXIT_CODES, HintedError, SESSION_REVOKED_HINT, UsageError } from "../internal/errors.js";
25
+ import { detectHeadless, resolveLoginMode } from "../internal/headless.js";
26
+ import { buildAuthorizeUrl, codeChallengeS256, exchangeCode, generateCodeVerifier, generateState, openBrowser, startCallbackServer, } from "../internal/oauth.js";
27
+ import { emit } from "../internal/output.js";
28
+ import { readGlobalFlags, refreshOAuthCredentialIfNeeded } from "../internal/runtime.js";
29
+ /** OOB redirect URI for manual flow (RFC 8252 §4.5 / RFC 6749 §4.1.2). */
30
+ const OOB_REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";
31
+ /** Prompt timeout for manual code entry (5 minutes, matching server code TTL). */
32
+ const MANUAL_PROMPT_TIMEOUT_MS = 5 * 60 * 1000;
33
+ /** Base URLs matter here only because they select the credentials file. */
34
+ function resolveFile(flags) {
35
+ const baseUrlV1 = flags.baseUrlV1 ?? process.env["MESHY_BASE_URL_V1"] ?? "https://api.meshy.ai/openapi/v1";
36
+ return credentialsPath(baseUrlV1.replace(/\/+$/, ""));
37
+ }
38
+ function resolveBaseUrlV1(flags) {
39
+ return (flags.baseUrlV1 ??
40
+ process.env["MESHY_BASE_URL_V1"] ??
41
+ "https://api.meshy.ai/openapi/v1").replace(/\/+$/, "");
42
+ }
43
+ function clientForKey(flags, apiKey) {
44
+ const config = loadConfig({
45
+ apiKey,
46
+ baseUrlV1: flags.baseUrlV1,
47
+ baseUrlV2: flags.baseUrlV2,
48
+ logLevel: flags.verbose ? "debug" : flags.logLevel,
49
+ });
50
+ return new MeshyClient(config);
51
+ }
52
+ /**
53
+ * Validate --port: must be an integer in [1, 65535].
54
+ * parseInt silently accepts "123abc"/"1.5"/"0x10" — use Number() + isInteger.
55
+ */
56
+ function parsePort(raw) {
57
+ const n = Number(raw);
58
+ if (!Number.isInteger(n) || n < 1 || n > 65535) {
59
+ throw new UsageError(`--port must be an integer between 1 and 65535 (got ${JSON.stringify(raw)})`);
60
+ }
61
+ return n;
62
+ }
63
+ /**
64
+ * Shared tail: save profile, optionally verify balance, emit logged_in.
65
+ */
66
+ async function finishLogin(flags, opts, tok) {
67
+ const file = resolveFile(flags);
68
+ const profileData = {
69
+ kind: "oauth",
70
+ access_token: tok.access_token,
71
+ refresh_token: tok.refresh_token,
72
+ expires_at: Date.now() + tok.expires_in * 1000,
73
+ ...(tok.user_id ? { user_id: tok.user_id } : {}),
74
+ };
75
+ const credState = saveProfile(file, opts.profile, profileData);
76
+ let balance;
77
+ let verifyOutcome = !opts.verify;
78
+ let verifyHint;
79
+ if (opts.verify) {
80
+ try {
81
+ balance = await clientForKey(flags, tok.access_token).balance.get();
82
+ verifyOutcome = true;
83
+ }
84
+ catch {
85
+ verifyOutcome = false;
86
+ verifyHint =
87
+ "Credential stored but balance check failed — re-check with: meshy auth status";
88
+ }
89
+ }
90
+ emit({
91
+ status: "logged_in",
92
+ kind: "oauth",
93
+ profile: opts.profile,
94
+ active_profile: credState.active_profile,
95
+ credential: maskSecret(tok.access_token),
96
+ credentials_file: file,
97
+ verified: verifyOutcome,
98
+ ...(balance === undefined ? {} : { balance }),
99
+ ...(verifyHint !== undefined ? { hint: verifyHint } : {}),
100
+ }, { format: flags.format, file: flags.output });
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // auth login
104
+ // ---------------------------------------------------------------------------
105
+ const loginCommand = new Command("login")
106
+ .description("Log in to Meshy (default: browser-based OAuth; use --with-key to paste an API key)")
107
+ .option("--with-key <key>", "store an existing API key (msy_...)")
108
+ .option("--port <n>", "loopback port for the OAuth callback (default 8765)", "8765")
109
+ .option("--profile <name>", "profile to write", DEFAULT_PROFILE)
110
+ .option("--no-verify", "skip the balance call that proves the credential works")
111
+ .option("--manual", "manual PKCE flow: print URL, prompt for code (no loopback server)")
112
+ .option("--device", "device authorization flow (RFC 8628)")
113
+ .option("--no-wait", "start device flow, emit flow_id, exit without polling")
114
+ .option("--device-flow <id>", "resume a device flow by flow_id")
115
+ .option("--device-code <code>", "resume a device flow by device_code")
116
+ .action(async (opts, thisCmd) => {
117
+ const flags = readGlobalFlags(thisCmd);
118
+ // --with-key path: validate and store an existing API key.
119
+ if (opts.withKey !== undefined && opts.withKey.trim() === "") {
120
+ throw new UsageError("--with-key requires a non-empty API key (msy_...) — pass a key or omit the flag to use the browser flow");
121
+ }
122
+ const key = opts.withKey?.trim();
123
+ if (key) {
124
+ let balance;
125
+ if (opts.verify) {
126
+ balance = await clientForKey(flags, key).balance.get();
127
+ }
128
+ const file = resolveFile(flags);
129
+ const state = saveProfile(file, opts.profile, { kind: "api_key", api_key: key });
130
+ emit({
131
+ status: "logged_in",
132
+ profile: opts.profile,
133
+ active_profile: state.active_profile,
134
+ credential: maskSecret(key),
135
+ credentials_file: file,
136
+ verified: opts.verify,
137
+ ...(balance === undefined ? {} : { balance }),
138
+ }, { format: flags.format, file: flags.output });
139
+ return;
140
+ }
141
+ // Validate --port early (before mode selection) so invalid values always
142
+ // produce a UsageError (exit 2) regardless of which mode is selected.
143
+ // The port value is only used in loopback mode, but the validation must
144
+ // happen unconditionally so existing tests that pass --port with an
145
+ // invalid value get exit 2 even in headless environments.
146
+ const _validatedPort = parsePort(opts.port);
147
+ void _validatedPort;
148
+ const baseUrlV1 = resolveBaseUrlV1(flags);
149
+ const authorizeBase = process.env["MESHY_OAUTH_AUTHORIZE_URL"] ?? "https://www.meshy.ai/oauth/authorize";
150
+ // Resolve login mode.
151
+ const mode = resolveLoginMode({
152
+ manual: opts.manual,
153
+ device: opts.device,
154
+ noWait: !opts.wait,
155
+ deviceFlow: opts.deviceFlow,
156
+ deviceCode: opts.deviceCode,
157
+ });
158
+ // Notify when headless auto-selected device mode.
159
+ if (!opts.manual && !opts.device && opts.wait && !opts.deviceFlow && !opts.deviceCode) {
160
+ if (mode === "device" && detectHeadless()) {
161
+ process.stderr.write("Headless environment detected — using device login flow.\n");
162
+ }
163
+ }
164
+ // -----------------------------------------------------------------------
165
+ // Resume mode: --device-flow <id> or --device-code <code>
166
+ // -----------------------------------------------------------------------
167
+ if (mode === "resume") {
168
+ const flowsFile = deviceFlowsPath();
169
+ let cachedEntry = opts.deviceFlow
170
+ ? loadDeviceFlowByFlowId(opts.deviceFlow, flowsFile)
171
+ : opts.deviceCode
172
+ ? loadDeviceFlowByDeviceCode(opts.deviceCode, flowsFile)
173
+ : null;
174
+ let resumeBaseUrlV1;
175
+ let resumeDeviceCode;
176
+ let resumeInterval;
177
+ let resumeDeadline;
178
+ let resumeScope;
179
+ let hasCachedFlow;
180
+ if (cachedEntry) {
181
+ hasCachedFlow = true;
182
+ resumeBaseUrlV1 = cachedEntry.base_url_v1;
183
+ resumeDeviceCode = cachedEntry.device_code;
184
+ resumeInterval = cachedEntry.interval;
185
+ resumeDeadline = cachedEntry.expires_at;
186
+ resumeScope = cachedEntry.scope || undefined;
187
+ }
188
+ else if (opts.deviceFlow) {
189
+ // --device-flow cache miss: the flow ID is opaque to the server —
190
+ // we cannot poll without the underlying device_code. Fail clearly.
191
+ throw new UsageError(`No cached device flow for id "${opts.deviceFlow}"; it may have expired or been consumed. ` +
192
+ "Start a new flow with: meshy auth login --no-wait");
193
+ }
194
+ else {
195
+ // --device-code cache miss: the user supplied a raw device_code
196
+ // directly, so we can attempt a degraded poll without cached metadata.
197
+ hasCachedFlow = false;
198
+ process.stderr.write("No cached flow found; scope verification and saved settings unavailable.\n");
199
+ resumeBaseUrlV1 = baseUrlV1;
200
+ resumeDeviceCode = opts.deviceCode ?? "";
201
+ resumeInterval = 5;
202
+ // Hard 15-minute poll cap for cache-miss resume.
203
+ resumeDeadline = Date.now() + 15 * 60 * 1000;
204
+ resumeScope = undefined;
205
+ }
206
+ const tok = await pollDeviceToken(resumeBaseUrlV1, resumeDeviceCode, {
207
+ interval: resumeInterval,
208
+ expiresIn: 600, // fallback; deadline overrides
209
+ deadline: resumeDeadline,
210
+ });
211
+ if (hasCachedFlow && resumeScope !== undefined) {
212
+ ensureRequestedScopesGranted(resumeScope, tok.scope);
213
+ }
214
+ // Delete the cached flow now that it's consumed.
215
+ if (cachedEntry) {
216
+ deleteDeviceFlow(cachedEntry.flow_id, flowsFile);
217
+ }
218
+ await finishLogin(flags, { profile: opts.profile, verify: opts.verify }, tok);
219
+ return;
220
+ }
221
+ // -----------------------------------------------------------------------
222
+ // Device flow (--device or headless auto)
223
+ // -----------------------------------------------------------------------
224
+ if (mode === "device" || mode === "no-wait") {
225
+ let deviceResp;
226
+ try {
227
+ deviceResp = await deviceAuthorization(baseUrlV1);
228
+ }
229
+ catch (err) {
230
+ if (err instanceof DeviceFlowNotSupportedError) {
231
+ // --no-wait is a contract with agent harnesses: emit the
232
+ // device_flow_started payload and exit immediately. Falling back
233
+ // to the blocking loopback flow would hang the caller, so a 404
234
+ // here is always a hard error in no-wait mode — even on GUI
235
+ // hosts. (Explicit --device / headless auto still falls back.)
236
+ if (mode !== "no-wait" && !detectHeadless()) {
237
+ process.stderr.write("Device flow not supported by this server — falling back to browser login.\n");
238
+ // Fall through to loopback below.
239
+ await runLoopbackFlow(flags, opts, baseUrlV1, authorizeBase);
240
+ return;
241
+ }
242
+ throw err;
243
+ }
244
+ throw err;
245
+ }
246
+ process.stderr.write(`Enter code ${deviceResp.user_code} at ${deviceResp.verification_uri}\n`);
247
+ if (!detectHeadless()) {
248
+ await openBrowser(deviceResp.verification_uri_complete);
249
+ process.stderr.write(`Prefer copy/paste? Use --manual.\n`);
250
+ }
251
+ // no-wait: emit the flow_id and exit without polling.
252
+ if (mode === "no-wait") {
253
+ const flowId = generateFlowId();
254
+ const flowsFile = deviceFlowsPath();
255
+ saveDeviceFlow({
256
+ flow_id: flowId,
257
+ device_code: deviceResp.device_code,
258
+ base_url_v1: baseUrlV1,
259
+ scope: "",
260
+ interval: deviceResp.interval,
261
+ expires_at: Date.now() + deviceResp.expires_in * 1000,
262
+ created_at: Date.now(),
263
+ user_code: deviceResp.user_code,
264
+ verification_uri_complete: deviceResp.verification_uri_complete,
265
+ }, flowsFile);
266
+ // device_code is a bearer secret (valid until expires_in seconds).
267
+ // It is included here per spec so callers can pass it to
268
+ // --device-code for a degraded-poll resume. The poll_command
269
+ // deliberately uses the local flow_id (not device_code) so the
270
+ // CLI can look up cached metadata (base_url, scope, interval).
271
+ emit({
272
+ status: "device_flow_started",
273
+ verification_url: deviceResp.verification_uri_complete,
274
+ user_code: deviceResp.user_code,
275
+ flow_id: flowId,
276
+ device_code: deviceResp.device_code,
277
+ expires_in: deviceResp.expires_in,
278
+ interval: deviceResp.interval,
279
+ poll_command: `meshy auth login --device-flow ${flowId}`,
280
+ }, { format: flags.format, file: flags.output });
281
+ return;
282
+ }
283
+ // Poll until approved.
284
+ const tok = await pollDeviceToken(baseUrlV1, deviceResp.device_code, {
285
+ interval: deviceResp.interval,
286
+ expiresIn: deviceResp.expires_in,
287
+ });
288
+ ensureRequestedScopesGranted("", tok.scope);
289
+ await finishLogin(flags, { profile: opts.profile, verify: opts.verify }, tok);
290
+ return;
291
+ }
292
+ // -----------------------------------------------------------------------
293
+ // Manual flow (--manual)
294
+ // -----------------------------------------------------------------------
295
+ if (mode === "manual") {
296
+ const codeVerifier = generateCodeVerifier();
297
+ const codeChallenge = codeChallengeS256(codeVerifier);
298
+ const oauthState = generateState();
299
+ const authorizeUrl = buildAuthorizeUrl({
300
+ base: authorizeBase,
301
+ redirectUri: OOB_REDIRECT_URI,
302
+ state: oauthState,
303
+ codeChallenge,
304
+ });
305
+ process.stderr.write(`Open this URL in a browser:\n${authorizeUrl}\n`);
306
+ if (!detectHeadless()) {
307
+ await openBrowser(authorizeUrl);
308
+ }
309
+ // Prompt for the code with a 5-minute timeout.
310
+ const code = await promptForCode("Paste the code shown in your browser: ", MANUAL_PROMPT_TIMEOUT_MS);
311
+ const tok = await exchangeCode({
312
+ baseUrlV1,
313
+ code,
314
+ codeVerifier,
315
+ redirectUri: OOB_REDIRECT_URI,
316
+ });
317
+ await finishLogin(flags, { profile: opts.profile, verify: opts.verify }, tok);
318
+ return;
319
+ }
320
+ // -----------------------------------------------------------------------
321
+ // Loopback flow (default)
322
+ // -----------------------------------------------------------------------
323
+ await runLoopbackFlow(flags, opts, baseUrlV1, authorizeBase);
324
+ });
325
+ /**
326
+ * Prompt the user for a code on stderr, with a timeout.
327
+ * Works even with piped stdin (readline reads from stdin regardless).
328
+ *
329
+ * Settle-once: whichever of {line, close, timeout} fires first wins;
330
+ * subsequent events are no-ops.
331
+ */
332
+ function promptForCode(prompt, timeoutMs) {
333
+ return new Promise((resolve, reject) => {
334
+ let settled = false;
335
+ function settle(fn) {
336
+ if (settled)
337
+ return;
338
+ settled = true;
339
+ clearTimeout(timer);
340
+ rl.close();
341
+ fn();
342
+ }
343
+ const rl = readline.createInterface({
344
+ input: process.stdin,
345
+ output: process.stderr,
346
+ terminal: false,
347
+ });
348
+ const timer = setTimeout(() => {
349
+ settle(() => reject(new HintedError({
350
+ message: "Timed out waiting for authorization code (5 minutes). Run: meshy auth login --manual",
351
+ code: "oauth_timeout",
352
+ hint: "Run: meshy auth login --manual",
353
+ })));
354
+ }, timeoutMs);
355
+ process.stderr.write(prompt);
356
+ rl.once("line", (line) => {
357
+ const code = line.trim();
358
+ if (!code) {
359
+ settle(() => reject(new HintedError({
360
+ message: "No authorization code entered. Run: meshy auth login --manual",
361
+ code: "oauth_no_code",
362
+ hint: "Run: meshy auth login --manual",
363
+ })));
364
+ }
365
+ else {
366
+ settle(() => resolve(code));
367
+ }
368
+ });
369
+ // stdin EOF (Ctrl+D or closed pipe) before any line was received.
370
+ // Without this handler the timeout is cleared by the old close handler
371
+ // and the promise hangs forever.
372
+ rl.once("close", () => {
373
+ settle(() => reject(new UsageError("No authorization code provided on stdin (EOF). Run: meshy auth login --manual")));
374
+ });
375
+ });
376
+ }
377
+ /**
378
+ * Run the loopback (browser + callback server) OAuth flow.
379
+ */
380
+ async function runLoopbackFlow(flags, opts, baseUrlV1, authorizeBase) {
381
+ const preferredPort = parsePort(opts.port);
382
+ const oauthState = generateState();
383
+ const codeVerifier = generateCodeVerifier();
384
+ const codeChallenge = codeChallengeS256(codeVerifier);
385
+ // Validate the authorize URL BEFORE starting the callback server.
386
+ let authorizeUrl;
387
+ try {
388
+ authorizeUrl = buildAuthorizeUrl({
389
+ base: authorizeBase,
390
+ redirectUri: "http://127.0.0.1:0/callback",
391
+ state: oauthState,
392
+ codeChallenge,
393
+ });
394
+ const parsed = new URL(authorizeUrl);
395
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
396
+ throw new Error(`unsupported protocol: ${parsed.protocol}`);
397
+ }
398
+ }
399
+ catch (err) {
400
+ throw new UsageError(`MESHY_OAUTH_AUTHORIZE_URL is not a valid URL: ${err instanceof Error ? err.message : String(err)}`);
401
+ }
402
+ const { server, port: actualPort, waitForCallback } = await startCallbackServer(preferredPort, oauthState);
403
+ try {
404
+ const redirectUri = `http://127.0.0.1:${actualPort}/callback`;
405
+ authorizeUrl = buildAuthorizeUrl({
406
+ base: authorizeBase,
407
+ redirectUri,
408
+ state: oauthState,
409
+ codeChallenge,
410
+ });
411
+ await openBrowser(authorizeUrl);
412
+ process.stderr.write(`If the browser didn't open, visit this URL:\n${authorizeUrl}\n`);
413
+ const callbackResult = await waitForCallback;
414
+ if (!callbackResult.code) {
415
+ throw new HintedError({
416
+ message: "No authorization code received from the callback.",
417
+ code: "oauth_no_code",
418
+ hint: "Run: meshy auth login",
419
+ });
420
+ }
421
+ const tok = await exchangeCode({
422
+ baseUrlV1,
423
+ code: callbackResult.code,
424
+ codeVerifier,
425
+ redirectUri,
426
+ });
427
+ await finishLogin(flags, { profile: opts.profile, verify: opts.verify }, tok);
428
+ }
429
+ finally {
430
+ server.close();
431
+ }
432
+ }
433
+ // ---------------------------------------------------------------------------
434
+ // auth status
435
+ // ---------------------------------------------------------------------------
436
+ const statusCommand = new Command("status")
437
+ .description("Show which credential is in effect, where it came from, and whether it works")
438
+ .option("--offline", "skip the balance call")
439
+ .action(async (opts, thisCmd) => {
440
+ const flags = readGlobalFlags(thisCmd);
441
+ const file = resolveFile(flags);
442
+ const stored = safeReadProfiles(file);
443
+ const configOverrides = {
444
+ apiKey: flags.apiKey,
445
+ baseUrlV1: flags.baseUrlV1,
446
+ baseUrlV2: flags.baseUrlV2,
447
+ logLevel: flags.verbose ? "debug" : flags.logLevel,
448
+ };
449
+ let config;
450
+ try {
451
+ config = await refreshOAuthCredentialIfNeeded(loadConfig(configOverrides), configOverrides);
452
+ }
453
+ catch (err) {
454
+ if (err instanceof HintedError && err.code === "unauthenticated") {
455
+ emit({
456
+ authenticated: false,
457
+ credentials_file: file,
458
+ profiles: stored.names,
459
+ active_profile: stored.active,
460
+ hint: err.hint,
461
+ }, { format: flags.format, file: flags.output });
462
+ process.exitCode = EXIT_CODES.AUTH;
463
+ return;
464
+ }
465
+ throw err;
466
+ }
467
+ let balance;
468
+ let verified;
469
+ let verifyHint;
470
+ if (!opts.offline) {
471
+ try {
472
+ balance = await new MeshyClient(config).balance.get();
473
+ verified = true;
474
+ }
475
+ catch (err) {
476
+ verified = false;
477
+ if (err instanceof MeshyApiError && err.code === "auth") {
478
+ verifyHint = err.credentialKind === "api_key"
479
+ ? CREDENTIAL_REJECTED_HINT
480
+ : SESSION_REVOKED_HINT;
481
+ }
482
+ else {
483
+ verifyHint = "Could not verify credential (network or server error). Check connectivity and retry.";
484
+ }
485
+ }
486
+ }
487
+ emit({
488
+ authenticated: true,
489
+ source: config.credentialSource,
490
+ profile: config.credentialProfile ?? null,
491
+ credential: maskSecret(config.apiKey),
492
+ credentials_file: file,
493
+ base_url_v1: config.baseUrlV1,
494
+ profiles: stored.names,
495
+ active_profile: stored.active,
496
+ ...(verified === undefined ? {} : { verified }),
497
+ ...(balance === undefined ? {} : { balance }),
498
+ ...(verifyHint !== undefined ? { hint: verifyHint } : {}),
499
+ }, { format: flags.format, file: flags.output });
500
+ if (verified === false)
501
+ process.exitCode = EXIT_CODES.AUTH;
502
+ });
503
+ // ---------------------------------------------------------------------------
504
+ // auth logout / use / list
505
+ // ---------------------------------------------------------------------------
506
+ const logoutCommand = new Command("logout")
507
+ .description("Remove a stored credential (only for the current environment's file)")
508
+ .option("--profile <name>", "profile to remove (default: the active one)")
509
+ .option("--all", "delete the whole credentials file for this environment")
510
+ .action((opts, thisCmd) => {
511
+ const flags = readGlobalFlags(thisCmd);
512
+ const file = resolveFile(flags);
513
+ if (opts.all) {
514
+ const deleted = deleteCredentialsFile(file);
515
+ emit({ status: deleted ? "deleted" : "nothing_to_delete", credentials_file: file }, { format: flags.format, file: flags.output });
516
+ return;
517
+ }
518
+ const state = readCredentials(file);
519
+ const target = opts.profile ?? state?.active_profile ?? DEFAULT_PROFILE;
520
+ const removed = removeProfile(file, target);
521
+ const after = safeReadProfiles(file);
522
+ emit({
523
+ status: removed ? "removed" : "nothing_to_remove",
524
+ profile: target,
525
+ credentials_file: file,
526
+ profiles: after.names,
527
+ active_profile: after.active,
528
+ }, { format: flags.format, file: flags.output });
529
+ });
530
+ const useCommand = new Command("use")
531
+ .description("Switch the active profile")
532
+ .argument("<profile>", "profile name")
533
+ .action((profile, _opts, thisCmd) => {
534
+ const flags = readGlobalFlags(thisCmd);
535
+ const file = resolveFile(flags);
536
+ const known = safeReadProfiles(file);
537
+ if (!known.names.includes(profile)) {
538
+ throw new HintedError({
539
+ message: `No profile named '${profile}'. Known: ${known.names.join(", ") || "(none)"}`,
540
+ code: "unknown_profile",
541
+ hint: "Run: meshy auth list",
542
+ });
543
+ }
544
+ setActiveProfile(file, profile);
545
+ emit({ status: "switched", active_profile: profile, credentials_file: file }, { format: flags.format, file: flags.output });
546
+ });
547
+ const listCommand = new Command("list")
548
+ .description("List stored profiles for this environment")
549
+ .action((_opts, thisCmd) => {
550
+ const flags = readGlobalFlags(thisCmd);
551
+ const file = resolveFile(flags);
552
+ const state = readCredentials(file);
553
+ const profiles = Object.entries(state?.profiles ?? {}).map(([name, profile]) => ({
554
+ name,
555
+ active: name === state?.active_profile,
556
+ kind: profile.kind,
557
+ credential: maskSecret(profile.api_key ?? profile.access_token ?? ""),
558
+ created_at: profile.created_at ?? null,
559
+ }));
560
+ emit({ credentials_file: file, active_profile: state?.active_profile ?? null, profiles }, { format: flags.format, file: flags.output });
561
+ });
562
+ /**
563
+ * Profile names for reporting. A corrupt file must not stop `auth status` from
564
+ * telling the user which file to look at — that is the one moment the path
565
+ * matters most.
566
+ */
567
+ function safeReadProfiles(file) {
568
+ try {
569
+ const state = readCredentials(file);
570
+ return { names: Object.keys(state?.profiles ?? {}), active: state?.active_profile ?? null };
571
+ }
572
+ catch {
573
+ return { names: [], active: null };
574
+ }
575
+ }
576
+ export const authCommand = new Command("auth")
577
+ .description("Manage stored credentials (login, status, logout, profiles)")
578
+ .addCommand(loginCommand)
579
+ .addCommand(statusCommand)
580
+ .addCommand(logoutCommand)
581
+ .addCommand(useCommand)
582
+ .addCommand(listCommand);
583
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cmd/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * balance — one-shot GET /balance
3
+ */
4
+ import { Command } from "commander";
5
+ export declare const balanceCommand: Command;
6
+ //# sourceMappingURL=balance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/cmd/balance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SAMvB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * balance — one-shot GET /balance
3
+ */
4
+ import { Command } from "commander";
5
+ import { emit } from "../internal/output.js";
6
+ import { buildRuntime, readGlobalFlags } from "../internal/runtime.js";
7
+ export const balanceCommand = new Command("balance")
8
+ .description("Show the current API key's credit balance")
9
+ .action(async (_opts, thisCmd) => {
10
+ const runtime = await buildRuntime(readGlobalFlags(thisCmd));
11
+ const balance = await runtime.client.balance.get();
12
+ emit(balance, { format: runtime.flags.format, file: runtime.flags.output });
13
+ });
14
+ //# sourceMappingURL=balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance.js","sourceRoot":"","sources":["../../src/cmd/balance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEvE,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,KAA8B,EAAE,OAAgB,EAAE,EAAE;IACjE,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * convert — https://docs.meshy.ai/en/api/convert
3
+ *
4
+ * Standalone format conversion (extracted from remesh by Meshy in May 2026).
5
+ * The task type is `convert`, so get/wait/delete live right here.
6
+ */
7
+ export declare const convertCommand: import("commander").Command;
8
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/cmd/convert.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqCH,eAAO,MAAM,cAAc,6BAA6B,CAAC"}