@nodetool-ai/base-nodes 0.7.0-rc.11

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 (353) hide show
  1. package/dist/index.d.ts +72 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +270 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/audio-wav.d.ts +66 -0
  6. package/dist/lib/audio-wav.d.ts.map +1 -0
  7. package/dist/lib/audio-wav.js +215 -0
  8. package/dist/lib/audio-wav.js.map +1 -0
  9. package/dist/nodes/agents.d.ts +253 -0
  10. package/dist/nodes/agents.d.ts.map +1 -0
  11. package/dist/nodes/agents.js +2784 -0
  12. package/dist/nodes/agents.js.map +1 -0
  13. package/dist/nodes/anthropic.d.ts +26 -0
  14. package/dist/nodes/anthropic.d.ts.map +1 -0
  15. package/dist/nodes/anthropic.js +133 -0
  16. package/dist/nodes/anthropic.js.map +1 -0
  17. package/dist/nodes/apify.d.ts +120 -0
  18. package/dist/nodes/apify.d.ts.map +1 -0
  19. package/dist/nodes/apify.js +618 -0
  20. package/dist/nodes/apify.js.map +1 -0
  21. package/dist/nodes/audio.d.ts +301 -0
  22. package/dist/nodes/audio.d.ts.map +1 -0
  23. package/dist/nodes/audio.js +1274 -0
  24. package/dist/nodes/audio.js.map +1 -0
  25. package/dist/nodes/code-node.d.ts +34 -0
  26. package/dist/nodes/code-node.d.ts.map +1 -0
  27. package/dist/nodes/code-node.js +343 -0
  28. package/dist/nodes/code-node.js.map +1 -0
  29. package/dist/nodes/code.d.ts +301 -0
  30. package/dist/nodes/code.d.ts.map +1 -0
  31. package/dist/nodes/code.js +850 -0
  32. package/dist/nodes/code.js.map +1 -0
  33. package/dist/nodes/compare.d.ts +18 -0
  34. package/dist/nodes/compare.d.ts.map +1 -0
  35. package/dist/nodes/compare.js +122 -0
  36. package/dist/nodes/compare.js.map +1 -0
  37. package/dist/nodes/constant.d.ts +315 -0
  38. package/dist/nodes/constant.d.ts.map +1 -0
  39. package/dist/nodes/constant.js +715 -0
  40. package/dist/nodes/constant.js.map +1 -0
  41. package/dist/nodes/control.d.ts +83 -0
  42. package/dist/nodes/control.d.ts.map +1 -0
  43. package/dist/nodes/control.js +212 -0
  44. package/dist/nodes/control.js.map +1 -0
  45. package/dist/nodes/data.d.ts +369 -0
  46. package/dist/nodes/data.d.ts.map +1 -0
  47. package/dist/nodes/data.js +1590 -0
  48. package/dist/nodes/data.js.map +1 -0
  49. package/dist/nodes/document.d.ts +134 -0
  50. package/dist/nodes/document.d.ts.map +1 -0
  51. package/dist/nodes/document.js +984 -0
  52. package/dist/nodes/document.js.map +1 -0
  53. package/dist/nodes/extended-placeholders.d.ts +6 -0
  54. package/dist/nodes/extended-placeholders.d.ts.map +1 -0
  55. package/dist/nodes/extended-placeholders.js +19 -0
  56. package/dist/nodes/extended-placeholders.js.map +1 -0
  57. package/dist/nodes/gemini.d.ts +109 -0
  58. package/dist/nodes/gemini.d.ts.map +1 -0
  59. package/dist/nodes/gemini.js +861 -0
  60. package/dist/nodes/gemini.js.map +1 -0
  61. package/dist/nodes/generators.d.ts +84 -0
  62. package/dist/nodes/generators.d.ts.map +1 -0
  63. package/dist/nodes/generators.js +937 -0
  64. package/dist/nodes/generators.js.map +1 -0
  65. package/dist/nodes/image.d.ts +232 -0
  66. package/dist/nodes/image.d.ts.map +1 -0
  67. package/dist/nodes/image.js +1395 -0
  68. package/dist/nodes/image.js.map +1 -0
  69. package/dist/nodes/input.d.ts +445 -0
  70. package/dist/nodes/input.d.ts.map +1 -0
  71. package/dist/nodes/input.js +1459 -0
  72. package/dist/nodes/input.js.map +1 -0
  73. package/dist/nodes/kie-dynamic.d.ts +31 -0
  74. package/dist/nodes/kie-dynamic.d.ts.map +1 -0
  75. package/dist/nodes/kie-dynamic.js +270 -0
  76. package/dist/nodes/kie-dynamic.js.map +1 -0
  77. package/dist/nodes/lib-audio-dsp.d.ts +85 -0
  78. package/dist/nodes/lib-audio-dsp.d.ts.map +1 -0
  79. package/dist/nodes/lib-audio-dsp.js +450 -0
  80. package/dist/nodes/lib-audio-dsp.js.map +1 -0
  81. package/dist/nodes/lib-audio-effects.d.ts +116 -0
  82. package/dist/nodes/lib-audio-effects.d.ts.map +1 -0
  83. package/dist/nodes/lib-audio-effects.js +905 -0
  84. package/dist/nodes/lib-audio-effects.js.map +1 -0
  85. package/dist/nodes/lib-browser.d.ts +99 -0
  86. package/dist/nodes/lib-browser.d.ts.map +1 -0
  87. package/dist/nodes/lib-browser.js +692 -0
  88. package/dist/nodes/lib-browser.js.map +1 -0
  89. package/dist/nodes/lib-charts.d.ts +20 -0
  90. package/dist/nodes/lib-charts.d.ts.map +1 -0
  91. package/dist/nodes/lib-charts.js +245 -0
  92. package/dist/nodes/lib-charts.js.map +1 -0
  93. package/dist/nodes/lib-datetime.d.ts +108 -0
  94. package/dist/nodes/lib-datetime.d.ts.map +1 -0
  95. package/dist/nodes/lib-datetime.js +421 -0
  96. package/dist/nodes/lib-datetime.js.map +1 -0
  97. package/dist/nodes/lib-doc-convert.d.ts +19 -0
  98. package/dist/nodes/lib-doc-convert.d.ts.map +1 -0
  99. package/dist/nodes/lib-doc-convert.js +257 -0
  100. package/dist/nodes/lib-doc-convert.js.map +1 -0
  101. package/dist/nodes/lib-doc-transform.d.ts +39 -0
  102. package/dist/nodes/lib-doc-transform.d.ts.map +1 -0
  103. package/dist/nodes/lib-doc-transform.js +335 -0
  104. package/dist/nodes/lib-doc-transform.js.map +1 -0
  105. package/dist/nodes/lib-docx.d.ts +106 -0
  106. package/dist/nodes/lib-docx.d.ts.map +1 -0
  107. package/dist/nodes/lib-docx.js +595 -0
  108. package/dist/nodes/lib-docx.js.map +1 -0
  109. package/dist/nodes/lib-epub.d.ts +55 -0
  110. package/dist/nodes/lib-epub.d.ts.map +1 -0
  111. package/dist/nodes/lib-epub.js +220 -0
  112. package/dist/nodes/lib-epub.js.map +1 -0
  113. package/dist/nodes/lib-excel.d.ts +74 -0
  114. package/dist/nodes/lib-excel.d.ts.map +1 -0
  115. package/dist/nodes/lib-excel.js +448 -0
  116. package/dist/nodes/lib-excel.js.map +1 -0
  117. package/dist/nodes/lib-graphql.d.ts +66 -0
  118. package/dist/nodes/lib-graphql.d.ts.map +1 -0
  119. package/dist/nodes/lib-graphql.js +333 -0
  120. package/dist/nodes/lib-graphql.js.map +1 -0
  121. package/dist/nodes/lib-grid.d.ts +27 -0
  122. package/dist/nodes/lib-grid.d.ts.map +1 -0
  123. package/dist/nodes/lib-grid.js +172 -0
  124. package/dist/nodes/lib-grid.js.map +1 -0
  125. package/dist/nodes/lib-html-parse.d.ts +108 -0
  126. package/dist/nodes/lib-html-parse.d.ts.map +1 -0
  127. package/dist/nodes/lib-html-parse.js +365 -0
  128. package/dist/nodes/lib-html-parse.js.map +1 -0
  129. package/dist/nodes/lib-http.d.ts +98 -0
  130. package/dist/nodes/lib-http.d.ts.map +1 -0
  131. package/dist/nodes/lib-http.js +267 -0
  132. package/dist/nodes/lib-http.js.map +1 -0
  133. package/dist/nodes/lib-image-color-grading.d.ts +3 -0
  134. package/dist/nodes/lib-image-color-grading.d.ts.map +1 -0
  135. package/dist/nodes/lib-image-color-grading.js +1386 -0
  136. package/dist/nodes/lib-image-color-grading.js.map +1 -0
  137. package/dist/nodes/lib-image-draw.d.ts +3 -0
  138. package/dist/nodes/lib-image-draw.d.ts.map +1 -0
  139. package/dist/nodes/lib-image-draw.js +470 -0
  140. package/dist/nodes/lib-image-draw.js.map +1 -0
  141. package/dist/nodes/lib-image-enhance.d.ts +3 -0
  142. package/dist/nodes/lib-image-enhance.d.ts.map +1 -0
  143. package/dist/nodes/lib-image-enhance.js +731 -0
  144. package/dist/nodes/lib-image-enhance.js.map +1 -0
  145. package/dist/nodes/lib-image-filter.d.ts +3 -0
  146. package/dist/nodes/lib-image-filter.d.ts.map +1 -0
  147. package/dist/nodes/lib-image-filter.js +684 -0
  148. package/dist/nodes/lib-image-filter.js.map +1 -0
  149. package/dist/nodes/lib-image-utils.d.ts +24 -0
  150. package/dist/nodes/lib-image-utils.d.ts.map +1 -0
  151. package/dist/nodes/lib-image-utils.js +150 -0
  152. package/dist/nodes/lib-image-utils.js.map +1 -0
  153. package/dist/nodes/lib-mail.d.ts +74 -0
  154. package/dist/nodes/lib-mail.d.ts.map +1 -0
  155. package/dist/nodes/lib-mail.js +452 -0
  156. package/dist/nodes/lib-mail.js.map +1 -0
  157. package/dist/nodes/lib-markdown.d.ts +70 -0
  158. package/dist/nodes/lib-markdown.d.ts.map +1 -0
  159. package/dist/nodes/lib-markdown.js +236 -0
  160. package/dist/nodes/lib-markdown.js.map +1 -0
  161. package/dist/nodes/lib-nlp.d.ts +98 -0
  162. package/dist/nodes/lib-nlp.d.ts.map +1 -0
  163. package/dist/nodes/lib-nlp.js +374 -0
  164. package/dist/nodes/lib-nlp.js.map +1 -0
  165. package/dist/nodes/lib-notion.d.ts +99 -0
  166. package/dist/nodes/lib-notion.d.ts.map +1 -0
  167. package/dist/nodes/lib-notion.js +601 -0
  168. package/dist/nodes/lib-notion.js.map +1 -0
  169. package/dist/nodes/lib-ocr.d.ts +31 -0
  170. package/dist/nodes/lib-ocr.d.ts.map +1 -0
  171. package/dist/nodes/lib-ocr.js +143 -0
  172. package/dist/nodes/lib-ocr.js.map +1 -0
  173. package/dist/nodes/lib-os.d.ts +312 -0
  174. package/dist/nodes/lib-os.d.ts.map +1 -0
  175. package/dist/nodes/lib-os.js +909 -0
  176. package/dist/nodes/lib-os.js.map +1 -0
  177. package/dist/nodes/lib-pdf.d.ts +142 -0
  178. package/dist/nodes/lib-pdf.d.ts.map +1 -0
  179. package/dist/nodes/lib-pdf.js +871 -0
  180. package/dist/nodes/lib-pdf.js.map +1 -0
  181. package/dist/nodes/lib-pptx.d.ts +29 -0
  182. package/dist/nodes/lib-pptx.d.ts.map +1 -0
  183. package/dist/nodes/lib-pptx.js +122 -0
  184. package/dist/nodes/lib-pptx.js.map +1 -0
  185. package/dist/nodes/lib-rss.d.ts +31 -0
  186. package/dist/nodes/lib-rss.d.ts.map +1 -0
  187. package/dist/nodes/lib-rss.js +163 -0
  188. package/dist/nodes/lib-rss.js.map +1 -0
  189. package/dist/nodes/lib-s3.d.ts +112 -0
  190. package/dist/nodes/lib-s3.d.ts.map +1 -0
  191. package/dist/nodes/lib-s3.js +521 -0
  192. package/dist/nodes/lib-s3.js.map +1 -0
  193. package/dist/nodes/lib-secret.d.ts +15 -0
  194. package/dist/nodes/lib-secret.d.ts.map +1 -0
  195. package/dist/nodes/lib-secret.js +42 -0
  196. package/dist/nodes/lib-secret.js.map +1 -0
  197. package/dist/nodes/lib-sqlite.d.ts +102 -0
  198. package/dist/nodes/lib-sqlite.d.ts.map +1 -0
  199. package/dist/nodes/lib-sqlite.js +532 -0
  200. package/dist/nodes/lib-sqlite.js.map +1 -0
  201. package/dist/nodes/lib-supabase.d.ts +86 -0
  202. package/dist/nodes/lib-supabase.d.ts.map +1 -0
  203. package/dist/nodes/lib-supabase.js +425 -0
  204. package/dist/nodes/lib-supabase.js.map +1 -0
  205. package/dist/nodes/lib-svg.d.ts +199 -0
  206. package/dist/nodes/lib-svg.d.ts.map +1 -0
  207. package/dist/nodes/lib-svg.js +1027 -0
  208. package/dist/nodes/lib-svg.js.map +1 -0
  209. package/dist/nodes/lib-tensorflow.d.ts +71 -0
  210. package/dist/nodes/lib-tensorflow.d.ts.map +1 -0
  211. package/dist/nodes/lib-tensorflow.js +351 -0
  212. package/dist/nodes/lib-tensorflow.js.map +1 -0
  213. package/dist/nodes/lib-twilio.d.ts +71 -0
  214. package/dist/nodes/lib-twilio.d.ts.map +1 -0
  215. package/dist/nodes/lib-twilio.js +469 -0
  216. package/dist/nodes/lib-twilio.js.map +1 -0
  217. package/dist/nodes/lib-validate.d.ts +84 -0
  218. package/dist/nodes/lib-validate.d.ts.map +1 -0
  219. package/dist/nodes/lib-validate.js +215 -0
  220. package/dist/nodes/lib-validate.js.map +1 -0
  221. package/dist/nodes/lib-video-download.d.ts +26 -0
  222. package/dist/nodes/lib-video-download.d.ts.map +1 -0
  223. package/dist/nodes/lib-video-download.js +299 -0
  224. package/dist/nodes/lib-video-download.js.map +1 -0
  225. package/dist/nodes/messaging.d.ts +88 -0
  226. package/dist/nodes/messaging.d.ts.map +1 -0
  227. package/dist/nodes/messaging.js +418 -0
  228. package/dist/nodes/messaging.js.map +1 -0
  229. package/dist/nodes/mistral.d.ts +83 -0
  230. package/dist/nodes/mistral.d.ts.map +1 -0
  231. package/dist/nodes/mistral.js +450 -0
  232. package/dist/nodes/mistral.js.map +1 -0
  233. package/dist/nodes/model3d/analysis.d.ts +13 -0
  234. package/dist/nodes/model3d/analysis.d.ts.map +1 -0
  235. package/dist/nodes/model3d/analysis.js +36 -0
  236. package/dist/nodes/model3d/analysis.js.map +1 -0
  237. package/dist/nodes/model3d/base.d.ts +11 -0
  238. package/dist/nodes/model3d/base.d.ts.map +1 -0
  239. package/dist/nodes/model3d/base.js +20 -0
  240. package/dist/nodes/model3d/base.js.map +1 -0
  241. package/dist/nodes/model3d/boolean-ops.d.ts +2 -0
  242. package/dist/nodes/model3d/boolean-ops.d.ts.map +1 -0
  243. package/dist/nodes/model3d/boolean-ops.js +172 -0
  244. package/dist/nodes/model3d/boolean-ops.js.map +1 -0
  245. package/dist/nodes/model3d/cleanup.d.ts +47 -0
  246. package/dist/nodes/model3d/cleanup.d.ts.map +1 -0
  247. package/dist/nodes/model3d/cleanup.js +136 -0
  248. package/dist/nodes/model3d/cleanup.js.map +1 -0
  249. package/dist/nodes/model3d/convert.d.ts +14 -0
  250. package/dist/nodes/model3d/convert.d.ts.map +1 -0
  251. package/dist/nodes/model3d/convert.js +64 -0
  252. package/dist/nodes/model3d/convert.js.map +1 -0
  253. package/dist/nodes/model3d/defaults.d.ts +34 -0
  254. package/dist/nodes/model3d/defaults.d.ts.map +1 -0
  255. package/dist/nodes/model3d/defaults.js +28 -0
  256. package/dist/nodes/model3d/defaults.js.map +1 -0
  257. package/dist/nodes/model3d/document-ops.d.ts +4 -0
  258. package/dist/nodes/model3d/document-ops.d.ts.map +1 -0
  259. package/dist/nodes/model3d/document-ops.js +40 -0
  260. package/dist/nodes/model3d/document-ops.js.map +1 -0
  261. package/dist/nodes/model3d/generation.d.ts +39 -0
  262. package/dist/nodes/model3d/generation.d.ts.map +1 -0
  263. package/dist/nodes/model3d/generation.js +179 -0
  264. package/dist/nodes/model3d/generation.js.map +1 -0
  265. package/dist/nodes/model3d/glb.d.ts +29 -0
  266. package/dist/nodes/model3d/glb.d.ts.map +1 -0
  267. package/dist/nodes/model3d/glb.js +255 -0
  268. package/dist/nodes/model3d/glb.js.map +1 -0
  269. package/dist/nodes/model3d/index.d.ts +20 -0
  270. package/dist/nodes/model3d/index.d.ts.map +1 -0
  271. package/dist/nodes/model3d/index.js +38 -0
  272. package/dist/nodes/model3d/index.js.map +1 -0
  273. package/dist/nodes/model3d/io.d.ts +38 -0
  274. package/dist/nodes/model3d/io.d.ts.map +1 -0
  275. package/dist/nodes/model3d/io.js +162 -0
  276. package/dist/nodes/model3d/io.js.map +1 -0
  277. package/dist/nodes/model3d/mesh-ops.d.ts +40 -0
  278. package/dist/nodes/model3d/mesh-ops.d.ts.map +1 -0
  279. package/dist/nodes/model3d/mesh-ops.js +775 -0
  280. package/dist/nodes/model3d/mesh-ops.js.map +1 -0
  281. package/dist/nodes/model3d/nodes.d.ts +2 -0
  282. package/dist/nodes/model3d/nodes.d.ts.map +1 -0
  283. package/dist/nodes/model3d/nodes.js +2 -0
  284. package/dist/nodes/model3d/nodes.js.map +1 -0
  285. package/dist/nodes/model3d/ops.d.ts +37 -0
  286. package/dist/nodes/model3d/ops.d.ts.map +1 -0
  287. package/dist/nodes/model3d/ops.js +137 -0
  288. package/dist/nodes/model3d/ops.js.map +1 -0
  289. package/dist/nodes/model3d/transforms.d.ts +49 -0
  290. package/dist/nodes/model3d/transforms.d.ts.map +1 -0
  291. package/dist/nodes/model3d/transforms.js +142 -0
  292. package/dist/nodes/model3d/transforms.js.map +1 -0
  293. package/dist/nodes/model3d/types.d.ts +81 -0
  294. package/dist/nodes/model3d/types.d.ts.map +1 -0
  295. package/dist/nodes/model3d/types.js +2 -0
  296. package/dist/nodes/model3d/types.js.map +1 -0
  297. package/dist/nodes/model3d/utils.d.ts +34 -0
  298. package/dist/nodes/model3d/utils.d.ts.map +1 -0
  299. package/dist/nodes/model3d/utils.js +185 -0
  300. package/dist/nodes/model3d/utils.js.map +1 -0
  301. package/dist/nodes/model3d.d.ts +2 -0
  302. package/dist/nodes/model3d.d.ts.map +1 -0
  303. package/dist/nodes/model3d.js +2 -0
  304. package/dist/nodes/model3d.js.map +1 -0
  305. package/dist/nodes/openai.d.ts +172 -0
  306. package/dist/nodes/openai.d.ts.map +1 -0
  307. package/dist/nodes/openai.js +1294 -0
  308. package/dist/nodes/openai.js.map +1 -0
  309. package/dist/nodes/output.d.ts +29 -0
  310. package/dist/nodes/output.d.ts.map +1 -0
  311. package/dist/nodes/output.js +87 -0
  312. package/dist/nodes/output.js.map +1 -0
  313. package/dist/nodes/sandbox.d.ts +67 -0
  314. package/dist/nodes/sandbox.d.ts.map +1 -0
  315. package/dist/nodes/sandbox.js +681 -0
  316. package/dist/nodes/sandbox.js.map +1 -0
  317. package/dist/nodes/search.d.ts +117 -0
  318. package/dist/nodes/search.d.ts.map +1 -0
  319. package/dist/nodes/search.js +607 -0
  320. package/dist/nodes/search.js.map +1 -0
  321. package/dist/nodes/team.d.ts +74 -0
  322. package/dist/nodes/team.d.ts.map +1 -0
  323. package/dist/nodes/team.js +304 -0
  324. package/dist/nodes/team.js.map +1 -0
  325. package/dist/nodes/text-extra.d.ts +633 -0
  326. package/dist/nodes/text-extra.d.ts.map +1 -0
  327. package/dist/nodes/text-extra.js +2226 -0
  328. package/dist/nodes/text-extra.js.map +1 -0
  329. package/dist/nodes/tool-agents.d.ts +334 -0
  330. package/dist/nodes/tool-agents.d.ts.map +1 -0
  331. package/dist/nodes/tool-agents.js +1861 -0
  332. package/dist/nodes/tool-agents.js.map +1 -0
  333. package/dist/nodes/triggers.d.ts +107 -0
  334. package/dist/nodes/triggers.d.ts.map +1 -0
  335. package/dist/nodes/triggers.js +706 -0
  336. package/dist/nodes/triggers.js.map +1 -0
  337. package/dist/nodes/vector.d.ts +168 -0
  338. package/dist/nodes/vector.d.ts.map +1 -0
  339. package/dist/nodes/vector.js +1121 -0
  340. package/dist/nodes/vector.js.map +1 -0
  341. package/dist/nodes/video.d.ts +387 -0
  342. package/dist/nodes/video.d.ts.map +1 -0
  343. package/dist/nodes/video.js +2361 -0
  344. package/dist/nodes/video.js.map +1 -0
  345. package/dist/nodes/workflow.d.ts +24 -0
  346. package/dist/nodes/workflow.d.ts.map +1 -0
  347. package/dist/nodes/workflow.js +146 -0
  348. package/dist/nodes/workflow.js.map +1 -0
  349. package/dist/nodes/workspace.d.ts +203 -0
  350. package/dist/nodes/workspace.d.ts.map +1 -0
  351. package/dist/nodes/workspace.js +795 -0
  352. package/dist/nodes/workspace.js.map +1 -0
  353. package/package.json +103 -0
