@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,41 @@
1
+ /**
2
+ * Planning for `make` — pure, offline, and computed in full before the first
3
+ * task is created.
4
+ *
5
+ * Planning up front is what lets `--dry-run` and a real run share one code
6
+ * path: the quote the user approves is the quote the run bills against. A
7
+ * plan built step-by-step could always disagree with what was shown.
8
+ *
9
+ * The input decides the chain and nothing else does. There is no heuristic
10
+ * that picks a "better" route behind the user's back — a prompt runs the
11
+ * documented two-stage text flow, an image runs the single-task image flow.
12
+ * Anything more opinionated belongs in the caller's hands, reachable through
13
+ * the per-resource commands.
14
+ */
15
+ export type MakeRoute = "text" | "image";
16
+ export interface MakeStep {
17
+ /** 1-based position, as reported in progress lines. */
18
+ index: number;
19
+ resource: "text-to-3d" | "image-to-3d";
20
+ /** The step's role in the chain: preview | refine | textured. */
21
+ action: string;
22
+ credits: number;
23
+ /** One line of human progress text. */
24
+ label: string;
25
+ }
26
+ export interface MakePlan {
27
+ route: MakeRoute;
28
+ /** The prompt (text route) or the resolved image source (image route). */
29
+ input: string;
30
+ steps: MakeStep[];
31
+ estimatedCredits: number;
32
+ }
33
+ /**
34
+ * Decide whether the argument is a prompt or an image.
35
+ *
36
+ * A path-shaped argument that does not exist is an error rather than a prompt:
37
+ * silently generating "./cat.png" as text would spend credits on a typo.
38
+ */
39
+ export declare function classifyInput(input: string): MakeRoute;
40
+ export declare function planMake(input: string): MakePlan;
41
+ //# sourceMappingURL=make-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-plan.d.ts","sourceRoot":"","sources":["../../src/internal/make-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,QAAQ;IACvB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,GAAG,aAAa,CAAC;IACvC,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAOD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAoBtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAkBhD"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Planning for `make` — pure, offline, and computed in full before the first
3
+ * task is created.
4
+ *
5
+ * Planning up front is what lets `--dry-run` and a real run share one code
6
+ * path: the quote the user approves is the quote the run bills against. A
7
+ * plan built step-by-step could always disagree with what was shown.
8
+ *
9
+ * The input decides the chain and nothing else does. There is no heuristic
10
+ * that picks a "better" route behind the user's back — a prompt runs the
11
+ * documented two-stage text flow, an image runs the single-task image flow.
12
+ * Anything more opinionated belongs in the caller's hands, reachable through
13
+ * the per-resource commands.
14
+ */
15
+ import { existsSync, statSync } from "node:fs";
16
+ import { isAbsolute, resolve as resolvePath } from "node:path";
17
+ import { UsageError } from "./errors.js";
18
+ import { estimateFor } from "./pricing.js";
19
+ /** Extensions that make a bare argument look like an image path. */
20
+ const IMAGE_EXT = /\.(png|jpe?g|webp|gif|bmp)$/i;
21
+ /** Prefixes that make a bare argument look like a filesystem path. */
22
+ const PATH_PREFIX = /^(\.\.?[/\\]|[/\\]|~[/\\]|[A-Za-z]:[/\\])/;
23
+ /**
24
+ * Decide whether the argument is a prompt or an image.
25
+ *
26
+ * A path-shaped argument that does not exist is an error rather than a prompt:
27
+ * silently generating "./cat.png" as text would spend credits on a typo.
28
+ */
29
+ export function classifyInput(input) {
30
+ const value = input.trim();
31
+ if (!value)
32
+ throw new UsageError("make requires a prompt or an image");
33
+ if (/^https?:\/\//i.test(value))
34
+ return "image";
35
+ if (value.startsWith("data:")) {
36
+ throw new UsageError("make does not accept data: URIs — pass a local file path instead");
37
+ }
38
+ const looksLikePath = PATH_PREFIX.test(value) || IMAGE_EXT.test(value);
39
+ if (!looksLikePath)
40
+ return "text";
41
+ const abs = isAbsolute(value) ? value : resolvePath(process.cwd(), value);
42
+ if (!existsSync(abs) || !statSync(abs).isFile()) {
43
+ throw new UsageError(`no such image: ${value} — pass an existing file, an http(s) URL, or quote it if you meant it as a prompt`);
44
+ }
45
+ return "image";
46
+ }
47
+ export function planMake(input) {
48
+ const route = classifyInput(input);
49
+ const steps = route === "text"
50
+ ? [
51
+ step(1, "text-to-3d", "preview", "text-to-3d:preview", "text-to-3d preview (geometry)"),
52
+ step(2, "text-to-3d", "refine", "text-to-3d:refine", "text-to-3d refine (textures)"),
53
+ ]
54
+ : [
55
+ step(1, "image-to-3d", "textured", "image-to-3d:textured", "image-to-3d (geometry + textures)"),
56
+ ];
57
+ return {
58
+ route,
59
+ input: input.trim(),
60
+ steps,
61
+ estimatedCredits: steps.reduce((sum, s) => sum + s.credits, 0),
62
+ };
63
+ }
64
+ function step(index, resource, action, priced, label) {
65
+ return { index, resource, action, credits: estimateFor(priced), label };
66
+ }
67
+ //# sourceMappingURL=make-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-plan.js","sourceRoot":"","sources":["../../src/internal/make-plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAwB,MAAM,cAAc,CAAC;AAuBjE,oEAAoE;AACpE,MAAM,SAAS,GAAG,8BAA8B,CAAC;AACjD,sEAAsE;AACtE,MAAM,WAAW,GAAG,2CAA2C,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,UAAU,CAAC,oCAAoC,CAAC,CAAC;IACvE,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,UAAU,CAClB,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC;IAElC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,UAAU,CAClB,kBAAkB,KAAK,mFAAmF,CAC3G,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,KAAK,GACT,KAAK,KAAK,MAAM;QACd,CAAC,CAAC;YACE,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,+BAA+B,CAAC;YACvF,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,8BAA8B,CAAC;SACrF;QACH,CAAC,CAAC;YACE,IAAI,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,sBAAsB,EAAE,mCAAmC,CAAC;SAChG,CAAC;IAER,OAAO;QACL,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;QACnB,KAAK;QACL,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CACX,KAAa,EACb,QAA8B,EAC9B,MAAc,EACd,MAAuB,EACvB,KAAa;IAEb,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * OAuth 2.0 + PKCE helpers for the browser-based `meshy auth login` flow.
3
+ *
4
+ * All I/O uses node: builtins only — no new npm dependencies.
5
+ *
6
+ * Flow overview:
7
+ * 1. generateState() + generateCodeVerifier() → random secrets
8
+ * 2. codeChallengeS256(verifier) → S256 challenge
9
+ * 3. buildAuthorizeUrl(...) → URL to open in the browser
10
+ * 4. startCallbackServer(port, expectedState) → loopback HTTP server
11
+ * 5. openBrowser(url) → best-effort platform opener
12
+ * 6. await waitForCallback → { code, state }
13
+ * 7. exchangeCode(...) → { access_token, refresh_token, expires_in, ... }
14
+ * 8. refreshTokens(...) → same shape
15
+ */
16
+ import { createServer } from "node:http";
17
+ import { spawn } from "node:child_process";
18
+ /** 24 random bytes → 32-char base64url string (state parameter). */
19
+ export declare function generateState(): string;
20
+ /** 32 random bytes → 43-char base64url string (code_verifier). */
21
+ export declare function generateCodeVerifier(): string;
22
+ /** SHA-256 of the verifier, base64url-encoded (code_challenge, S256 method). */
23
+ export declare function codeChallengeS256(verifier: string): string;
24
+ export interface BuildAuthorizeUrlParams {
25
+ base: string;
26
+ redirectUri: string;
27
+ state: string;
28
+ codeChallenge: string;
29
+ }
30
+ /**
31
+ * Builds the authorization URL.
32
+ * Always uses client_id=meshy-cli, response_type=code, code_challenge_method=S256.
33
+ */
34
+ export declare function buildAuthorizeUrl(params: BuildAuthorizeUrlParams): string;
35
+ export interface CallbackResult {
36
+ code?: string;
37
+ state?: string;
38
+ }
39
+ export interface CallbackServer {
40
+ server: ReturnType<typeof createServer>;
41
+ port: number;
42
+ waitForCallback: Promise<CallbackResult>;
43
+ }
44
+ /**
45
+ * Starts a loopback HTTP server bound to 127.0.0.1 only.
46
+ *
47
+ * Handles ONLY GET /callback; everything else → 404.
48
+ * Falls back to a random port when preferredPort is EADDRINUSE.
49
+ * Closes itself immediately after the first /callback hit.
50
+ * Times out after 5 minutes.
51
+ *
52
+ * State verification happens INSIDE the server: a mismatched state param
53
+ * returns a 400 error page to the browser and rejects waitForCallback, so
54
+ * no success page is ever shown on a state mismatch.
55
+ */
56
+ export declare function startCallbackServer(preferredPort: number, expectedState: string): Promise<CallbackServer>;
57
+ /**
58
+ * Best-effort platform browser opener. Never throws.
59
+ *
60
+ * Env MESHY_CLI_NO_BROWSER=1 forces false (for tests / headless).
61
+ *
62
+ * IMPORTANT — Windows: we do NOT use `cmd /c start "" <url>` because cmd.exe
63
+ * interprets `&` in the OAuth query string as a command separator, breaking
64
+ * the URL and potentially executing arbitrary commands. Instead we spawn
65
+ * rundll32 url.dll,FileProtocolHandler directly with the URL as a plain argv
66
+ * element — no shell involved, no metacharacter risk. The same argv-array
67
+ * approach is used on all platforms (open/xdg-open also receive the URL as a
68
+ * direct argument, never through a shell string).
69
+ *
70
+ * The `_spawnOverride` parameter is a test hook — production callers omit it.
71
+ */
72
+ export declare function openBrowser(url: string, _spawnOverride?: (cmd: string, args: string[]) => ReturnType<typeof spawn>): Promise<boolean>;
73
+ export interface TokenResponse {
74
+ access_token: string;
75
+ token_type: string;
76
+ expires_in: number;
77
+ refresh_token: string;
78
+ scope?: string;
79
+ user_id?: string;
80
+ }
81
+ export interface ExchangeCodeParams {
82
+ baseUrlV1: string;
83
+ code: string;
84
+ codeVerifier: string;
85
+ redirectUri: string;
86
+ }
87
+ /** Exchange an authorization code for tokens. */
88
+ export declare function exchangeCode(params: ExchangeCodeParams): Promise<TokenResponse>;
89
+ export interface RefreshTokensParams {
90
+ baseUrlV1: string;
91
+ refreshToken: string;
92
+ }
93
+ /** Exchange a refresh token for new tokens. */
94
+ export declare function refreshTokens(params: RefreshTokensParams): Promise<TokenResponse>;
95
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/internal/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAQ3C,oEAAoE;AACpE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,kEAAkE;AAClE,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1D;AAMD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,CASzE;AAoBD,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1C;AAyBD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC,CAmHzB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,UAAU,CAAC,OAAO,KAAK,CAAC,GACzE,OAAO,CAAC,OAAO,CAAC,CAuClB;AAMD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2GD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,iDAAiD;AACjD,wBAAsB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAQrF;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,+CAA+C;AAC/C,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAMvF"}
@@ -0,0 +1,365 @@
1
+ /**
2
+ * OAuth 2.0 + PKCE helpers for the browser-based `meshy auth login` flow.
3
+ *
4
+ * All I/O uses node: builtins only — no new npm dependencies.
5
+ *
6
+ * Flow overview:
7
+ * 1. generateState() + generateCodeVerifier() → random secrets
8
+ * 2. codeChallengeS256(verifier) → S256 challenge
9
+ * 3. buildAuthorizeUrl(...) → URL to open in the browser
10
+ * 4. startCallbackServer(port, expectedState) → loopback HTTP server
11
+ * 5. openBrowser(url) → best-effort platform opener
12
+ * 6. await waitForCallback → { code, state }
13
+ * 7. exchangeCode(...) → { access_token, refresh_token, expires_in, ... }
14
+ * 8. refreshTokens(...) → same shape
15
+ */
16
+ import { createHash, randomBytes } from "node:crypto";
17
+ import { createServer } from "node:http";
18
+ import { spawn } from "node:child_process";
19
+ import { HintedError } from "./errors.js";
20
+ import { USER_AGENT } from "./user-agent.js";
21
+ // ---------------------------------------------------------------------------
22
+ // PKCE helpers
23
+ // ---------------------------------------------------------------------------
24
+ /** 24 random bytes → 32-char base64url string (state parameter). */
25
+ export function generateState() {
26
+ return randomBytes(24).toString("base64url");
27
+ }
28
+ /** 32 random bytes → 43-char base64url string (code_verifier). */
29
+ export function generateCodeVerifier() {
30
+ return randomBytes(32).toString("base64url");
31
+ }
32
+ /** SHA-256 of the verifier, base64url-encoded (code_challenge, S256 method). */
33
+ export function codeChallengeS256(verifier) {
34
+ return createHash("sha256").update(verifier).digest("base64url");
35
+ }
36
+ /**
37
+ * Builds the authorization URL.
38
+ * Always uses client_id=meshy-cli, response_type=code, code_challenge_method=S256.
39
+ */
40
+ export function buildAuthorizeUrl(params) {
41
+ const url = new URL(params.base);
42
+ url.searchParams.set("client_id", "meshy-cli");
43
+ url.searchParams.set("response_type", "code");
44
+ url.searchParams.set("redirect_uri", params.redirectUri);
45
+ url.searchParams.set("state", params.state);
46
+ url.searchParams.set("code_challenge", params.codeChallenge);
47
+ url.searchParams.set("code_challenge_method", "S256");
48
+ return url.toString();
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // HTML helpers
52
+ // ---------------------------------------------------------------------------
53
+ /** Escape characters that are special in HTML to prevent reflected XSS. */
54
+ function escapeHtml(text) {
55
+ return text
56
+ .replace(/&/g, "&amp;")
57
+ .replace(/</g, "&lt;")
58
+ .replace(/>/g, "&gt;")
59
+ .replace(/"/g, "&quot;")
60
+ .replace(/'/g, "&#39;");
61
+ }
62
+ const CALLBACK_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
63
+ const SUCCESS_HTML = `<!DOCTYPE html>
64
+ <html lang="en">
65
+ <head><meta charset="utf-8"><title>Meshy — Login successful</title></head>
66
+ <body>
67
+ <h1>Login successful</h1>
68
+ <p>You can close this tab and return to the terminal.</p>
69
+ </body>
70
+ </html>`;
71
+ function errorHtml(msg) {
72
+ return `<!DOCTYPE html>
73
+ <html lang="en">
74
+ <head><meta charset="utf-8"><title>Meshy — Login failed</title></head>
75
+ <body>
76
+ <h1>Login failed</h1>
77
+ <p>${escapeHtml(msg)}</p>
78
+ <p>Return to the terminal for details.</p>
79
+ </body>
80
+ </html>`;
81
+ }
82
+ /**
83
+ * Starts a loopback HTTP server bound to 127.0.0.1 only.
84
+ *
85
+ * Handles ONLY GET /callback; everything else → 404.
86
+ * Falls back to a random port when preferredPort is EADDRINUSE.
87
+ * Closes itself immediately after the first /callback hit.
88
+ * Times out after 5 minutes.
89
+ *
90
+ * State verification happens INSIDE the server: a mismatched state param
91
+ * returns a 400 error page to the browser and rejects waitForCallback, so
92
+ * no success page is ever shown on a state mismatch.
93
+ */
94
+ export function startCallbackServer(preferredPort, expectedState) {
95
+ return new Promise((resolveServer, rejectServer) => {
96
+ let settled = false;
97
+ let timeoutHandle;
98
+ let resolveCallback;
99
+ let rejectCallback;
100
+ const waitForCallback = new Promise((res, rej) => {
101
+ resolveCallback = res;
102
+ rejectCallback = rej;
103
+ });
104
+ function settle(result) {
105
+ if (settled)
106
+ return;
107
+ settled = true;
108
+ if (timeoutHandle !== undefined)
109
+ clearTimeout(timeoutHandle);
110
+ server.close();
111
+ if (result instanceof Error) {
112
+ rejectCallback(result);
113
+ }
114
+ else {
115
+ resolveCallback(result);
116
+ }
117
+ }
118
+ const server = createServer((req, res) => {
119
+ const url = new URL(req.url ?? "/", "http://localhost");
120
+ if (url.pathname !== "/callback") {
121
+ res.writeHead(404, { "Content-Type": "text/plain" });
122
+ res.end("Not found");
123
+ return;
124
+ }
125
+ const code = url.searchParams.get("code") ?? undefined;
126
+ const state = url.searchParams.get("state") ?? undefined;
127
+ const error = url.searchParams.get("error") ?? undefined;
128
+ const errorDescription = url.searchParams.get("error_description") ?? undefined;
129
+ if (error) {
130
+ const msg = errorDescription ?? error;
131
+ res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
132
+ res.end(errorHtml(msg));
133
+ settle(new HintedError({
134
+ message: `Authorization denied: ${msg}`,
135
+ code: "oauth_denied",
136
+ hint: "Run: meshy auth login",
137
+ }));
138
+ return;
139
+ }
140
+ // State verification: reject mismatches before showing any success page.
141
+ if (state !== expectedState) {
142
+ res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
143
+ res.end(errorHtml("Login failed: state mismatch — you can close this tab and retry."));
144
+ settle(new HintedError({
145
+ message: "OAuth state mismatch — possible CSRF attack. Run: meshy auth login",
146
+ code: "oauth_state_mismatch",
147
+ hint: "Run: meshy auth login",
148
+ }));
149
+ return;
150
+ }
151
+ // C2: Require a non-empty code. A missing or empty code with no error
152
+ // param means the authorization server sent a malformed response; show
153
+ // the error page (not the success page) so the browser doesn't mislead
154
+ // the user while the terminal fails with oauth_no_code.
155
+ if (!code) {
156
+ res.writeHead(400, { "Content-Type": "text/html; charset=utf-8" });
157
+ res.end(errorHtml("Login failed: no authorization code received — you can close this tab and retry."));
158
+ settle(new HintedError({
159
+ message: "No authorization code received from the callback.",
160
+ code: "oauth_no_code",
161
+ hint: "Run: meshy auth login",
162
+ }));
163
+ return;
164
+ }
165
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
166
+ res.end(SUCCESS_HTML);
167
+ settle({ code, state });
168
+ });
169
+ function tryListen(port, fallback) {
170
+ server.listen(port, "127.0.0.1", () => {
171
+ const addr = server.address();
172
+ const actualPort = typeof addr === "object" && addr ? addr.port : port;
173
+ // Set up the 5-minute timeout now that the server is up.
174
+ // unref() so the timer doesn't prevent process exit when the test
175
+ // suite finishes (or when the caller abandons the flow).
176
+ timeoutHandle = setTimeout(() => {
177
+ settle(new HintedError({
178
+ message: "Timed out waiting for the browser callback (5 minutes). Run: meshy auth login",
179
+ code: "oauth_timeout",
180
+ hint: "Run: meshy auth login",
181
+ }));
182
+ }, CALLBACK_TIMEOUT_MS);
183
+ timeoutHandle.unref();
184
+ resolveServer({ server, port: actualPort, waitForCallback });
185
+ });
186
+ server.once("error", (err) => {
187
+ if (!fallback && err.code === "EADDRINUSE") {
188
+ // Port busy — fall back to a random port.
189
+ server.removeAllListeners("error");
190
+ tryListen(0, true);
191
+ }
192
+ else {
193
+ rejectServer(err);
194
+ }
195
+ });
196
+ }
197
+ tryListen(preferredPort, false);
198
+ });
199
+ }
200
+ // ---------------------------------------------------------------------------
201
+ // Browser opener
202
+ // ---------------------------------------------------------------------------
203
+ /**
204
+ * Best-effort platform browser opener. Never throws.
205
+ *
206
+ * Env MESHY_CLI_NO_BROWSER=1 forces false (for tests / headless).
207
+ *
208
+ * IMPORTANT — Windows: we do NOT use `cmd /c start "" <url>` because cmd.exe
209
+ * interprets `&` in the OAuth query string as a command separator, breaking
210
+ * the URL and potentially executing arbitrary commands. Instead we spawn
211
+ * rundll32 url.dll,FileProtocolHandler directly with the URL as a plain argv
212
+ * element — no shell involved, no metacharacter risk. The same argv-array
213
+ * approach is used on all platforms (open/xdg-open also receive the URL as a
214
+ * direct argument, never through a shell string).
215
+ *
216
+ * The `_spawnOverride` parameter is a test hook — production callers omit it.
217
+ */
218
+ export function openBrowser(url, _spawnOverride) {
219
+ if (process.env["MESHY_CLI_NO_BROWSER"])
220
+ return Promise.resolve(false);
221
+ return new Promise((resolve) => {
222
+ try {
223
+ let cmd;
224
+ let args;
225
+ switch (process.platform) {
226
+ case "darwin":
227
+ cmd = "open";
228
+ args = [url];
229
+ break;
230
+ case "win32":
231
+ // rundll32 url.dll,FileProtocolHandler <url> — spawned directly (no
232
+ // shell), so & and other metacharacters in the URL are safe.
233
+ cmd = "rundll32";
234
+ args = ["url.dll,FileProtocolHandler", url];
235
+ break;
236
+ default:
237
+ cmd = "xdg-open";
238
+ args = [url];
239
+ }
240
+ const spawnFn = _spawnOverride ?? ((c, a) => spawn(c, a, { detached: true, stdio: "ignore" }));
241
+ const child = spawnFn(cmd, args);
242
+ // B2: Attach an error handler so a missing binary (ENOENT) or other
243
+ // spawn failure resolves false instead of crashing the process with an
244
+ // unhandled 'error' event.
245
+ child.on("error", () => resolve(false));
246
+ child.unref();
247
+ // Defer the optimistic resolve(true) by one microtask tick so the
248
+ // synchronous ENOENT 'error' event (which fires before the next tick)
249
+ // can call resolve(false) first. Once the promise is settled, the
250
+ // deferred resolve(true) is a no-op.
251
+ setImmediate(() => resolve(true));
252
+ }
253
+ catch {
254
+ resolve(false);
255
+ }
256
+ });
257
+ }
258
+ const TOKEN_TIMEOUT_MS = 30_000;
259
+ async function postToken(baseUrlV1, body) {
260
+ const url = `${baseUrlV1}/oauth/token`;
261
+ let res;
262
+ try {
263
+ res = await fetch(url, {
264
+ method: "POST",
265
+ headers: { "Content-Type": "application/json", Accept: "application/json", "User-Agent": USER_AGENT },
266
+ body: JSON.stringify(body),
267
+ signal: AbortSignal.timeout(TOKEN_TIMEOUT_MS),
268
+ });
269
+ }
270
+ catch (err) {
271
+ throw new HintedError({
272
+ message: `Network error contacting token endpoint: ${err instanceof Error ? err.message : String(err)}`,
273
+ code: "oauth_network",
274
+ hint: "Run: meshy auth login",
275
+ });
276
+ }
277
+ let parsed;
278
+ try {
279
+ parsed = await res.json();
280
+ }
281
+ catch {
282
+ throw new HintedError({
283
+ message: `Token endpoint returned non-JSON (status ${res.status})`,
284
+ code: "oauth_bad_response",
285
+ hint: "Run: meshy auth login",
286
+ });
287
+ }
288
+ if (!res.ok) {
289
+ const obj = parsed;
290
+ const msg = (typeof obj["error_description"] === "string" ? obj["error_description"] : undefined) ??
291
+ (typeof obj["message"] === "string" ? obj["message"] : undefined) ??
292
+ (typeof obj["error"] === "string" ? obj["error"] : undefined) ??
293
+ `Token endpoint error (status ${res.status})`;
294
+ throw new HintedError({
295
+ message: msg,
296
+ code: "oauth_token_error",
297
+ hint: "Run: meshy auth login",
298
+ });
299
+ }
300
+ const tok = parsed;
301
+ // Validate access_token.
302
+ if (typeof tok["access_token"] !== "string" || !tok["access_token"]) {
303
+ throw new HintedError({
304
+ message: "Token endpoint response missing access_token",
305
+ code: "oauth_bad_response",
306
+ hint: "Run: meshy auth login",
307
+ });
308
+ }
309
+ // Validate token_type (must be "Bearer", case-insensitive).
310
+ if (typeof tok["token_type"] !== "string" ||
311
+ tok["token_type"].toLowerCase() !== "bearer") {
312
+ throw new HintedError({
313
+ message: `Token endpoint returned unexpected token_type: ${JSON.stringify(tok["token_type"])}`,
314
+ code: "oauth_bad_response",
315
+ hint: "Run: meshy auth login",
316
+ });
317
+ }
318
+ // Validate expires_in (must be a finite positive number — guards against
319
+ // infinite-refresh-loop vectors where a server returns 0 or negative).
320
+ const expiresIn = tok["expires_in"];
321
+ if (typeof expiresIn !== "number" ||
322
+ !Number.isFinite(expiresIn) ||
323
+ expiresIn <= 0) {
324
+ throw new HintedError({
325
+ message: `Token endpoint returned invalid expires_in: ${JSON.stringify(expiresIn)}`,
326
+ code: "oauth_bad_response",
327
+ hint: "Run: meshy auth login",
328
+ });
329
+ }
330
+ // Validate refresh_token.
331
+ if (typeof tok["refresh_token"] !== "string" || !tok["refresh_token"]) {
332
+ throw new HintedError({
333
+ message: "Token endpoint response missing refresh_token",
334
+ code: "oauth_bad_response",
335
+ hint: "Run: meshy auth login",
336
+ });
337
+ }
338
+ return {
339
+ access_token: tok["access_token"],
340
+ token_type: tok["token_type"],
341
+ expires_in: expiresIn,
342
+ refresh_token: tok["refresh_token"],
343
+ scope: typeof tok["scope"] === "string" ? tok["scope"] : undefined,
344
+ user_id: typeof tok["user_id"] === "string" ? tok["user_id"] : undefined,
345
+ };
346
+ }
347
+ /** Exchange an authorization code for tokens. */
348
+ export async function exchangeCode(params) {
349
+ return postToken(params.baseUrlV1, {
350
+ grant_type: "authorization_code",
351
+ code: params.code,
352
+ code_verifier: params.codeVerifier,
353
+ client_id: "meshy-cli",
354
+ redirect_uri: params.redirectUri,
355
+ });
356
+ }
357
+ /** Exchange a refresh token for new tokens. */
358
+ export async function refreshTokens(params) {
359
+ return postToken(params.baseUrlV1, {
360
+ grant_type: "refresh_token",
361
+ refresh_token: params.refreshToken,
362
+ client_id: "meshy-cli",
363
+ });
364
+ }
365
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/internal/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Output rendering. Keep stdout machine-parseable by default; `pretty` is
3
+ * opt-in for human eyes.
4
+ *
5
+ * Note: stdout JSON may carry `_notice.update` when a newer meshy-cli version
6
+ * is available. See update-notifier.ts for the two-channel design.
7
+ */
8
+ export type OutputFormat = "json" | "pretty" | "ndjson";
9
+ export interface OutputOptions {
10
+ format: OutputFormat;
11
+ file?: string;
12
+ }
13
+ export declare function emit(value: unknown, opts: OutputOptions): void;
14
+ export declare function parseOutputFormat(raw: string | undefined): OutputFormat;
15
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/internal/output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAa9D;AAkCD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAIvE"}