@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,445 @@
1
+ /**
2
+ * Update notifier — two-channel design.
3
+ *
4
+ * Channel 1 (agents / machines): JSON outputs carry `_notice.update` when a
5
+ * newer version is available. Injected by attachUpdateNotice() in output.ts
6
+ * and report.ts.
7
+ *
8
+ * Channel 2 (humans on TTY): a single stderr line printed by
9
+ * printHumanUpdateHint() after emit() renders its output.
10
+ *
11
+ * Hard rule: this module MUST NEVER slow down, hang, or break the main
12
+ * command. Network I/O runs in a detached child process (see refreshCache)
13
+ * so a hung registry cannot delay process exit. All public functions are
14
+ * synchronous and read only from the local cache file.
15
+ */
16
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
17
+ import { homedir } from "node:os";
18
+ import { dirname, join } from "node:path";
19
+ import { spawn } from "node:child_process";
20
+ import { VERSION } from "./version.js";
21
+ // ---------------------------------------------------------------------------
22
+ // Constants
23
+ // ---------------------------------------------------------------------------
24
+ export const REGISTRY_URL = "https://registry.npmjs.org/meshy-cli/latest";
25
+ export const FETCH_TIMEOUT_MS = 15_000;
26
+ export const MAX_RESPONSE_BYTES = 256 * 1024;
27
+ export const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
28
+ export const UPDATE_COMMAND = "npm i -g meshy-cli@latest";
29
+ /**
30
+ * Hidden self-command used for the detached background refresh child.
31
+ * CRITICAL: the child must check argv for this token and return immediately
32
+ * to prevent an infinite spawn chain.
33
+ */
34
+ export const REFRESH_COMMAND = "__refresh-update-cache";
35
+ /** Opt-out env var. Any non-empty value disables all update checks. */
36
+ const NO_UPDATE_VAR = "MESHY_CLI_NO_UPDATE_NOTIFIER";
37
+ /** CI environment variables — any non-empty value triggers skip. */
38
+ const CI_VARS = ["CI", "GITHUB_ACTIONS", "BUILD_NUMBER", "RUN_ID"];
39
+ // ---------------------------------------------------------------------------
40
+ // Path helpers
41
+ // ---------------------------------------------------------------------------
42
+ /** Returns the path to the update-state cache file. */
43
+ export function stateFilePath() {
44
+ return join(homedir(), ".config", "meshy", "update-state.json");
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // shouldSkip
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * Returns true when the update check should be skipped entirely.
51
+ * Skips when:
52
+ * - MESHY_CLI_NO_UPDATE_NOTIFIER is a non-empty string
53
+ * - any CI env var (CI, GITHUB_ACTIONS, BUILD_NUMBER, RUN_ID) is non-empty
54
+ * - version contains "-dev"
55
+ * - version matches a git-describe suffix (e.g. 0.1.0-5-gdeadbee)
56
+ */
57
+ export function shouldSkip(env = process.env, version = VERSION) {
58
+ if (env[NO_UPDATE_VAR])
59
+ return true;
60
+ for (const v of CI_VARS) {
61
+ if (env[v])
62
+ return true;
63
+ }
64
+ if (version.includes("-dev"))
65
+ return true;
66
+ if (/-\d+-g[0-9a-f]{7,}/.test(version))
67
+ return true;
68
+ return false;
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // compareVersions
72
+ // ---------------------------------------------------------------------------
73
+ /**
74
+ * Semver 2.0.0-compliant comparison. Returns -1 if a < b, 0 if equal, 1 if a > b.
75
+ *
76
+ * Rules:
77
+ * - strips leading "v"
78
+ * - strips "+build" metadata (build metadata is ignored per semver §10)
79
+ * - splits prerelease on first "-"
80
+ * - compares numeric major/minor/patch (missing segments → 0, non-numeric → 0)
81
+ * - equal numerics: release > prerelease (semver §11.3)
82
+ * - both prereleases: compare dot-separated identifiers left-to-right (semver §11.4):
83
+ * numeric identifiers compare numerically
84
+ * alphanumeric identifiers compare lexically (ASCII)
85
+ * numeric < alphanumeric
86
+ * if all shared identifiers equal, shorter set has LOWER precedence
87
+ */
88
+ export function compareVersions(a, b) {
89
+ const parse = (v) => {
90
+ // strip leading v
91
+ let s = v.startsWith("v") ? v.slice(1) : v;
92
+ // strip build metadata (ignored per semver §10)
93
+ const plusIdx = s.indexOf("+");
94
+ if (plusIdx !== -1)
95
+ s = s.slice(0, plusIdx);
96
+ // split prerelease on first "-"
97
+ const dashIdx = s.indexOf("-");
98
+ let core;
99
+ let pre;
100
+ if (dashIdx !== -1) {
101
+ core = s.slice(0, dashIdx);
102
+ pre = s.slice(dashIdx + 1).split(".");
103
+ }
104
+ else {
105
+ core = s;
106
+ pre = null;
107
+ }
108
+ const parts = core.split(".");
109
+ const nums = [0, 1, 2].map((i) => {
110
+ const n = parseInt(parts[i] ?? "0", 10);
111
+ return isNaN(n) ? 0 : n;
112
+ });
113
+ return { nums, pre };
114
+ };
115
+ const pa = parse(a);
116
+ const pb = parse(b);
117
+ // Compare major/minor/patch numerically
118
+ for (let i = 0; i < 3; i++) {
119
+ const na = pa.nums[i];
120
+ const nb = pb.nums[i];
121
+ if (na < nb)
122
+ return -1;
123
+ if (na > nb)
124
+ return 1;
125
+ }
126
+ // numeric parts equal — compare prerelease (semver §11.3 and §11.4)
127
+ if (pa.pre === null && pb.pre === null)
128
+ return 0;
129
+ if (pa.pre === null)
130
+ return 1; // release > prerelease
131
+ if (pb.pre === null)
132
+ return -1; // prerelease < release
133
+ // Both have prerelease — compare dot-separated identifiers left-to-right
134
+ const len = Math.max(pa.pre.length, pb.pre.length);
135
+ for (let i = 0; i < len; i++) {
136
+ const ia = pa.pre[i];
137
+ const ib = pb.pre[i];
138
+ // Shorter set has lower precedence (semver §11.4.4)
139
+ if (ia === undefined)
140
+ return -1;
141
+ if (ib === undefined)
142
+ return 1;
143
+ const na = /^\d+$/.test(ia) ? parseInt(ia, 10) : NaN;
144
+ const nb = /^\d+$/.test(ib) ? parseInt(ib, 10) : NaN;
145
+ if (!isNaN(na) && !isNaN(nb)) {
146
+ // Both numeric — compare numerically
147
+ if (na < nb)
148
+ return -1;
149
+ if (na > nb)
150
+ return 1;
151
+ }
152
+ else if (!isNaN(na)) {
153
+ // Numeric < alphanumeric (semver §11.4.1)
154
+ return -1;
155
+ }
156
+ else if (!isNaN(nb)) {
157
+ return 1;
158
+ }
159
+ else {
160
+ // Both alphanumeric — compare lexically (ASCII)
161
+ if (ia < ib)
162
+ return -1;
163
+ if (ia > ib)
164
+ return 1;
165
+ }
166
+ }
167
+ return 0;
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // buildNotice
171
+ // ---------------------------------------------------------------------------
172
+ /**
173
+ * Returns an UpdateNotice if latest > current, otherwise null.
174
+ */
175
+ export function buildNotice(latest, current = VERSION) {
176
+ if (compareVersions(latest, current) <= 0)
177
+ return null;
178
+ return {
179
+ current,
180
+ latest,
181
+ message: `meshy-cli ${latest} available (current ${current}), run: ${UPDATE_COMMAND}`,
182
+ command: UPDATE_COMMAND,
183
+ };
184
+ }
185
+ // ---------------------------------------------------------------------------
186
+ // checkCached
187
+ // ---------------------------------------------------------------------------
188
+ /**
189
+ * Pure read from the cache file — no network, no TTL check.
190
+ *
191
+ * Note: a newer-version fact does not expire. TTL gates only the network
192
+ * refresh (isCacheStale). Once we know a newer version exists, we keep
193
+ * surfacing the notice until the user upgrades.
194
+ *
195
+ * Returns null on missing/corrupt file, missing latest_version, or when
196
+ * latest is not newer than current. Never throws.
197
+ */
198
+ export function checkCached(stateFile = stateFilePath(), current = VERSION) {
199
+ try {
200
+ const raw = readFileSync(stateFile, "utf8");
201
+ const state = JSON.parse(raw);
202
+ if (typeof state.latest_version !== "string" || !state.latest_version)
203
+ return null;
204
+ return buildNotice(state.latest_version, current);
205
+ }
206
+ catch {
207
+ return null;
208
+ }
209
+ }
210
+ // ---------------------------------------------------------------------------
211
+ // isCacheStale
212
+ // ---------------------------------------------------------------------------
213
+ /**
214
+ * Returns true when the cache is missing, corrupt, has no checked_at, or
215
+ * is older than CACHE_TTL_MS.
216
+ */
217
+ export function isCacheStale(stateFile = stateFilePath(), now = Date.now()) {
218
+ try {
219
+ const raw = readFileSync(stateFile, "utf8");
220
+ const state = JSON.parse(raw);
221
+ if (typeof state.checked_at !== "number")
222
+ return true;
223
+ if (state.checked_at > now)
224
+ return true; // clock-skewed or corrupt future timestamp
225
+ return now - state.checked_at > CACHE_TTL_MS;
226
+ }
227
+ catch {
228
+ return true;
229
+ }
230
+ }
231
+ // ---------------------------------------------------------------------------
232
+ // getUpdateNotice
233
+ // ---------------------------------------------------------------------------
234
+ /**
235
+ * Returns the cached update notice if applicable, or null.
236
+ * This is what emit() and report paths call — synchronous, never throws.
237
+ */
238
+ export function getUpdateNotice() {
239
+ if (shouldSkip())
240
+ return null;
241
+ return checkCached();
242
+ }
243
+ // ---------------------------------------------------------------------------
244
+ // attachUpdateNotice
245
+ // ---------------------------------------------------------------------------
246
+ /**
247
+ * Merges the update notice into an existing `_notice` value.
248
+ * If existing is a plain object, spreads it and adds `update`.
249
+ * If existing is a non-object (string/number/array/null/undefined), replaces it.
250
+ */
251
+ function mergeNotice(existing, notice) {
252
+ if (existing !== null && existing !== undefined && typeof existing === "object" && !Array.isArray(existing)) {
253
+ return { ...existing, update: notice };
254
+ }
255
+ return { update: notice };
256
+ }
257
+ /**
258
+ * Injects the update notice into a value before JSON serialization.
259
+ *
260
+ * Injection rules:
261
+ * - notice null → value unchanged
262
+ * - format "pretty" → unchanged (humans get the stderr line instead)
263
+ * - Array + format "ndjson": if non-empty and first element is a plain
264
+ * object, return new array with first element replaced by
265
+ * { ...first, _notice: { update: notice } }. Attaches ONCE on the first
266
+ * line only — never per-line.
267
+ * - Array + any other format (e.g. "json") → unchanged. A JSON array has
268
+ * no clean metadata slot without breaking the schema, so we leave it alone.
269
+ * - plain object → { ...value, _notice: { update: notice } }
270
+ * - anything else (string/number/null) → unchanged
271
+ */
272
+ export function attachUpdateNotice(value, format, notice) {
273
+ if (notice === null)
274
+ return value;
275
+ if (format === "pretty")
276
+ return value;
277
+ if (Array.isArray(value)) {
278
+ if (format === "ndjson" && value.length > 0) {
279
+ const first = value[0];
280
+ if (first !== null && typeof first === "object" && !Array.isArray(first)) {
281
+ const decorated = { ...first, _notice: mergeNotice(first["_notice"], notice) };
282
+ return [decorated, ...value.slice(1)];
283
+ }
284
+ }
285
+ return value;
286
+ }
287
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
288
+ const obj = value;
289
+ return { ...obj, _notice: mergeNotice(obj["_notice"], notice) };
290
+ }
291
+ return value;
292
+ }
293
+ // ---------------------------------------------------------------------------
294
+ // printHumanUpdateHint
295
+ // ---------------------------------------------------------------------------
296
+ /**
297
+ * Writes the update message to stderr ONLY when all three of
298
+ * io.stdout/io.stderr/io.stdin have truthy isTTY (i.e. a fully interactive
299
+ * terminal). NEVER writes to stdout — stdout must stay machine-parseable.
300
+ *
301
+ * Returns true if the hint was written, false otherwise.
302
+ */
303
+ export function printHumanUpdateHint(notice, io) {
304
+ if (!notice)
305
+ return false;
306
+ if (!io.stdout.isTTY || !io.stderr.isTTY || !io.stdin.isTTY)
307
+ return false;
308
+ io.stderr.write(`${notice.message}\n`);
309
+ return true;
310
+ }
311
+ // ---------------------------------------------------------------------------
312
+ // writeState
313
+ // ---------------------------------------------------------------------------
314
+ /**
315
+ * Atomically writes the update state to disk.
316
+ * Uses a tmp file + rename to avoid torn JSON from concurrent CLI runs.
317
+ */
318
+ export function writeState(state, file = stateFilePath()) {
319
+ mkdirSync(dirname(file), { recursive: true });
320
+ const tmp = `${file}.tmp-${process.pid}`;
321
+ writeFileSync(tmp, JSON.stringify(state), "utf8");
322
+ renameSync(tmp, file);
323
+ }
324
+ // ---------------------------------------------------------------------------
325
+ // fetchLatestVersion
326
+ // ---------------------------------------------------------------------------
327
+ /**
328
+ * Fetches the latest version from the npm registry.
329
+ * Throws on any failure — callers must swallow.
330
+ */
331
+ export async function fetchLatestVersion(registryUrl = REGISTRY_URL, timeoutMs = FETCH_TIMEOUT_MS) {
332
+ const res = await fetch(registryUrl, {
333
+ signal: AbortSignal.timeout(timeoutMs),
334
+ headers: { accept: "application/json" },
335
+ });
336
+ if (!res.ok) {
337
+ throw new Error(`registry responded ${res.status}`);
338
+ }
339
+ // Read body with a hard 256KB cap
340
+ let parsed;
341
+ if (res.body) {
342
+ const reader = res.body.getReader();
343
+ const chunks = [];
344
+ let total = 0;
345
+ while (true) {
346
+ const { done, value } = await reader.read();
347
+ if (done)
348
+ break;
349
+ if (value) {
350
+ total += value.length;
351
+ if (total > MAX_RESPONSE_BYTES) {
352
+ await reader.cancel();
353
+ throw new Error("registry response too large");
354
+ }
355
+ chunks.push(value);
356
+ }
357
+ }
358
+ const combined = new Uint8Array(total);
359
+ let offset = 0;
360
+ for (const chunk of chunks) {
361
+ combined.set(chunk, offset);
362
+ offset += chunk.length;
363
+ }
364
+ const text = new TextDecoder().decode(combined);
365
+ parsed = JSON.parse(text);
366
+ }
367
+ else {
368
+ const text = await res.text();
369
+ if (text.length > MAX_RESPONSE_BYTES) {
370
+ throw new Error("registry response too large");
371
+ }
372
+ parsed = JSON.parse(text);
373
+ }
374
+ if (typeof parsed.version !== "string" || !parsed.version) {
375
+ throw new Error("registry response missing version field");
376
+ }
377
+ return parsed.version;
378
+ }
379
+ // ---------------------------------------------------------------------------
380
+ // runRefreshCommand
381
+ // ---------------------------------------------------------------------------
382
+ /**
383
+ * Entry point for the hidden background child command.
384
+ * Fetches the latest version and writes it to the cache.
385
+ * Must never throw — the child always exits 0.
386
+ */
387
+ export async function runRefreshCommand() {
388
+ if (shouldSkip())
389
+ return;
390
+ try {
391
+ // @internal: MESHY_CLI_UPDATE_REGISTRY_URL is a test hook — not documented
392
+ const url = process.env["MESHY_CLI_UPDATE_REGISTRY_URL"] ?? REGISTRY_URL;
393
+ const latest = await fetchLatestVersion(url);
394
+ writeState({ latest_version: latest, checked_at: Date.now() });
395
+ }
396
+ catch {
397
+ // swallow: offline / 500 / timeout / corrupt must never surface
398
+ // On failure write NOTHING — next stale invocation retries
399
+ }
400
+ }
401
+ // ---------------------------------------------------------------------------
402
+ // refreshCache
403
+ // ---------------------------------------------------------------------------
404
+ /**
405
+ * Fire-and-forget spawner. Spawns a detached child process to refresh the
406
+ * update cache in the background. NEVER throws, never awaits anything.
407
+ *
408
+ * Why a detached child instead of in-process fetch:
409
+ * An in-flight undici/fetch keeps the Node event loop alive, so an
410
+ * in-process fire-and-forget fetch would delay process exit by up to the
411
+ * 15s timeout — violating "never slow down the main command". A detached
412
+ * child is fully independent and the parent can exit immediately.
413
+ */
414
+ export function refreshCache(deps) {
415
+ try {
416
+ const env = deps?.env ?? process.env;
417
+ const argv = deps?.argv ?? process.argv;
418
+ const scriptPath = deps?.scriptPath ?? process.argv[1];
419
+ const stateFile = deps?.stateFile ?? stateFilePath();
420
+ const spawnImpl = deps?.spawnImpl ?? spawn;
421
+ // 1. Skip if opted out or CI
422
+ if (shouldSkip(env))
423
+ return;
424
+ // 2. CRITICAL: prevent infinite spawn chain — if we ARE the child, return
425
+ if (argv.includes(REFRESH_COMMAND))
426
+ return;
427
+ // 3. Skip if cache is still fresh
428
+ if (!isCacheStale(stateFile))
429
+ return;
430
+ // 4. Need a script path to spawn
431
+ if (!scriptPath)
432
+ return;
433
+ // 5. Spawn detached child
434
+ const child = spawnImpl(process.execPath, [scriptPath, REFRESH_COMMAND], {
435
+ detached: true,
436
+ stdio: "ignore",
437
+ });
438
+ child.on("error", () => { });
439
+ child.unref();
440
+ }
441
+ catch {
442
+ // Never propagate — this is fire-and-forget
443
+ }
444
+ }
445
+ //# sourceMappingURL=update-notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-notifier.js","sourceRoot":"","sources":["../../src/internal/update-notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared User-Agent string for all outbound HTTP requests (API calls and
3
+ * OAuth token exchanges). Format: meshy-cli/0.1.0 (darwin arm64; node v22.1.0)
4
+ */
5
+ export declare const USER_AGENT: string;
6
+ //# sourceMappingURL=user-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-agent.d.ts","sourceRoot":"","sources":["../../src/internal/user-agent.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAwF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { VERSION } from "./version.js";
2
+ /**
3
+ * Shared User-Agent string for all outbound HTTP requests (API calls and
4
+ * OAuth token exchanges). Format: meshy-cli/0.1.0 (darwin arm64; node v22.1.0)
5
+ */
6
+ export const USER_AGENT = `meshy-cli/${VERSION} (${process.platform} ${process.arch}; node ${process.version})`;
7
+ //# sourceMappingURL=user-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-agent.js","sourceRoot":"","sources":["../../src/internal/user-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC,OAAO,GAAG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/internal/version.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,OAAO,QAAU,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { readFileSync } from "node:fs";
2
+ /**
3
+ * package.json is the single source of truth for the version — read it at
4
+ * startup instead of hardcoding. This file sits exactly two directories
5
+ * below package.json in both layouts that matter (src/internal/ under tsx,
6
+ * dist/internal/ after `tsc`), and tests/version.test.ts pins VERSION ===
7
+ * package.json#version so the two can never drift again.
8
+ */
9
+ const { version } = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8"));
10
+ export const VERSION = version;
11
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/internal/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC9C,CAAC;AAEzB,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/dist/root.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Root command. Wires global flags and attaches every subcommand.
3
+ *
4
+ * The per-endpoint commands are registered but hidden from the root help.
5
+ * They remain fully supported — `meshy resources` indexes them and
6
+ * `meshy <resource> --help` documents each one. The root help leads with the
7
+ * short list instead, because it is read on every invocation (an agent pays
8
+ * for the whole surface each time it runs `--help`), and because a caller who
9
+ * wants one model should not have to pick an endpoint first.
10
+ */
11
+ import { Command } from "commander";
12
+ export declare function buildRootCommand(): Command;
13
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkGpC,wBAAgB,gBAAgB,IAAI,OAAO,CAiD1C"}