@meshy-ai/cli 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/.env.example +8 -2
  2. package/README.md +342 -108
  3. package/dist/client/endpoints/animation-catalog.d.ts +37 -0
  4. package/dist/client/endpoints/animation-catalog.d.ts.map +1 -0
  5. package/dist/client/endpoints/animation-catalog.js +55 -0
  6. package/dist/client/endpoints/animation-catalog.js.map +1 -0
  7. package/dist/client/endpoints/balance.d.ts +5 -0
  8. package/dist/client/endpoints/balance.d.ts.map +1 -1
  9. package/dist/client/endpoints/balance.js +5 -1
  10. package/dist/client/endpoints/balance.js.map +1 -1
  11. package/dist/client/endpoints/base.d.ts +41 -7
  12. package/dist/client/endpoints/base.d.ts.map +1 -1
  13. package/dist/client/endpoints/base.js +61 -40
  14. package/dist/client/endpoints/base.js.map +1 -1
  15. package/dist/client/endpoints/showcases.d.ts +31 -0
  16. package/dist/client/endpoints/showcases.d.ts.map +1 -0
  17. package/dist/client/endpoints/showcases.js +49 -0
  18. package/dist/client/endpoints/showcases.js.map +1 -0
  19. package/dist/client/errors.d.ts +1 -0
  20. package/dist/client/errors.d.ts.map +1 -1
  21. package/dist/client/errors.js +1 -1
  22. package/dist/client/errors.js.map +1 -1
  23. package/dist/client/index.d.ts +47 -38
  24. package/dist/client/index.d.ts.map +1 -1
  25. package/dist/client/index.js +89 -120
  26. package/dist/client/index.js.map +1 -1
  27. package/dist/client/resource-registry.d.ts +97 -0
  28. package/dist/client/resource-registry.d.ts.map +1 -0
  29. package/dist/client/resource-registry.js +157 -0
  30. package/dist/client/resource-registry.js.map +1 -0
  31. package/dist/client/transport.d.ts +99 -0
  32. package/dist/client/transport.d.ts.map +1 -0
  33. package/dist/client/transport.js +320 -0
  34. package/dist/client/transport.js.map +1 -0
  35. package/dist/client/types.d.ts +17 -6
  36. package/dist/client/types.d.ts.map +1 -1
  37. package/dist/client/types.js +28 -6
  38. package/dist/client/types.js.map +1 -1
  39. package/dist/cmd/animation-catalog.d.ts +26 -0
  40. package/dist/cmd/animation-catalog.d.ts.map +1 -0
  41. package/dist/cmd/animation-catalog.js +80 -0
  42. package/dist/cmd/animation-catalog.js.map +1 -0
  43. package/dist/cmd/api.d.ts +3 -2
  44. package/dist/cmd/api.d.ts.map +1 -1
  45. package/dist/cmd/api.js +22 -8
  46. package/dist/cmd/api.js.map +1 -1
  47. package/dist/cmd/auth.d.ts.map +1 -1
  48. package/dist/cmd/auth.js +5 -0
  49. package/dist/cmd/auth.js.map +1 -1
  50. package/dist/cmd/balance.d.ts.map +1 -1
  51. package/dist/cmd/balance.js +10 -6
  52. package/dist/cmd/balance.js.map +1 -1
  53. package/dist/cmd/creative-lab.d.ts +26 -0
  54. package/dist/cmd/creative-lab.d.ts.map +1 -0
  55. package/dist/cmd/creative-lab.js +256 -0
  56. package/dist/cmd/creative-lab.js.map +1 -0
  57. package/dist/cmd/delete.d.ts.map +1 -1
  58. package/dist/cmd/delete.js +6 -7
  59. package/dist/cmd/delete.js.map +1 -1
  60. package/dist/cmd/doctor.d.ts +23 -0
  61. package/dist/cmd/doctor.d.ts.map +1 -0
  62. package/dist/cmd/doctor.js +61 -0
  63. package/dist/cmd/doctor.js.map +1 -0
  64. package/dist/cmd/download.d.ts +17 -0
  65. package/dist/cmd/download.d.ts.map +1 -0
  66. package/dist/cmd/download.js +436 -0
  67. package/dist/cmd/download.js.map +1 -0
  68. package/dist/cmd/inspect.d.ts +63 -0
  69. package/dist/cmd/inspect.d.ts.map +1 -0
  70. package/dist/cmd/inspect.js +179 -0
  71. package/dist/cmd/inspect.js.map +1 -0
  72. package/dist/cmd/make.d.ts +13 -3
  73. package/dist/cmd/make.d.ts.map +1 -1
  74. package/dist/cmd/make.js +240 -36
  75. package/dist/cmd/make.js.map +1 -1
  76. package/dist/cmd/mesh.d.ts +13 -0
  77. package/dist/cmd/mesh.d.ts.map +1 -0
  78. package/dist/cmd/mesh.js +67 -0
  79. package/dist/cmd/mesh.js.map +1 -0
  80. package/dist/cmd/project.d.ts +16 -0
  81. package/dist/cmd/project.d.ts.map +1 -0
  82. package/dist/cmd/project.js +136 -0
  83. package/dist/cmd/project.js.map +1 -0
  84. package/dist/cmd/resources.d.ts +5 -0
  85. package/dist/cmd/resources.d.ts.map +1 -1
  86. package/dist/cmd/resources.js +38 -10
  87. package/dist/cmd/resources.js.map +1 -1
  88. package/dist/cmd/showcases.d.ts +10 -0
  89. package/dist/cmd/showcases.d.ts.map +1 -0
  90. package/dist/cmd/showcases.js +63 -0
  91. package/dist/cmd/showcases.js.map +1 -0
  92. package/dist/cmd/slicer.d.ts +12 -0
  93. package/dist/cmd/slicer.d.ts.map +1 -0
  94. package/dist/cmd/slicer.js +46 -0
  95. package/dist/cmd/slicer.js.map +1 -0
  96. package/dist/cmd/uv-unwrap.d.ts +16 -0
  97. package/dist/cmd/uv-unwrap.d.ts.map +1 -0
  98. package/dist/cmd/uv-unwrap.js +52 -0
  99. package/dist/cmd/uv-unwrap.js.map +1 -0
  100. package/dist/index.d.ts +13 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +141 -8
  103. package/dist/index.js.map +1 -1
  104. package/dist/internal/artifacts.d.ts +97 -0
  105. package/dist/internal/artifacts.d.ts.map +1 -0
  106. package/dist/internal/artifacts.js +280 -0
  107. package/dist/internal/artifacts.js.map +1 -0
  108. package/dist/internal/atomic-file.d.ts +39 -0
  109. package/dist/internal/atomic-file.d.ts.map +1 -0
  110. package/dist/internal/atomic-file.js +160 -0
  111. package/dist/internal/atomic-file.js.map +1 -0
  112. package/dist/internal/command-helpers.d.ts +46 -0
  113. package/dist/internal/command-helpers.d.ts.map +1 -0
  114. package/dist/internal/command-helpers.js +61 -0
  115. package/dist/internal/command-helpers.js.map +1 -0
  116. package/dist/internal/config.d.ts +48 -5
  117. package/dist/internal/config.d.ts.map +1 -1
  118. package/dist/internal/config.js +95 -6
  119. package/dist/internal/config.js.map +1 -1
  120. package/dist/internal/context.d.ts +25 -0
  121. package/dist/internal/context.d.ts.map +1 -0
  122. package/dist/internal/context.js +37 -0
  123. package/dist/internal/context.js.map +1 -0
  124. package/dist/internal/credentials.d.ts +11 -0
  125. package/dist/internal/credentials.d.ts.map +1 -1
  126. package/dist/internal/credentials.js +2 -0
  127. package/dist/internal/credentials.js.map +1 -1
  128. package/dist/internal/doctor.d.ts +94 -0
  129. package/dist/internal/doctor.d.ts.map +1 -0
  130. package/dist/internal/doctor.js +280 -0
  131. package/dist/internal/doctor.js.map +1 -0
  132. package/dist/internal/download.d.ts +147 -13
  133. package/dist/internal/download.d.ts.map +1 -1
  134. package/dist/internal/download.js +735 -142
  135. package/dist/internal/download.js.map +1 -1
  136. package/dist/internal/env-file.d.ts +29 -0
  137. package/dist/internal/env-file.d.ts.map +1 -0
  138. package/dist/internal/env-file.js +95 -0
  139. package/dist/internal/env-file.js.map +1 -0
  140. package/dist/internal/errors.d.ts +74 -1
  141. package/dist/internal/errors.d.ts.map +1 -1
  142. package/dist/internal/errors.js +173 -1
  143. package/dist/internal/errors.js.map +1 -1
  144. package/dist/internal/file-input.d.ts +52 -12
  145. package/dist/internal/file-input.d.ts.map +1 -1
  146. package/dist/internal/file-input.js +162 -33
  147. package/dist/internal/file-input.js.map +1 -1
  148. package/dist/internal/global-options.d.ts +6 -4
  149. package/dist/internal/global-options.d.ts.map +1 -1
  150. package/dist/internal/global-options.js +19 -4
  151. package/dist/internal/global-options.js.map +1 -1
  152. package/dist/internal/inspect.d.ts +67 -0
  153. package/dist/internal/inspect.d.ts.map +1 -0
  154. package/dist/internal/inspect.js +111 -0
  155. package/dist/internal/inspect.js.map +1 -0
  156. package/dist/internal/lock.d.ts +19 -0
  157. package/dist/internal/lock.d.ts.map +1 -0
  158. package/dist/internal/lock.js +66 -0
  159. package/dist/internal/lock.js.map +1 -0
  160. package/dist/internal/material-links.d.ts +115 -0
  161. package/dist/internal/material-links.d.ts.map +1 -0
  162. package/dist/internal/material-links.js +577 -0
  163. package/dist/internal/material-links.js.map +1 -0
  164. package/dist/internal/obj-transform.d.ts +115 -0
  165. package/dist/internal/obj-transform.d.ts.map +1 -0
  166. package/dist/internal/obj-transform.js +649 -0
  167. package/dist/internal/obj-transform.js.map +1 -0
  168. package/dist/internal/operation-store.d.ts +123 -0
  169. package/dist/internal/operation-store.d.ts.map +1 -0
  170. package/dist/internal/operation-store.js +229 -0
  171. package/dist/internal/operation-store.js.map +1 -0
  172. package/dist/internal/output.d.ts +20 -2
  173. package/dist/internal/output.d.ts.map +1 -1
  174. package/dist/internal/output.js +32 -4
  175. package/dist/internal/output.js.map +1 -1
  176. package/dist/internal/paths.d.ts +89 -0
  177. package/dist/internal/paths.d.ts.map +1 -0
  178. package/dist/internal/paths.js +168 -0
  179. package/dist/internal/paths.js.map +1 -0
  180. package/dist/internal/payload.d.ts +15 -0
  181. package/dist/internal/payload.d.ts.map +1 -1
  182. package/dist/internal/payload.js +50 -3
  183. package/dist/internal/payload.js.map +1 -1
  184. package/dist/internal/poll.d.ts +30 -4
  185. package/dist/internal/poll.d.ts.map +1 -1
  186. package/dist/internal/poll.js +99 -16
  187. package/dist/internal/poll.js.map +1 -1
  188. package/dist/internal/project-store.d.ts +197 -0
  189. package/dist/internal/project-store.d.ts.map +1 -0
  190. package/dist/internal/project-store.js +467 -0
  191. package/dist/internal/project-store.js.map +1 -0
  192. package/dist/internal/result.d.ts +50 -0
  193. package/dist/internal/result.d.ts.map +1 -0
  194. package/dist/internal/result.js +41 -0
  195. package/dist/internal/result.js.map +1 -0
  196. package/dist/internal/runtime.d.ts +35 -5
  197. package/dist/internal/runtime.d.ts.map +1 -1
  198. package/dist/internal/runtime.js +68 -18
  199. package/dist/internal/runtime.js.map +1 -1
  200. package/dist/internal/slicers.d.ts +117 -0
  201. package/dist/internal/slicers.d.ts.map +1 -0
  202. package/dist/internal/slicers.js +314 -0
  203. package/dist/internal/slicers.js.map +1 -0
  204. package/dist/internal/stream.d.ts +58 -0
  205. package/dist/internal/stream.d.ts.map +1 -0
  206. package/dist/internal/stream.js +280 -0
  207. package/dist/internal/stream.js.map +1 -0
  208. package/dist/internal/task-command.d.ts +128 -11
  209. package/dist/internal/task-command.d.ts.map +1 -1
  210. package/dist/internal/task-command.js +991 -111
  211. package/dist/internal/task-command.js.map +1 -1
  212. package/dist/internal/task-view.d.ts +56 -0
  213. package/dist/internal/task-view.d.ts.map +1 -0
  214. package/dist/internal/task-view.js +95 -0
  215. package/dist/internal/task-view.js.map +1 -0
  216. package/dist/internal/update-notifier.d.ts +5 -1
  217. package/dist/internal/update-notifier.d.ts.map +1 -1
  218. package/dist/internal/update-notifier.js +7 -3
  219. package/dist/internal/update-notifier.js.map +1 -1
  220. package/dist/root.d.ts +10 -0
  221. package/dist/root.d.ts.map +1 -1
  222. package/dist/root.js +75 -10
  223. package/dist/root.js.map +1 -1
  224. package/package.json +3 -2
  225. package/skills/meshy-cli/SKILL.md +140 -59
  226. package/dist/client/endpoints/analyze-printability.d.ts +0 -5
  227. package/dist/client/endpoints/analyze-printability.d.ts.map +0 -1
  228. package/dist/client/endpoints/analyze-printability.js +0 -7
  229. package/dist/client/endpoints/analyze-printability.js.map +0 -1
  230. package/dist/client/endpoints/animate.d.ts +0 -6
  231. package/dist/client/endpoints/animate.d.ts.map +0 -1
  232. package/dist/client/endpoints/animate.js +0 -8
  233. package/dist/client/endpoints/animate.js.map +0 -1
  234. package/dist/client/endpoints/convert.d.ts +0 -5
  235. package/dist/client/endpoints/convert.d.ts.map +0 -1
  236. package/dist/client/endpoints/convert.js +0 -7
  237. package/dist/client/endpoints/convert.js.map +0 -1
  238. package/dist/client/endpoints/image-to-3d.d.ts +0 -5
  239. package/dist/client/endpoints/image-to-3d.d.ts.map +0 -1
  240. package/dist/client/endpoints/image-to-3d.js +0 -7
  241. package/dist/client/endpoints/image-to-3d.js.map +0 -1
  242. package/dist/client/endpoints/image-to-image.d.ts +0 -5
  243. package/dist/client/endpoints/image-to-image.d.ts.map +0 -1
  244. package/dist/client/endpoints/image-to-image.js +0 -7
  245. package/dist/client/endpoints/image-to-image.js.map +0 -1
  246. package/dist/client/endpoints/multi-color-print.d.ts +0 -5
  247. package/dist/client/endpoints/multi-color-print.d.ts.map +0 -1
  248. package/dist/client/endpoints/multi-color-print.js +0 -7
  249. package/dist/client/endpoints/multi-color-print.js.map +0 -1
  250. package/dist/client/endpoints/multi-image-to-3d.d.ts +0 -5
  251. package/dist/client/endpoints/multi-image-to-3d.d.ts.map +0 -1
  252. package/dist/client/endpoints/multi-image-to-3d.js +0 -7
  253. package/dist/client/endpoints/multi-image-to-3d.js.map +0 -1
  254. package/dist/client/endpoints/remesh.d.ts +0 -5
  255. package/dist/client/endpoints/remesh.d.ts.map +0 -1
  256. package/dist/client/endpoints/remesh.js +0 -7
  257. package/dist/client/endpoints/remesh.js.map +0 -1
  258. package/dist/client/endpoints/repair-printability.d.ts +0 -5
  259. package/dist/client/endpoints/repair-printability.d.ts.map +0 -1
  260. package/dist/client/endpoints/repair-printability.js +0 -7
  261. package/dist/client/endpoints/repair-printability.js.map +0 -1
  262. package/dist/client/endpoints/resize.d.ts +0 -5
  263. package/dist/client/endpoints/resize.d.ts.map +0 -1
  264. package/dist/client/endpoints/resize.js +0 -7
  265. package/dist/client/endpoints/resize.js.map +0 -1
  266. package/dist/client/endpoints/retexture.d.ts +0 -5
  267. package/dist/client/endpoints/retexture.d.ts.map +0 -1
  268. package/dist/client/endpoints/retexture.js +0 -7
  269. package/dist/client/endpoints/retexture.js.map +0 -1
  270. package/dist/client/endpoints/rigging.d.ts +0 -6
  271. package/dist/client/endpoints/rigging.d.ts.map +0 -1
  272. package/dist/client/endpoints/rigging.js +0 -8
  273. package/dist/client/endpoints/rigging.js.map +0 -1
  274. package/dist/client/endpoints/text-to-3d.d.ts +0 -6
  275. package/dist/client/endpoints/text-to-3d.d.ts.map +0 -1
  276. package/dist/client/endpoints/text-to-3d.js +0 -8
  277. package/dist/client/endpoints/text-to-3d.js.map +0 -1
  278. package/dist/client/endpoints/text-to-image.d.ts +0 -5
  279. package/dist/client/endpoints/text-to-image.d.ts.map +0 -1
  280. package/dist/client/endpoints/text-to-image.js +0 -7
  281. package/dist/client/endpoints/text-to-image.js.map +0 -1
  282. package/dist/client/endpoints/text-to-motion.d.ts +0 -6
  283. package/dist/client/endpoints/text-to-motion.d.ts.map +0 -1
  284. package/dist/client/endpoints/text-to-motion.js +0 -8
  285. package/dist/client/endpoints/text-to-motion.js.map +0 -1
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Server-Sent Events for task status.
3
+ *
4
+ * The parser follows the WHATWG EventSource algorithm: UTF-8 is decoded
5
+ * across chunk boundaries, lines end at CR, LF or CRLF, an empty line
6
+ * dispatches the event, multi-line `data:` fields are joined with "\n",
7
+ * comment lines (leading ':') are ignored, `id:` and `retry:` are recorded
8
+ * but never used to fabricate a Last-Event-ID we did not receive.
9
+ *
10
+ * Meshy's stream emits `event: message` with the full task JSON (also as the
11
+ * ~10 s keep-alive) and `event: error` with `{message, status_code}` — which
12
+ * can arrive after an HTTP 200, so it is mapped exactly like an HTTP failure.
13
+ */
14
+ import { codeForStatus, MeshyApiError } from "../client/errors.js";
15
+ import { TaskSchema, isTerminalStatus } from "../client/types.js";
16
+ import { CliError } from "./errors.js";
17
+ export const DEFAULT_MAX_SSE_EVENT_BYTES = 1024 * 1024;
18
+ export function createSseParser(opts = {}) {
19
+ const maxEventBytes = opts.maxEventBytes ?? DEFAULT_MAX_SSE_EVENT_BYTES;
20
+ const decoder = new TextDecoder("utf-8");
21
+ let buffer = "";
22
+ let eventType = "";
23
+ let dataLines = [];
24
+ let lastId = null;
25
+ let retry = null;
26
+ let pendingBytes = 0;
27
+ let first = true;
28
+ function dispatch(out) {
29
+ if (dataLines.length === 0) {
30
+ eventType = "";
31
+ pendingBytes = 0;
32
+ return;
33
+ }
34
+ out.push({ event: eventType || "message", data: dataLines.join("\n"), id: lastId, retry });
35
+ eventType = "";
36
+ dataLines = [];
37
+ pendingBytes = 0;
38
+ }
39
+ function processLine(line, out) {
40
+ if (line === "") {
41
+ dispatch(out);
42
+ return;
43
+ }
44
+ if (line.startsWith(":"))
45
+ return; // comment / heartbeat
46
+ let field;
47
+ let value;
48
+ const colon = line.indexOf(":");
49
+ if (colon === -1) {
50
+ field = line;
51
+ value = "";
52
+ }
53
+ else {
54
+ field = line.slice(0, colon);
55
+ value = line.slice(colon + 1);
56
+ if (value.startsWith(" "))
57
+ value = value.slice(1);
58
+ }
59
+ switch (field) {
60
+ case "event":
61
+ eventType = value;
62
+ break;
63
+ case "data":
64
+ pendingBytes += Buffer.byteLength(value, "utf8") + 1;
65
+ if (pendingBytes > maxEventBytes) {
66
+ throw new CliError({ code: "protocol", message: `SSE event exceeds ${maxEventBytes} bytes` });
67
+ }
68
+ dataLines.push(value);
69
+ break;
70
+ case "id":
71
+ if (!value.includes(" "))
72
+ lastId = value;
73
+ break;
74
+ case "retry": {
75
+ const n = Number(value);
76
+ if (Number.isInteger(n) && n >= 0)
77
+ retry = n;
78
+ break;
79
+ }
80
+ default:
81
+ break; // unknown fields are ignored per spec
82
+ }
83
+ }
84
+ function consume(text, out, final) {
85
+ buffer += text;
86
+ if (first && buffer.startsWith("\uFEFF"))
87
+ buffer = buffer.slice(1);
88
+ first = false;
89
+ let start = 0;
90
+ for (;;) {
91
+ const cr = buffer.indexOf("\r", start);
92
+ const lf = buffer.indexOf("\n", start);
93
+ let end;
94
+ let next;
95
+ if (cr === -1 && lf === -1)
96
+ break;
97
+ if (cr !== -1 && (lf === -1 || cr < lf)) {
98
+ // CR, possibly followed by LF. A trailing CR at the very end of the
99
+ // buffer may be half of a CRLF — wait for more bytes unless final.
100
+ if (cr === buffer.length - 1 && !final)
101
+ break;
102
+ end = cr;
103
+ next = buffer[cr + 1] === "\n" ? cr + 2 : cr + 1;
104
+ }
105
+ else {
106
+ end = lf;
107
+ next = lf + 1;
108
+ }
109
+ processLine(buffer.slice(start, end), out);
110
+ start = next;
111
+ }
112
+ buffer = buffer.slice(start);
113
+ if (buffer.length > maxEventBytes) {
114
+ throw new CliError({ code: "protocol", message: `SSE line exceeds ${maxEventBytes} bytes without a line ending` });
115
+ }
116
+ }
117
+ return {
118
+ feed(chunk) {
119
+ const out = [];
120
+ consume(decoder.decode(chunk, { stream: true }), out, false);
121
+ return out;
122
+ },
123
+ end() {
124
+ const out = [];
125
+ consume(decoder.decode(), out, true);
126
+ if (buffer.length > 0) {
127
+ processLine(buffer, out);
128
+ buffer = "";
129
+ }
130
+ dispatch(out);
131
+ return out;
132
+ },
133
+ };
134
+ }
135
+ /**
136
+ * Open the task stream and consume it until a terminal task, an API error
137
+ * event, a deadline, a disconnect or an abort. The connection is always closed
138
+ * before this resolves.
139
+ */
140
+ export async function streamTask(endpoint, taskId, opts) {
141
+ const started = performance.now();
142
+ const total = new AbortController();
143
+ const idle = new AbortController();
144
+ const totalTimer = setTimeout(() => total.abort(new Error("total timeout")), opts.timeoutMs);
145
+ let idleTimer;
146
+ const resetIdle = () => {
147
+ if (idleTimer)
148
+ clearTimeout(idleTimer);
149
+ idleTimer = setTimeout(() => idle.abort(new Error("idle timeout")), opts.idleTimeoutMs);
150
+ };
151
+ const signals = [total.signal, idle.signal];
152
+ if (opts.signal)
153
+ signals.push(opts.signal);
154
+ const signal = AbortSignal.any(signals);
155
+ const state = { task: null, raw: null, events: 0 };
156
+ const finish = (reason, error = null) => ({
157
+ reason,
158
+ task: state.task,
159
+ raw: state.raw,
160
+ events: state.events,
161
+ error,
162
+ elapsedMs: performance.now() - started,
163
+ });
164
+ const classifyAbort = () => {
165
+ if (opts.signal?.aborted)
166
+ return "interrupted";
167
+ if (total.signal.aborted)
168
+ return "timeout";
169
+ if (idle.signal.aborted)
170
+ return "idle_timeout";
171
+ return "disconnected";
172
+ };
173
+ let handle = null;
174
+ try {
175
+ resetIdle();
176
+ try {
177
+ handle = await endpoint.openStream(taskId, { signal, connectTimeoutMs: Math.min(opts.timeoutMs, opts.idleTimeoutMs) });
178
+ }
179
+ catch (err) {
180
+ if (signal.aborted)
181
+ return finish(classifyAbort());
182
+ throw err;
183
+ }
184
+ const contentType = handle.response.headers.get("content-type") ?? "";
185
+ if (!/text\/event-stream/i.test(contentType)) {
186
+ return finish("protocol", new CliError({ code: "protocol", message: `stream endpoint answered with content-type '${contentType || "(none)"}' instead of text/event-stream` }));
187
+ }
188
+ const body = handle.response.body;
189
+ if (!body)
190
+ return finish("protocol", new CliError({ code: "protocol", message: "stream response has no body" }));
191
+ const reader = body.getReader();
192
+ const parser = createSseParser({ maxEventBytes: opts.maxEventBytes });
193
+ const handleEvent = async (ev) => {
194
+ if (ev.event === "error") {
195
+ let payload = {};
196
+ try {
197
+ payload = JSON.parse(ev.data);
198
+ }
199
+ catch {
200
+ return finish("protocol", new CliError({ code: "protocol", message: `stream error event is not JSON: ${ev.data.slice(0, 200)}` }));
201
+ }
202
+ const status = typeof payload.status_code === "number" ? payload.status_code : 0;
203
+ const message = typeof payload.message === "string" ? payload.message : "stream error";
204
+ const apiErr = new MeshyApiError({
205
+ message: `meshy stream ${status || "error"} on ${endpoint.streamPath(taskId)}: ${message}`,
206
+ status,
207
+ code: status ? codeForStatus(status) : "server",
208
+ path: endpoint.streamPath(taskId),
209
+ body: payload,
210
+ });
211
+ return finish("error", apiErr);
212
+ }
213
+ if (ev.event !== "message") {
214
+ opts.onUnknownEvent?.(ev);
215
+ return null;
216
+ }
217
+ let json;
218
+ try {
219
+ json = JSON.parse(ev.data);
220
+ }
221
+ catch {
222
+ return finish("protocol", new CliError({ code: "protocol", message: `stream message is not JSON: ${ev.data.slice(0, 200)}` }));
223
+ }
224
+ const parsed = TaskSchema.safeParse(json);
225
+ if (!parsed.success) {
226
+ return finish("protocol", new CliError({ code: "protocol", message: `stream message is not a task: ${parsed.error.message}` }));
227
+ }
228
+ state.task = parsed.data;
229
+ state.raw = json;
230
+ state.events += 1;
231
+ await opts.onTask?.(parsed.data, json);
232
+ if (isTerminalStatus(parsed.data.status))
233
+ return finish("terminal");
234
+ return null;
235
+ };
236
+ for (;;) {
237
+ let chunk;
238
+ try {
239
+ chunk = await reader.read();
240
+ }
241
+ catch (err) {
242
+ if (signal.aborted)
243
+ return finish(classifyAbort());
244
+ return finish("disconnected", new CliError({ code: "network", message: `stream disconnected: ${err instanceof Error ? err.message : String(err)}` }));
245
+ }
246
+ if (signal.aborted)
247
+ return finish(classifyAbort());
248
+ if (chunk.done) {
249
+ for (const ev of parser.end()) {
250
+ const out = await handleEvent(ev);
251
+ if (out)
252
+ return out;
253
+ }
254
+ if (state.task === null)
255
+ return finish("protocol", new CliError({ code: "protocol", message: "stream ended without any task event" }));
256
+ return finish("disconnected", new CliError({ code: "network", message: `stream ended before the task reached a terminal status (last status: ${state.task.status})` }));
257
+ }
258
+ resetIdle(); // any bytes — keep-alives, comments, partial lines — count as liveness
259
+ let parsedEvents;
260
+ try {
261
+ parsedEvents = parser.feed(chunk.value);
262
+ }
263
+ catch (err) {
264
+ return finish("protocol", err instanceof CliError ? err : new CliError({ code: "protocol", message: String(err) }));
265
+ }
266
+ for (const ev of parsedEvents) {
267
+ const out = await handleEvent(ev);
268
+ if (out)
269
+ return out;
270
+ }
271
+ }
272
+ }
273
+ finally {
274
+ clearTimeout(totalTimer);
275
+ if (idleTimer)
276
+ clearTimeout(idleTimer);
277
+ handle?.close();
278
+ }
279
+ }
280
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/internal/stream.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,38 @@
1
1
  /**
2
- * Factory that wires the uniform get/list/delete/wait/create subcommands for
3
- * any async-task resource. Keeps the per-resource modules focused on their
4
- * unique create-flag shape.
2
+ * Factory that wires the uniform create/get/list/wait/stream/delete
3
+ * subcommands for any registered task resource. Per-resource modules only
4
+ * contribute their unique `create` flag shape and payload validation.
5
+ *
6
+ * Two output schemas share one execution path:
7
+ * legacy — the 0.2.0 payloads and `-o` status report, with two documented
8
+ * fixes: `get` of a non-terminal task exits 0, and async create
9
+ * never polls.
10
+ * v1 — one `meshy.cli/v1` envelope whose result carries the TaskView,
11
+ * the submission record and the download manifest.
12
+ *
13
+ * Money rules enforced here, independent of schema:
14
+ * - every create is exactly one POST, journaled before it is sent;
15
+ * - a lost or malformed response is `submission_unknown` (exit 10), never a
16
+ * retry and never a "please run it again" hint;
17
+ * - local targets that would fail after the POST (an existing --save-json
18
+ * file, an -o path outside the workspace, a missing --project) are checked
19
+ * before it, so a detectable conflict costs zero requests;
20
+ * - once the server has accepted a task, every later failure — saving JSON,
21
+ * polling, downloading, recording, a signal — still reports that task id,
22
+ * the submission record and the `get`/`wait` commands that resume it;
23
+ * - SIGINT stops waiting/streaming (exit 130) and never deletes anything.
5
24
  */