@@ -0,0 +1,172 @@
1
+ import ManifoldModule from "manifold-3d";
2
+ import { buildGlb, COMP_FLOAT, COMP_UNSIGNED_INT, glbGetIndexAccessor, glbGetVec3Accessor, glbReadIndices, glbReadVec3, parseGlb } from "./glb.js";
3
+ import { pad4 } from "./utils.js";
4
+ let manifoldPromise = null;
5
+ async function getManifoldApi() {
6
+ if (!manifoldPromise) {
7
+ manifoldPromise = ManifoldModule().then((wasm) => {
8
+ wasm.setup();
9
+ return wasm;
10
+ });
11
+ }
12
+ return manifoldPromise;
13
+ }
14
+ function extractTriangleMeshForBoolean(bytes) {
15
+ const glb = parseGlb(bytes);
16
+ if (!glb) {
17
+ throw new Error("Unsupported model boolean: expected valid GLB bytes.");
18
+ }
19
+ const posChunks = [];
20
+ const idxChunks = [];
21
+ let vertexOffset = 0;
22
+ for (const mesh of glb.json.meshes ?? []) {
23
+ for (const primitive of mesh.primitives) {
24
+ const mode = primitive.mode ?? 4;
25
+ if (mode !== 4) {
26
+ throw new Error("Unsupported model boolean: only triangle primitives are supported.");
27
+ }
28
+ const positionIndex = primitive.attributes["POSITION"];
29
+ if (positionIndex === undefined) {
30
+ throw new Error("Unsupported model boolean: POSITION accessor is required.");
31
+ }
32
+ const positionAccessor = glbGetVec3Accessor(glb.json, positionIndex);
33
+ if (!positionAccessor) {
34
+ throw new Error("Unsupported model boolean: only float VEC3 positions are supported.");
35
+ }
36
+ const primitivePositions = glbReadVec3(glb.bin, positionAccessor.acc, positionAccessor.bv);
37
+ posChunks.push(primitivePositions);
38
+ let primitiveIndices;
39
+ if (primitive.indices !== undefined) {
40
+ const indexAccessor = glbGetIndexAccessor(glb.json, primitive.indices);
41
+ if (!indexAccessor) {
42
+ throw new Error("Unsupported model boolean: indexed triangle accessors are required.");
43
+ }
44
+ const read = glbReadIndices(glb.bin, indexAccessor.acc, indexAccessor.bv);
45
+ if (!read) {
46
+ throw new Error("Unsupported model boolean: only unsigned integer indices are supported.");
47
+ }
48
+ primitiveIndices = read;
49
+ }
50
+ else {
51
+ primitiveIndices = new Uint32Array(positionAccessor.acc.count);
52
+ for (let i = 0; i < positionAccessor.acc.count; i++) {
53
+ primitiveIndices[i] = i;
54
+ }
55
+ }
56
+ const offsetted = new Uint32Array(primitiveIndices.length);
57
+ for (let i = 0; i < primitiveIndices.length; i++) {
58
+ offsetted[i] = primitiveIndices[i] + vertexOffset;
59
+ }
60
+ idxChunks.push(offsetted);
61
+ vertexOffset += positionAccessor.acc.count;
62
+ }
63
+ }
64
+ const totalPos = posChunks.reduce((s, c) => s + c.length, 0);
65
+ const totalIdx = idxChunks.reduce((s, c) => s + c.length, 0);
66
+ const vertProperties = new Float32Array(totalPos);
67
+ const triVerts = new Uint32Array(totalIdx);
68
+ let off = 0;
69
+ for (const chunk of posChunks) {
70
+ vertProperties.set(chunk, off);
71
+ off += chunk.length;
72
+ }
73
+ off = 0;
74
+ for (const chunk of idxChunks) {
75
+ triVerts.set(chunk, off);
76
+ off += chunk.length;
77
+ }
78
+ return { numProp: 3, triVerts, vertProperties };
79
+ }
80
+ function buildGlbFromTriangleMesh(mesh) {
81
+ const vertexCount = Math.floor(mesh.vertProperties.length / mesh.numProp);
82
+ if (vertexCount === 0 || mesh.triVerts.length === 0) {
83
+ throw new Error("Boolean operation produced an empty mesh.");
84
+ }
85
+ const positions = new Float32Array(vertexCount * 3);
86
+ const min = [Infinity, Infinity, Infinity];
87
+ const max = [-Infinity, -Infinity, -Infinity];
88
+ for (let i = 0; i < vertexCount; i++) {
89
+ const base = i * mesh.numProp;
90
+ for (let axis = 0; axis < 3; axis++) {
91
+ const value = mesh.vertProperties[base + axis];
92
+ positions[i * 3 + axis] = value;
93
+ if (value < min[axis])
94
+ min[axis] = value;
95
+ if (value > max[axis])
96
+ max[axis] = value;
97
+ }
98
+ }
99
+ const positionBytes = new Uint8Array(positions.buffer);
100
+ const indexBytes = new Uint8Array(mesh.triVerts.buffer);
101
+ const totalBinaryLength = positionBytes.byteLength + indexBytes.byteLength + pad4(indexBytes.byteLength);
102
+ const json = {
103
+ asset: { version: "2.0" },
104
+ scenes: [{ nodes: [0] }],
105
+ scene: 0,
106
+ nodes: [{ mesh: 0 }],
107
+ meshes: [
108
+ {
109
+ primitives: [
110
+ {
111
+ attributes: { POSITION: 0 },
112
+ indices: 1
113
+ }
114
+ ]
115
+ }
116
+ ],
117
+ buffers: [{ byteLength: totalBinaryLength }],
118
+ bufferViews: [
119
+ { buffer: 0, byteOffset: 0, byteLength: positionBytes.byteLength },
120
+ {
121
+ buffer: 0,
122
+ byteOffset: positionBytes.byteLength,
123
+ byteLength: indexBytes.byteLength
124
+ }
125
+ ],
126
+ accessors: [
127
+ {
128
+ bufferView: 0,
129
+ componentType: COMP_FLOAT,
130
+ count: vertexCount,
131
+ type: "VEC3",
132
+ min,
133
+ max
134
+ },
135
+ {
136
+ bufferView: 1,
137
+ componentType: COMP_UNSIGNED_INT,
138
+ count: mesh.triVerts.length,
139
+ type: "SCALAR"
140
+ }
141
+ ]
142
+ };
143
+ const binary = new Uint8Array(totalBinaryLength);
144
+ binary.set(positionBytes, 0);
145
+ binary.set(indexBytes, positionBytes.byteLength);
146
+ return buildGlb(json, binary);
147
+ }
148
+ export async function booleanGlb(bytesA, bytesB, operation) {
149
+ const wasm = await getManifoldApi();
150
+ const manifoldA = wasm.Manifold.ofMesh(extractTriangleMeshForBoolean(bytesA));
151
+ const manifoldB = wasm.Manifold.ofMesh(extractTriangleMeshForBoolean(bytesB));
152
+ let result = null;
153
+ try {
154
+ if (operation === "difference") {
155
+ result = manifoldA.subtract(manifoldB);
156
+ }
157
+ else if (operation === "intersection") {
158
+ result = manifoldA.intersect(manifoldB);
159
+ }
160
+ else {
161
+ result = manifoldA.add(manifoldB);
162
+ }
163
+ const mesh = result.getMesh();
164
+ return buildGlbFromTriangleMesh(mesh);
165
+ }
166
+ finally {
167
+ manifoldA.delete();
168
+ manifoldB.delete();
169
+ result?.delete();
170
+ }
171
+ }
172
+ //# sourceMappingURL=boolean-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean-ops.js","sourceRoot":"","sources":["../../../src/nodes/model3d/boolean-ops.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,aAAa,CAAC;AAEzC,OAAO,EACL,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,QAAQ,EACT,MAAM,UAAU,CAAC;AAOlB,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,IAAI,eAAe,GAAgC,IAAI,CAAC;AAExD,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAI,cAAc,EAA2B,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACzE,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAiB;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACzC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;YACjC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;YACJ,CAAC;YAED,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;YACJ,CAAC;YAED,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACrE,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;YACJ,CAAC;YAED,MAAM,kBAAkB,GAAG,WAAW,CACpC,GAAG,CAAC,GAAG,EACP,gBAAgB,CAAC,GAAG,EACpB,gBAAgB,CAAC,EAAE,CACpB,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAEnC,IAAI,gBAA6B,CAAC;YAClC,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,aAAa,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBACvE,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;gBAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;gBACJ,CAAC;gBACD,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,gBAAgB,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBACpD,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjD,SAAS,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;YACpD,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,YAAY,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC;IAAC,CAAC;IACvF,GAAG,GAAG,CAAC,CAAC;IACR,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC;IAAC,CAAC;IAEjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAsB;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,WAAW,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC/C,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;YAChC,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACzC,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,iBAAiB,GACrB,aAAa,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAEjF,MAAM,IAAI,GAAa;QACrB,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QACzB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxB,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE;YACN;gBACE,UAAU,EAAE;oBACV;wBACE,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;wBAC3B,OAAO,EAAE,CAAC;qBACX;iBACF;aACF;SACF;QACD,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;QAC5C,WAAW,EAAE;YACX,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE;YAClE;gBACE,MAAM,EAAE,CAAC;gBACT,UAAU,EAAE,aAAa,CAAC,UAAU;gBACpC,UAAU,EAAE,UAAU,CAAC,UAAU;aAClC;SACF;QACD,SAAS,EAAE;YACT;gBACE,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,UAAU;gBACzB,KAAK,EAAE,WAAW;gBAClB,IAAI,EAAE,MAAM;gBACZ,GAAG;gBACH,GAAG;aACJ;YACD;gBACE,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,iBAAiB;gBAChC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAC3B,IAAI,EAAE,QAAQ;aACf;SACF;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAkB,EAClB,MAAkB,EAClB,SAAiB;IAEjB,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9E,IAAI,MAAM,GAA4B,IAAI,CAAC;IAC3C,IAAI,CAAC;QACH,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YAC/B,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YACxC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { GlbTransformNode } from "./base.js";
2
+ export declare class RecalculateNormalsNode extends GlbTransformNode {
3
+ static readonly nodeType = "nodetool.model3d.RecalculateNormals";
4
+ static readonly title = "Recalculate Normals";
5
+ static readonly description = "Recalculate mesh normals for proper shading.\n 3d, mesh, model, normals, fix, shading, smooth, flat, faces\n\n Use cases:\n - Fix inverted or broken normals\n - Switch between smooth and flat shading\n - Repair imported meshes with bad normals\n - Prepare models for rendering";
6
+ static readonly metadataOutputTypes: {
7
+ output: string;
8
+ };
9
+ model: any;
10
+ mode: any;
11
+ fix_winding: any;
12
+ protected transform(bytes: Uint8Array): Uint8Array | null;
13
+ }
14
+ export declare class FlipNormalsNode extends GlbTransformNode {
15
+ static readonly nodeType = "nodetool.model3d.FlipNormals";
16
+ static readonly title = "Flip Normals";
17
+ static readonly description = "Flip all face normals of a mesh.\n 3d, mesh, model, normals, flip, invert, inside_out\n\n Use cases:\n - Fix inside-out meshes\n - Invert normals for specific rendering effects\n - Repair meshes from incompatible software";
18
+ static readonly metadataOutputTypes: {
19
+ output: string;
20
+ };
21
+ model: any;
22
+ protected transform(bytes: Uint8Array): Uint8Array | null;
23
+ }
24
+ export declare class ExtractLargestComponentNode extends GlbTransformNode {
25
+ static readonly nodeType = "nodetool.model3d.ExtractLargestComponent";
26
+ static readonly title = "Extract Largest Component";
27
+ static readonly description = "Keep only the largest disconnected triangle component of a 3D mesh.\n 3d, mesh, model, cleanup, component, connected, floater, islands\n\n Current limits:\n - First honest pass supports GLB triangle geometry only\n - Output rebuilds triangle geometry and does not preserve all original attributes/material setup\n\n Use cases:\n - Remove disconnected floaters from AI-generated meshes\n - Keep the primary object from noisy geometry\n - Clean up multi-island outputs before downstream processing";
28
+ static readonly metadataOutputTypes: {
29
+ output: string;
30
+ };
31
+ model: any;
32
+ protected transform(bytes: Uint8Array): Uint8Array | null;
33
+ }
34
+ export declare class RepairMeshNode extends GlbTransformNode {
35
+ static readonly nodeType = "nodetool.model3d.RepairMesh";
36
+ static readonly title = "Repair Mesh";
37
+ static readonly description = "Apply conservative mesh cleanup passes to remove obviously broken GLB triangle geometry.\n 3d, mesh, model, repair, cleanup, weld, degenerate, duplicate\n\n Current limits:\n - First honest pass supports GLB triangle geometry only\n - Repair is intentionally conservative: near-duplicate vertex merge plus degenerate-face removal\n - Output rebuilds triangle geometry and does not preserve all original attributes/material setup\n\n Use cases:\n - Clean up noisy AI-generated meshes before export\n - Weld tiny duplicate seams in simple geometry\n - Remove zero-area or collapsed triangles";
38
+ static readonly metadataOutputTypes: {
39
+ output: string;
40
+ };
41
+ model: any;
42
+ merge_duplicate_vertices: any;
43
+ remove_degenerate_faces: any;
44
+ position_tolerance: any;
45
+ protected transform(bytes: Uint8Array): Uint8Array | null;
46
+ }
47
+ //# sourceMappingURL=cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../src/nodes/model3d/cleanup.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAS7C,qBAAa,sBAAuB,SAAQ,gBAAgB;IAC1D,MAAM,CAAC,QAAQ,CAAC,QAAQ,yCAAyC;IACjE,MAAM,CAAC,QAAQ,CAAC,KAAK,yBAAyB;IAC9C,MAAM,CAAC,QAAQ,CAAC,WAAW,4SACgR;IAC3S,MAAM,CAAC,QAAQ,CAAC,mBAAmB;;MAEjC;IAQM,KAAK,EAAE,GAAG,CAAC;IASX,IAAI,EAAE,GAAG,CAAC;IAQV,WAAW,EAAE,GAAG,CAAC;IAEzB,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;CAM1D;AAED,qBAAa,eAAgB,SAAQ,gBAAgB;IACnD,MAAM,CAAC,QAAQ,CAAC,QAAQ,kCAAkC;IAC1D,MAAM,CAAC,QAAQ,CAAC,KAAK,kBAAkB;IACvC,MAAM,CAAC,QAAQ,CAAC,WAAW,kPACsN;IACjP,MAAM,CAAC,QAAQ,CAAC,mBAAmB;;MAEjC;IAQM,KAAK,EAAE,GAAG,CAAC;IAEnB,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;CAG1D;AAED,qBAAa,2BAA4B,SAAQ,gBAAgB;IAC/D,MAAM,CAAC,QAAQ,CAAC,QAAQ,8CAA8C;IACtE,MAAM,CAAC,QAAQ,CAAC,KAAK,+BAA+B;IACpD,MAAM,CAAC,QAAQ,CAAC,WAAW,6gBACif;IAC5gB,MAAM,CAAC,QAAQ,CAAC,mBAAmB;;MAEjC;IAQM,KAAK,EAAE,GAAG,CAAC;IAEnB,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;CAG1D;AAED,qBAAa,cAAe,SAAQ,gBAAgB;IAClD,MAAM,CAAC,QAAQ,CAAC,QAAQ,iCAAiC;IACzD,MAAM,CAAC,QAAQ,CAAC,KAAK,iBAAiB;IACtC,MAAM,CAAC,QAAQ,CAAC,WAAW,8mBACklB;IAC7mB,MAAM,CAAC,QAAQ,CAAC,mBAAmB;;MAEjC;IAQM,KAAK,EAAE,GAAG,CAAC;IAQX,wBAAwB,EAAE,GAAG,CAAC;IAQ9B,uBAAuB,EAAE,GAAG,CAAC;IAS7B,kBAAkB,EAAE,GAAG,CAAC;IAEhC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;CAO1D"}
@@ -0,0 +1,136 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { prop } from "@nodetool-ai/node-sdk";
8
+ import { GlbTransformNode } from "./base.js";
9
+ import { DEFAULT_MODEL_3D } from "./defaults.js";
10
+ import { extractLargestComponentGlb, flipNormalsGlb, recalculateNormalsGlb, repairGlb } from "./mesh-ops.js";
11
+ export class RecalculateNormalsNode extends GlbTransformNode {
12
+ static nodeType = "nodetool.model3d.RecalculateNormals";
13
+ static title = "Recalculate Normals";
14
+ static description = "Recalculate mesh normals for proper shading.\n 3d, mesh, model, normals, fix, shading, smooth, flat, faces\n\n Use cases:\n - Fix inverted or broken normals\n - Switch between smooth and flat shading\n - Repair imported meshes with bad normals\n - Prepare models for rendering";
15
+ static metadataOutputTypes = {
16
+ output: "model_3d"
17
+ };
18
+ transform(bytes) {
19
+ return recalculateNormalsGlb(bytes, {
20
+ mode: String(this.mode ?? "auto"),
21
+ fixWinding: Boolean(this.fix_winding)
22
+ });
23
+ }
24
+ }
25
+ __decorate([
26
+ prop({
27
+ type: "model_3d",
28
+ default: DEFAULT_MODEL_3D,
29
+ title: "Model",
30
+ description: "The 3D model to process"
31
+ })
32
+ ], RecalculateNormalsNode.prototype, "model", void 0);
33
+ __decorate([
34
+ prop({
35
+ type: "enum",
36
+ default: "auto",
37
+ title: "Mode",
38
+ description: "Shading mode: smooth, flat, or auto (uses mesh default)",
39
+ values: ["smooth", "flat", "auto"]
40
+ })
41
+ ], RecalculateNormalsNode.prototype, "mode", void 0);
42
+ __decorate([
43
+ prop({
44
+ type: "bool",
45
+ default: true,
46
+ title: "Fix Winding",
47
+ description: "Fix inconsistent face winding (inverted faces)"
48
+ })
49
+ ], RecalculateNormalsNode.prototype, "fix_winding", void 0);
50
+ export class FlipNormalsNode extends GlbTransformNode {
51
+ static nodeType = "nodetool.model3d.FlipNormals";
52
+ static title = "Flip Normals";
53
+ static description = "Flip all face normals of a mesh.\n 3d, mesh, model, normals, flip, invert, inside_out\n\n Use cases:\n - Fix inside-out meshes\n - Invert normals for specific rendering effects\n - Repair meshes from incompatible software";
54
+ static metadataOutputTypes = {
55
+ output: "model_3d"
56
+ };
57
+ transform(bytes) {
58
+ return flipNormalsGlb(bytes);
59
+ }
60
+ }
61
+ __decorate([
62
+ prop({
63
+ type: "model_3d",
64
+ default: DEFAULT_MODEL_3D,
65
+ title: "Model",
66
+ description: "The 3D model to process"
67
+ })
68
+ ], FlipNormalsNode.prototype, "model", void 0);
69
+ export class ExtractLargestComponentNode extends GlbTransformNode {
70
+ static nodeType = "nodetool.model3d.ExtractLargestComponent";
71
+ static title = "Extract Largest Component";
72
+ static description = "Keep only the largest disconnected triangle component of a 3D mesh.\n 3d, mesh, model, cleanup, component, connected, floater, islands\n\n Current limits:\n - First honest pass supports GLB triangle geometry only\n - Output rebuilds triangle geometry and does not preserve all original attributes/material setup\n\n Use cases:\n - Remove disconnected floaters from AI-generated meshes\n - Keep the primary object from noisy geometry\n - Clean up multi-island outputs before downstream processing";
73
+ static metadataOutputTypes = {
74
+ output: "model_3d"
75
+ };
76
+ transform(bytes) {
77
+ return extractLargestComponentGlb(bytes);
78
+ }
79
+ }
80
+ __decorate([
81
+ prop({
82
+ type: "model_3d",
83
+ default: DEFAULT_MODEL_3D,
84
+ title: "Model",
85
+ description: "The 3D model to clean up"
86
+ })
87
+ ], ExtractLargestComponentNode.prototype, "model", void 0);
88
+ export class RepairMeshNode extends GlbTransformNode {
89
+ static nodeType = "nodetool.model3d.RepairMesh";
90
+ static title = "Repair Mesh";
91
+ static description = "Apply conservative mesh cleanup passes to remove obviously broken GLB triangle geometry.\n 3d, mesh, model, repair, cleanup, weld, degenerate, duplicate\n\n Current limits:\n - First honest pass supports GLB triangle geometry only\n - Repair is intentionally conservative: near-duplicate vertex merge plus degenerate-face removal\n - Output rebuilds triangle geometry and does not preserve all original attributes/material setup\n\n Use cases:\n - Clean up noisy AI-generated meshes before export\n - Weld tiny duplicate seams in simple geometry\n - Remove zero-area or collapsed triangles";
92
+ static metadataOutputTypes = {
93
+ output: "model_3d"
94
+ };
95
+ transform(bytes) {
96
+ return repairGlb(bytes, {
97
+ mergeDuplicateVertices: Boolean(this.merge_duplicate_vertices ?? true),
98
+ removeDegenerateFaces: Boolean(this.remove_degenerate_faces ?? true),
99
+ positionTolerance: Number(this.position_tolerance ?? 0.0001)
100
+ });
101
+ }
102
+ }
103
+ __decorate([
104
+ prop({
105
+ type: "model_3d",
106
+ default: DEFAULT_MODEL_3D,
107
+ title: "Model",
108
+ description: "The 3D model to repair"
109
+ })
110
+ ], RepairMeshNode.prototype, "model", void 0);
111
+ __decorate([
112
+ prop({
113
+ type: "bool",
114
+ default: true,
115
+ title: "Merge Duplicate Vertices",
116
+ description: "Merge exact or near-duplicate vertices before other cleanup"
117
+ })
118
+ ], RepairMeshNode.prototype, "merge_duplicate_vertices", void 0);
119
+ __decorate([
120
+ prop({
121
+ type: "bool",
122
+ default: true,
123
+ title: "Remove Degenerate Faces",
124
+ description: "Drop triangles with repeated vertices or near-zero area"
125
+ })
126
+ ], RepairMeshNode.prototype, "remove_degenerate_faces", void 0);
127
+ __decorate([
128
+ prop({
129
+ type: "float",
130
+ default: 0.0001,
131
+ title: "Position Tolerance",
132
+ description: "Tolerance used for near-duplicate vertex welding and degenerate checks",
133
+ min: 0
134
+ })
135
+ ], RepairMeshNode.prototype, "position_tolerance", void 0);
136
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../../src/nodes/model3d/cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { GlbTransformNode } from "./base.js";
2
+ export declare class FormatConverterNode extends GlbTransformNode {
3
+ static readonly nodeType = "nodetool.model3d.FormatConverter";
4
+ static readonly title = "Format Converter";
5
+ static readonly description = "Convert a 3D model between supported formats.\n 3d, mesh, model, convert, format, glb, gltf, export\n\n Currently supported conversions: glb \u2192 gltf. Other targets are not yet implemented.\n\n Use cases:\n - Convert GLB to textual glTF for inspection\n - Export models as glTF for tool compatibility";
6
+ static readonly metadataOutputTypes: {
7
+ output: string;
8
+ };
9
+ model: any;
10
+ output_format: any;
11
+ protected transform(_bytes: Uint8Array): Uint8Array | null;
12
+ process(): Promise<Record<string, unknown>>;
13
+ }
14
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../src/nodes/model3d/convert.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAK7C,qBAAa,mBAAoB,SAAQ,gBAAgB;IACvD,MAAM,CAAC,QAAQ,CAAC,QAAQ,sCAAsC;IAC9D,MAAM,CAAC,QAAQ,CAAC,KAAK,sBAAsB;IAC3C,MAAM,CAAC,QAAQ,CAAC,WAAW,oUACmS;IAC9T,MAAM,CAAC,QAAQ,CAAC,mBAAmB;;MAEjC;IAQM,KAAK,EAAE,GAAG,CAAC;IASX,aAAa,EAAE,GAAG,CAAC;IAE3B,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IAIpD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CA6BlD"}
@@ -0,0 +1,64 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { prop } from "@nodetool-ai/node-sdk";
8
+ import { GlbTransformNode } from "./base.js";
9
+ import { DEFAULT_MODEL_3D } from "./defaults.js";
10
+ import { convertGlbToGltf } from "./document-ops.js";
11
+ import { modelBytes, modelFormat, modelRef, replaceExtension } from "./utils.js";
12
+ export class FormatConverterNode extends GlbTransformNode {
13
+ static nodeType = "nodetool.model3d.FormatConverter";
14
+ static title = "Format Converter";
15
+ static description = "Convert a 3D model between supported formats.\n 3d, mesh, model, convert, format, glb, gltf, export\n\n Currently supported conversions: glb → gltf. Other targets are not yet implemented.\n\n Use cases:\n - Convert GLB to textual glTF for inspection\n - Export models as glTF for tool compatibility";
16
+ static metadataOutputTypes = {
17
+ output: "model_3d"
18
+ };
19
+ transform(_bytes) {
20
+ return null;
21
+ }
22
+ async process() {
23
+ const model = this.getModel();
24
+ const bytes = modelBytes(model);
25
+ const inputFormat = modelFormat(model);
26
+ const outputFormat = String(this.output_format ?? "glb").toLowerCase();
27
+ if (outputFormat === inputFormat) {
28
+ return {
29
+ output: modelRef(bytes, {
30
+ uri: replaceExtension(model.uri ?? "", outputFormat),
31
+ format: outputFormat
32
+ })
33
+ };
34
+ }
35
+ if (inputFormat !== "glb" || outputFormat !== "gltf") {
36
+ throw new Error(`Unsupported model conversion: ${inputFormat} → ${outputFormat}. Only glb → gltf is currently supported.`);
37
+ }
38
+ const convertedBytes = await convertGlbToGltf(bytes);
39
+ return {
40
+ output: modelRef(convertedBytes, {
41
+ uri: replaceExtension(model.uri ?? "", outputFormat),
42
+ format: outputFormat
43
+ })
44
+ };
45
+ }
46
+ }
47
+ __decorate([
48
+ prop({
49
+ type: "model_3d",
50
+ default: DEFAULT_MODEL_3D,
51
+ title: "Model",
52
+ description: "The 3D model to convert"
53
+ })
54
+ ], FormatConverterNode.prototype, "model", void 0);
55
+ __decorate([
56
+ prop({
57
+ type: "enum",
58
+ default: "glb",
59
+ title: "Output Format",
60
+ description: "Target format for conversion. Currently only glb → gltf is supported.",
61
+ values: ["glb", "gltf"]
62
+ })
63
+ ], FormatConverterNode.prototype, "output_format", void 0);
64
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/nodes/model3d/convert.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEjF,MAAM,OAAO,mBAAoB,SAAQ,gBAAgB;IACvD,MAAM,CAAU,QAAQ,GAAG,kCAAkC,CAAC;IAC9D,MAAM,CAAU,KAAK,GAAG,kBAAkB,CAAC;IAC3C,MAAM,CAAU,WAAW,GACzB,2TAA2T,CAAC;IAC9T,MAAM,CAAU,mBAAmB,GAAG;QACpC,MAAM,EAAE,UAAU;KACnB,CAAC;IAmBQ,SAAS,CAAC,MAAkB;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAEvE,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;YACjC,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE;oBACtB,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,YAAY,CAAC;oBACpD,MAAM,EAAE,YAAY;iBACrB,CAAC;aACH,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,KAAK,KAAK,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACb,iCAAiC,WAAW,MAAM,YAAY,2CAA2C,CAC1G,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,cAAc,EAAE;gBAC/B,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,YAAY,CAAC;gBACpD,MAAM,EAAE,YAAY;aACrB,CAAC;SACH,CAAC;IACJ,CAAC;;AA3CO;IANP,IAAI,CAAC;QACJ,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,gBAAgB;QACzB,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,yBAAyB;KACvC,CAAC;kDACiB;AASX;IAPP,IAAI,CAAC;QACJ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,uEAAuE;QACpF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;0DACyB"}
@@ -0,0 +1,34 @@
1
+ export declare const DEFAULT_MODEL_3D: {
2
+ type: "model_3d";
3
+ uri: string;
4
+ asset_id: null;
5
+ data: null;
6
+ metadata: null;
7
+ };
8
+ export declare const DEFAULT_FOLDER: {
9
+ type: "folder";
10
+ uri: string;
11
+ asset_id: null;
12
+ data: null;
13
+ metadata: null;
14
+ };
15
+ export declare const DEFAULT_IMAGE: {
16
+ type: "image";
17
+ uri: string;
18
+ asset_id: null;
19
+ data: null;
20
+ metadata: null;
21
+ };
22
+ export declare const DEFAULT_TEXT_TO_3D_MODEL: {
23
+ type: string;
24
+ provider: string;
25
+ id: string;
26
+ name: string;
27
+ };
28
+ export declare const DEFAULT_IMAGE_TO_3D_MODEL: {
29
+ type: string;
30
+ provider: string;
31
+ id: string;
32
+ name: string;
33
+ };
34
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/nodes/model3d/defaults.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,gBAAgB;;;;;;CAI3B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;CAAwB,CAAC;AAEpD,eAAO,MAAM,aAAa;;;;;;CAAuB,CAAC;AAElD,eAAO,MAAM,wBAAwB;;;;;CAKpC,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;CAKrC,CAAC"}
@@ -0,0 +1,28 @@
1
+ const makeDefault = (type, extra = {}) => ({
2
+ type,
3
+ uri: "",
4
+ asset_id: null,
5
+ data: null,
6
+ metadata: null,
7
+ ...extra
8
+ });
9
+ export const DEFAULT_MODEL_3D = makeDefault("model_3d", {
10
+ format: null,
11
+ material_file: null,
12
+ texture_files: []
13
+ });
14
+ export const DEFAULT_FOLDER = makeDefault("folder");
15
+ export const DEFAULT_IMAGE = makeDefault("image");
16
+ export const DEFAULT_TEXT_TO_3D_MODEL = {
17
+ type: "model_3d_model",
18
+ provider: "meshy",
19
+ id: "meshy-4",
20
+ name: "Meshy-4 Text-to-3D"
21
+ };
22
+ export const DEFAULT_IMAGE_TO_3D_MODEL = {
23
+ type: "model_3d_model",
24
+ provider: "meshy",
25
+ id: "meshy-4-image",
26
+ name: "Meshy-4 Image-to-3D"
27
+ };
28
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/nodes/model3d/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,CAClB,IAAO,EACP,QAAiC,EAAE,EACnC,EAAE,CAAC,CAAC;IACJ,IAAI;IACJ,GAAG,EAAE,EAAE;IACP,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;IACd,GAAG,KAAK;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,EAAE;IACtD,MAAM,EAAE,IAAI;IACZ,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,EAAE;CAClB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,OAAO;IACjB,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,oBAAoB;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,OAAO;IACjB,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,qBAAqB;CAC5B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function convertGlbToGltf(bytes: Uint8Array): Promise<Uint8Array>;
2
+ export declare function decimateGlb(bytes: Uint8Array, targetRatio: number): Promise<Uint8Array>;
3
+ export declare function mergeGlbModels(modelsBytesList: Uint8Array[]): Promise<Uint8Array>;
4
+ //# sourceMappingURL=document-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-ops.d.ts","sourceRoot":"","sources":["../../../src/nodes/model3d/document-ops.ts"],"names":[],"mappings":"AAgBA,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAU7E;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAED,wBAAsB,cAAc,CAAC,eAAe,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAYvF"}
@@ -0,0 +1,40 @@
1
+ import { NodeIO } from "@gltf-transform/core";
2
+ import { mergeDocuments, simplify, unpartition, weld } from "@gltf-transform/functions";
3
+ import { MeshoptSimplifier } from "meshoptimizer";
4
+ import { embedJsonResourceUris } from "./utils.js";
5
+ const gltfIo = new NodeIO();
6
+ export async function convertGlbToGltf(bytes) {
7
+ const document = await gltfIo.readBinary(bytes);
8
+ const jsonDocument = await gltfIo.writeJSON(document);
9
+ const json = JSON.parse(JSON.stringify(jsonDocument.json));
10
+ embedJsonResourceUris(json.buffers, jsonDocument.resources);
11
+ embedJsonResourceUris(json.images, jsonDocument.resources);
12
+ return new TextEncoder().encode(JSON.stringify(json));
13
+ }
14
+ export async function decimateGlb(bytes, targetRatio) {
15
+ const document = await gltfIo.readBinary(bytes);
16
+ const ratio = Math.max(0.01, Math.min(1, targetRatio));
17
+ if (ratio >= 1) {
18
+ return bytes;
19
+ }
20
+ await MeshoptSimplifier.ready;
21
+ await document.transform(weld({}), simplify({
22
+ simplifier: MeshoptSimplifier,
23
+ ratio,
24
+ error: 0.01
25
+ }));
26
+ return gltfIo.writeBinary(document);
27
+ }
28
+ export async function mergeGlbModels(modelsBytesList) {
29
+ const [first, ...rest] = modelsBytesList;
30
+ if (!first)
31
+ return new Uint8Array(0);
32
+ const target = await gltfIo.readBinary(first);
33
+ for (const bytes of rest) {
34
+ const source = await gltfIo.readBinary(bytes);
35
+ mergeDocuments(target, source);
36
+ }
37
+ await target.transform(unpartition());
38
+ return gltfIo.writeBinary(target);
39
+ }
40
+ //# sourceMappingURL=document-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-ops.js","sourceRoot":"","sources":["../../../src/nodes/model3d/document-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EACL,cAAc,EACd,QAAQ,EACR,WAAW,EACX,IAAI,EACL,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,OAAO,EACL,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAiB;IACtD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAGxD,CAAC;IACF,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5D,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAiB,EACjB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IAEvD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,iBAAiB,CAAC,KAAK,CAAC;IAC9B,MAAM,QAAQ,CAAC,SAAS,CACtB,IAAI,CAAC,EAAE,CAAC,EACR,QAAQ,CAAC;QACP,UAAU,EAAE,iBAAiB;QAC7B,KAAK;QACL,KAAK,EAAE,IAAI;KACZ,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,eAA6B;IAChE,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,eAAe,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9C,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { BaseNode } from "@nodetool-ai/node-sdk";
2
+ import type { ProcessingContext } from "@nodetool-ai/runtime";
3
+ export declare class TextTo3DNode extends BaseNode {
4
+ static readonly nodeType = "nodetool.model3d.TextTo3D";
5
+ static readonly title = "Text To 3D";
6
+ static readonly description = "Generate 3D models from text prompts using AI providers (Meshy, Rodin).\n 3d, generation, AI, text-to-3d, t3d, mesh, create\n\n Use cases:\n - Create 3D models from text descriptions\n - Generate game assets from prompts\n - Prototype 3D concepts quickly\n - Create 3D content for AR/VR";
7
+ static readonly metadataOutputTypes: {
8
+ output: string;
9
+ };
10
+ static readonly basicFields: string[];
11
+ static readonly exposeAsTool = true;
12
+ model: any;
13
+ prompt: any;
14
+ negative_prompt: any;
15
+ art_style: any;
16
+ output_format: any;
17
+ enable_textures: any;
18
+ seed: any;
19
+ timeout_seconds: any;
20
+ process(context?: ProcessingContext): Promise<Record<string, unknown>>;
21
+ }
22
+ export declare class ImageTo3DNode extends BaseNode {
23
+ static readonly nodeType = "nodetool.model3d.ImageTo3D";
24
+ static readonly title = "Image To 3D";
25
+ static readonly description = "Generate 3D models from images using AI providers (Meshy, Rodin).\n 3d, generation, AI, image-to-3d, i3d, mesh, reconstruction\n\n Use cases:\n - Convert product photos to 3D models\n - Create 3D assets from concept art\n - Generate 3D characters from drawings\n - Reconstruct objects from images";
26
+ static readonly metadataOutputTypes: {
27
+ output: string;
28
+ };
29
+ static readonly basicFields: string[];
30
+ static readonly exposeAsTool = true;
31
+ model: any;
32
+ image: any;
33
+ prompt: any;
34
+ output_format: any;
35
+ seed: any;
36
+ timeout_seconds: any;
37
+ process(context?: ProcessingContext): Promise<Record<string, unknown>>;
38
+ }
39
+ //# sourceMappingURL=generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../../../src/nodes/model3d/generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA8E9D,qBAAa,YAAa,SAAQ,QAAQ;IACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,+BAA+B;IACvD,MAAM,CAAC,QAAQ,CAAC,KAAK,gBAAgB;IACrC,MAAM,CAAC,QAAQ,CAAC,WAAW,sTAC0R;IACrT,MAAM,CAAC,QAAQ,CAAC,mBAAmB;;MAEjC;IACF,MAAM,CAAC,QAAQ,CAAC,WAAW,WAAmE;IAC9F,MAAM,CAAC,QAAQ,CAAC,YAAY,QAAQ;IAQ5B,KAAK,EAAE,GAAG,CAAC;IAGX,MAAM,EAAE,GAAG,CAAC;IAGZ,eAAe,EAAE,GAAG,CAAC;IAGrB,SAAS,EAAE,GAAG,CAAC;IAGf,aAAa,EAAE,GAAG,CAAC;IAGnB,eAAe,EAAE,GAAG,CAAC;IAGrB,IAAI,EAAE,GAAG,CAAC;IAGV,eAAe,EAAE,GAAG,CAAC;IAEvB,OAAO,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CA0B7E;AAED,qBAAa,aAAc,SAAQ,QAAQ;IACzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,gCAAgC;IACxD,MAAM,CAAC,QAAQ,CAAC,KAAK,iBAAiB;IACtC,MAAM,CAAC,QAAQ,CAAC,WAAW,gUACoS;IAC/T,MAAM,CAAC,QAAQ,CAAC,mBAAmB;;MAEjC;IACF,MAAM,CAAC,QAAQ,CAAC,WAAW,WAA+C;IAC1E,MAAM,CAAC,QAAQ,CAAC,YAAY,QAAQ;IAQ5B,KAAK,EAAE,GAAG,CAAC;IAGX,KAAK,EAAE,GAAG,CAAC;IAGX,MAAM,EAAE,GAAG,CAAC;IAGZ,aAAa,EAAE,GAAG,CAAC;IAGnB,IAAI,EAAE,GAAG,CAAC;IAGV,eAAe,EAAE,GAAG,CAAC;IAEvB,OAAO,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAwB7E"}