6
25
  import { Command } from "commander";
7
26
  import type { TaskEndpoint } from "../client/endpoints/base.js";
8
- import type { MeshyClient, ResourceName } from "../client/index.js";
9
- import { type Runtime } from "./runtime.js";
27
+ import type { MeshyClient } from "../client/index.js";
28
+ import { type TaskResourceDescriptor } from "../client/resource-registry.js";
10
29
  import { type Task } from "../client/types.js";
30
+ import { type SavedJson } from "./command-helpers.js";
31
+ import { CliError, type Warning } from "./errors.js";
32
+ import type { MaterialLinkReport } from "./material-links.js";
33
+ import { type Runtime } from "./runtime.js";
34
+ import { type TaskView } from "./task-view.js";
35
+ import { type AuthorisedRoot } from "./paths.js";
11
36
  export interface CreateSpec {
12
37
  description: string;
13
38
  /** Attach resource-specific flags; return a structured payload. */
@@ -20,20 +45,112 @@ export interface CreateSpec {
20
45
  * not throw (validation belongs in toPayload).
21
46
  */
22
47
  toDefaults?(opts: Record<string, unknown>): Record<string, unknown>;
48
+ /**
49
+ * Payload keys holding nested option objects that must merge field by field
50
+ * across defaults < --data < flags (e.g. Creative Lab `options`, `output`).
51
+ * Everything else merges shallowly: arrays and scalars replace wholesale.
52
+ */
53
+ nestedObjectKeys?: readonly string[];
54
+ /**
55
+ * Validate the merged payload (defaults < --data < flags) before media is
56
+ * normalised and before anything is sent. Throw UsageError / CliError.
57
+ */
58
+ validatePayload?(payload: Record<string, unknown>, opts: Record<string, unknown>): void;
23
59
  }
24
60
  export interface ResourceCommandSpec {
25
- name: ResourceName;
61
+ /** Registry id of the task resource this command drives. */
62
+ name: string;
63
+ /** Commander name when it differs from the id (Creative Lab stages). */
64
+ commandName?: string;
65
+ /** Dotted prefix for v1 `command` (defaults to the id). */
66
+ commandPrefix?: string;
26
67
  description: string;
27
68
  supportsList?: boolean;
69
+ /** Default output schema for this resource's verbs (`legacy` for 0.2.0 commands). */
70
+ defaultSchema?: "legacy" | "v1";
28
71
  create: CreateSpec;
29
- endpointOf(client: MeshyClient): TaskEndpoint;
72
+ /** Optional override; defaults to the registry endpoint for `name`. */
73
+ endpointOf?(client: MeshyClient): TaskEndpoint;
74
+ }
75
+ export interface DownloadOutcome {
76
+ state: "not_requested" | "not_ready" | "completed" | "partial" | "failed";
77
+ files: Array<{
78
+ key?: string;
79
+ path: string;
80
+ status: "written" | "failed";
81
+ bytes?: number;
82
+ sha256?: string;
83
+ error?: string | null;
84
+ }>;
85
+ metadata_path: string | null;
86
+ /** OBJ/MTL/texture reference report when the download contained a text OBJ. */
87
+ material_links?: MaterialLinkReport | null;
88
+ /** Set when the transfers landed but a later step (relink | digest | sidecar) failed or was interrupted. */
89
+ failed_step?: string;
90
+ }
91
+ export interface SubmissionInfo {
92
+ state: string;
93
+ operation_id: string | null;
94
+ task_id?: string | null;
95
+ request_id?: string | null;
30
96
  }
97
+ interface TaskResultOptions {
98
+ task: Task | null;
99
+ raw: unknown;
100
+ descriptor: TaskResourceDescriptor;
101
+ includeRaw: boolean;
102
+ submission: SubmissionInfo;
103
+ downloads?: DownloadOutcome;
104
+ savedJson?: SavedJson | null;
105
+ extra?: Record<string, unknown>;
106
+ }
107
+ declare function taskResult(o: TaskResultOptions): Record<string, unknown>;
108
+ declare function nextCommands(descriptor: TaskResourceDescriptor, taskId: string): Record<string, string>;
109
+ /**
110
+ * Re-throw any error as a CliError whose `result` carries `result` — keeping
111
+ * the original classification (code, HTTP status, hint, recovery, exit code).
112
+ * A CliError's own partial result (files written so far, a failed download
113
+ * manifest) is merged on top, so nothing already known is lost.
114
+ */
115
+ export declare function wrapWithResult(err: unknown, result: Record<string, unknown>): CliError;
116
+ /** `-o` target: inside the workspace (or its own directory), no symlink leaf, not an existing file. */
117
+ export declare function preflightOutputPath(output: string, workspace: string | AuthorisedRoot | undefined, cwd?: string): void;
118
+ /** `--save-json` target: inside the workspace (or its own directory), no symlink leaf, not an existing file. */
119
+ export declare function preflightSaveJsonPath(target: string, workspace: string | AuthorisedRoot | undefined, cwd?: string): void;
31
120
  export declare function buildResourceCommand(spec: ResourceCommandSpec): Command;
121
+ export interface Submitted {
122
+ taskId: string;
123
+ raw: unknown;
124
+ requestId: string | null;
125
+ operationId: string;
126
+ warnings: Warning[];
127
+ }
128
+ export interface SubmitContext {
129
+ /** Names the request in messages, e.g. "make: the text-to-3d preview (geometry) request". */
130
+ label?: string;
131
+ /** Extra keys carried in every failure result (e.g. `{ step: 1 }`). */
132
+ extraResult?: Record<string, unknown>;
133
+ }
134
+ /**
135
+ * The credential identity a submission is journaled under: bound to the key
136
+ * digest, the OAuth subject or the OAuth login id. `verified` is false when
137
+ * none of those exists (a pre-login-id OAuth profile): such a credential may
138
+ * start operations but is refused a replay of an existing record.
139
+ */
140
+ export declare function credentialIdentityFor(runtime: Runtime, apiOrigin: string): {
141
+ fingerprint: string;
142
+ verified: boolean;
143
+ };
32
144
  /**
33
- * Decide how to report a task whose status is (expected to be) terminal:
34
- * - with `-o`: download artifacts to the filesystem and print the status
35
- * report. Failed/timed-out tasks print the FAIL form without downloads.
36
- * - without `-o`: emit the familiar JSON/pretty summary to stdout.
145
+ * Journal → single POST → journal update. Every failure path leaves a record
146
+ * that says what is known; the unknown state is reported as exit 10 with the
147
+ * operation id and never as a suggestion to submit again. Shared by the
148
+ * resource commands and `make`, so there is exactly one submission state
149
+ * machine.
37
150
  */
151
+ export declare function submitCreate(runtime: Runtime, descriptor: TaskResourceDescriptor, endpoint: TaskEndpoint, payload: Record<string, unknown>, requestedOperationId: string | null, ctx?: SubmitContext): Promise<Submitted>;
152
+ /** Kept for make.ts (legacy path). */
38
153
  export declare function emitTerminalOutcome(task: Task, timedOut: boolean, elapsedSeconds: number | undefined, resourceName: string, runtime: Runtime): Promise<void>;
154
+ export { taskResult as buildTaskResult, nextCommands as taskNextCommands };
155
+ export type { TaskView };
39
156
  //# sourceMappingURL=task-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-command.d.ts","sourceRoot":"","sources":["../../src/internal/task-command.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQpE,OAAO,EAAgB,KAAK,OAAO,EAAmB,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAoC,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAIjF,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,6EAA6E;IAC7E,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClE;;;;OAIG;IACH,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC;CAC/C;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CA2HvE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,OAAO,EACjB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAgDf"}
1
+ {"version":3,"file":"task-command.d.ts","sourceRoot":"","sources":["../../src/internal/task-command.ts"],"names":[],"mappings":"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"}