@faicad/faijs 0.29.5 → 0.30.9

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 (582) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +0 -2
  7. package/dist/api/appearance.d.ts.map +1 -1
  8. package/dist/api/appearance.js +0 -2
  9. package/dist/api/appearance.js.map +1 -1
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/index.d.ts +15 -6
  257. package/dist/api/index.d.ts.map +1 -1
  258. package/dist/api/index.js +29 -8
  259. package/dist/api/index.js.map +1 -1
  260. package/dist/api/internal/compat-op.d.ts +4 -30
  261. package/dist/api/internal/compat-op.d.ts.map +1 -1
  262. package/dist/api/internal/compat-op.js +10 -42
  263. package/dist/api/internal/compat-op.js.map +1 -1
  264. package/dist/api/internal/compat-projection.d.ts +5 -5
  265. package/dist/api/internal/compat-projection.js +5 -5
  266. package/dist/api/internal/compat-projection.js.map +1 -1
  267. package/dist/api/internal/dual-form-args.d.ts +0 -2
  268. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  269. package/dist/api/internal/dual-form-args.js +1 -3
  270. package/dist/api/internal/dual-form-args.js.map +1 -1
  271. package/dist/api/internal/l3-bridge.d.ts +5 -37
  272. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  273. package/dist/api/internal/l3-bridge.js +7 -76
  274. package/dist/api/internal/l3-bridge.js.map +1 -1
  275. package/dist/api/internal/profile-wire.d.ts +1 -1
  276. package/dist/api/internal/profile-wire.js +1 -1
  277. package/dist/api/internal/profile-wire.js.map +1 -1
  278. package/dist/api/internal/result-unwrap.d.ts +4 -6
  279. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  280. package/dist/api/internal/result-unwrap.js +4 -6
  281. package/dist/api/internal/result-unwrap.js.map +1 -1
  282. package/dist/api/knurl.d.ts.map +1 -1
  283. package/dist/api/knurl.js +5 -3
  284. package/dist/api/knurl.js.map +1 -1
  285. package/dist/api/loft.d.ts +2 -2
  286. package/dist/api/loft.d.ts.map +1 -1
  287. package/dist/api/loft.js +2 -2
  288. package/dist/api/loft.js.map +1 -1
  289. package/dist/api/measurement/index.d.ts +3 -3
  290. package/dist/api/measurement/index.js +3 -3
  291. package/dist/api/measurement/index.js.map +1 -1
  292. package/dist/api/meta.d.ts +0 -2
  293. package/dist/api/meta.d.ts.map +1 -1
  294. package/dist/api/meta.js +0 -2
  295. package/dist/api/meta.js.map +1 -1
  296. package/dist/api/offset2d.d.ts +49 -0
  297. package/dist/api/offset2d.d.ts.map +1 -0
  298. package/dist/api/offset2d.js +86 -0
  299. package/dist/api/offset2d.js.map +1 -0
  300. package/dist/api/pattern.js +3 -3
  301. package/dist/api/pattern.js.map +1 -1
  302. package/dist/api/primitives.d.ts.map +1 -1
  303. package/dist/api/primitives.js +7 -6
  304. package/dist/api/primitives.js.map +1 -1
  305. package/dist/api/replicate.d.ts +2 -2
  306. package/dist/api/replicate.d.ts.map +1 -1
  307. package/dist/api/replicate.js +12 -12
  308. package/dist/api/replicate.js.map +1 -1
  309. package/dist/api/result.d.ts +1 -1
  310. package/dist/api/result.js +1 -1
  311. package/dist/api/result.js.map +1 -1
  312. package/dist/api/revolve.d.ts +2 -2
  313. package/dist/api/revolve.js +3 -3
  314. package/dist/api/revolve.js.map +1 -1
  315. package/dist/api/screw.d.ts +1 -1
  316. package/dist/api/screw.d.ts.map +1 -1
  317. package/dist/api/screw.js +5 -4
  318. package/dist/api/screw.js.map +1 -1
  319. package/dist/api/sdf.d.ts.map +1 -1
  320. package/dist/api/sdf.js +3 -2
  321. package/dist/api/sdf.js.map +1 -1
  322. package/dist/api/shape-type/index.d.ts +141 -0
  323. package/dist/api/shape-type/index.d.ts.map +1 -0
  324. package/dist/api/shape-type/index.js +182 -0
  325. package/dist/api/shape-type/index.js.map +1 -0
  326. package/dist/api/shell.d.ts +2 -2
  327. package/dist/api/shell.js +2 -2
  328. package/dist/api/shell.js.map +1 -1
  329. package/dist/api/solid-from-faces.d.ts +45 -0
  330. package/dist/api/solid-from-faces.d.ts.map +1 -0
  331. package/dist/api/solid-from-faces.js +72 -0
  332. package/dist/api/solid-from-faces.js.map +1 -0
  333. package/dist/api/solid-offset/index.d.ts +67 -0
  334. package/dist/api/solid-offset/index.d.ts.map +1 -0
  335. package/dist/api/solid-offset/index.js +132 -0
  336. package/dist/api/solid-offset/index.js.map +1 -0
  337. package/dist/api/surface/arg-spec.d.ts +35 -33
  338. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  339. package/dist/api/surface/arg-spec.js +222 -224
  340. package/dist/api/surface/arg-spec.js.map +1 -1
  341. package/dist/api/surface-face/index.d.ts +104 -0
  342. package/dist/api/surface-face/index.d.ts.map +1 -0
  343. package/dist/api/surface-face/index.js +217 -0
  344. package/dist/api/surface-face/index.js.map +1 -0
  345. package/dist/api/surface.d.ts +44 -0
  346. package/dist/api/surface.d.ts.map +1 -0
  347. package/dist/api/surface.js +66 -0
  348. package/dist/api/surface.js.map +1 -0
  349. package/dist/api/sweep.d.ts +59 -9
  350. package/dist/api/sweep.d.ts.map +1 -1
  351. package/dist/api/sweep.js +11 -6
  352. package/dist/api/sweep.js.map +1 -1
  353. package/dist/api/thicken.d.ts +1 -1
  354. package/dist/api/thicken.js +1 -1
  355. package/dist/api/thicken.js.map +1 -1
  356. package/dist/api/transform.d.ts +5 -5
  357. package/dist/api/transform.d.ts.map +1 -1
  358. package/dist/api/transform.js +11 -10
  359. package/dist/api/transform.js.map +1 -1
  360. package/dist/api/view/cameraFns.d.ts +1 -1
  361. package/dist/api/view/cameraFns.d.ts.map +1 -1
  362. package/dist/api/view/cameraFns.js +1 -1
  363. package/dist/api/view/cameraFns.js.map +1 -1
  364. package/dist/api/view/index.d.ts +0 -2
  365. package/dist/api/view/index.d.ts.map +1 -1
  366. package/dist/api/view/index.js +0 -2
  367. package/dist/api/view/index.js.map +1 -1
  368. package/dist/api/view/projectionPlanes.d.ts +1 -1
  369. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  370. package/dist/api/view/projectionPlanes.js.map +1 -1
  371. package/dist/api/view/view-camera.d.ts +7 -9
  372. package/dist/api/view/view-camera.d.ts.map +1 -1
  373. package/dist/api/view/view-camera.js +4 -6
  374. package/dist/api/view/view-camera.js.map +1 -1
  375. package/dist/api/view/view-projection.d.ts +0 -2
  376. package/dist/api/view/view-projection.d.ts.map +1 -1
  377. package/dist/api/view/view-projection.js +0 -2
  378. package/dist/api/view/view-projection.js.map +1 -1
  379. package/dist/api/view/view-sheet.d.ts +0 -2
  380. package/dist/api/view/view-sheet.d.ts.map +1 -1
  381. package/dist/api/view/view-sheet.js +0 -2
  382. package/dist/api/view/view-sheet.js.map +1 -1
  383. package/dist/api/view-export/index.d.ts +97 -0
  384. package/dist/api/view-export/index.d.ts.map +1 -0
  385. package/dist/api/view-export/index.js +118 -0
  386. package/dist/api/view-export/index.js.map +1 -0
  387. package/dist/brep/brep-ops.d.ts +89 -1
  388. package/dist/brep/brep-ops.d.ts.map +1 -1
  389. package/dist/brep/brep-ops.js +176 -10
  390. package/dist/brep/brep-ops.js.map +1 -1
  391. package/dist/brep/brep-topology.d.ts +20 -0
  392. package/dist/brep/brep-topology.d.ts.map +1 -1
  393. package/dist/brep/brep-topology.js +46 -0
  394. package/dist/brep/brep-topology.js.map +1 -1
  395. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  396. package/dist/brep/engine/adapters/occt.js +7 -7
  397. package/dist/brep/engine/adapters/occt.js.map +1 -1
  398. package/dist/brep/engine/primitives.d.ts +2 -3
  399. package/dist/brep/engine/primitives.d.ts.map +1 -1
  400. package/dist/brep/engine/primitives.js +1 -2
  401. package/dist/brep/engine/primitives.js.map +1 -1
  402. package/dist/brep/engine/registry.d.ts +1 -1
  403. package/dist/brep/engine/registry.js +1 -1
  404. package/dist/brep/engine/registry.js.map +1 -1
  405. package/dist/brep/engine/types.d.ts +2 -2
  406. package/dist/brep/engine/types.js.map +1 -1
  407. package/dist/brep/handle-bridge.d.ts +2 -2
  408. package/dist/brep/handle-bridge.js +2 -2
  409. package/dist/brep/handle-bridge.js.map +1 -1
  410. package/dist/brep/index.d.ts +6 -3
  411. package/dist/brep/index.d.ts.map +1 -1
  412. package/dist/brep/index.js +6 -3
  413. package/dist/brep/index.js.map +1 -1
  414. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  415. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  416. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  417. package/dist/browser.d.ts +2 -2
  418. package/dist/browser.d.ts.map +1 -1
  419. package/dist/browser.js +5 -4
  420. package/dist/browser.js.map +1 -1
  421. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  422. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  423. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  424. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  425. package/dist/cad-runtime/backend-dispatch.js +12 -3
  426. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  427. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  428. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  429. package/dist/cad-runtime/direct-executor.js +31 -9
  430. package/dist/cad-runtime/direct-executor.js.map +1 -1
  431. package/dist/cad-runtime/interp/env.d.ts +1 -1
  432. package/dist/cad-runtime/interp/env.js.map +1 -1
  433. package/dist/cad-runtime/lib-id.d.ts +0 -2
  434. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  435. package/dist/cad-runtime/lib-id.js +0 -2
  436. package/dist/cad-runtime/lib-id.js.map +1 -1
  437. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  438. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  439. package/dist/cad-runtime/live-shapes.js +8 -10
  440. package/dist/cad-runtime/live-shapes.js.map +1 -1
  441. package/dist/cad-runtime/ports.d.ts +3 -3
  442. package/dist/cad-runtime/ports.js.map +1 -1
  443. package/dist/cad-runtime/runtime.d.ts +21 -7
  444. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  445. package/dist/cad-runtime/runtime.js +45 -6
  446. package/dist/cad-runtime/runtime.js.map +1 -1
  447. package/dist/define-op.d.ts +4 -3
  448. package/dist/define-op.d.ts.map +1 -1
  449. package/dist/define-op.js +2 -2
  450. package/dist/define-op.js.map +1 -1
  451. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  452. package/dist/geometry2d/bridge/plane.js +1 -1
  453. package/dist/geometry2d/bridge/plane.js.map +1 -1
  454. package/dist/geometry2d/curve2d.d.ts +1 -1
  455. package/dist/geometry2d/curve2d.js +1 -1
  456. package/dist/geometry2d/curve2d.js.map +1 -1
  457. package/dist/index.d.ts +1 -1
  458. package/dist/index.d.ts.map +1 -1
  459. package/dist/index.js +10 -4
  460. package/dist/index.js.map +1 -1
  461. package/dist/io/fai-zip/container-read.d.ts +16 -0
  462. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  463. package/dist/io/fai-zip/container-read.js +22 -0
  464. package/dist/io/fai-zip/container-read.js.map +1 -1
  465. package/dist/io/fai-zip/index.d.ts +1 -1
  466. package/dist/io/fai-zip/index.d.ts.map +1 -1
  467. package/dist/io/fai-zip/index.js +1 -1
  468. package/dist/io/fai-zip/index.js.map +1 -1
  469. package/dist/lang/code-to-args.d.ts.map +1 -1
  470. package/dist/lang/code-to-args.js +10 -1
  471. package/dist/lang/code-to-args.js.map +1 -1
  472. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  473. package/dist/lang/determinism-scanner.js +22 -9
  474. package/dist/lang/determinism-scanner.js.map +1 -1
  475. package/dist/lang/metadata-extractor.d.ts +27 -6
  476. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  477. package/dist/lang/metadata-extractor.js +88 -8
  478. package/dist/lang/metadata-extractor.js.map +1 -1
  479. package/dist/lang/parse-error.d.ts +4 -0
  480. package/dist/lang/parse-error.d.ts.map +1 -1
  481. package/dist/lang/parse-error.js.map +1 -1
  482. package/dist/lang/security-scanner.d.ts +27 -2
  483. package/dist/lang/security-scanner.d.ts.map +1 -1
  484. package/dist/lang/security-scanner.js +29 -2
  485. package/dist/lang/security-scanner.js.map +1 -1
  486. package/dist/lang/source-edit.d.ts +2 -2
  487. package/dist/lang/source-edit.js.map +1 -1
  488. package/dist/lang/symbol-table.generated.d.ts +36 -0
  489. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  490. package/dist/lang/symbol-table.generated.js +36 -0
  491. package/dist/lang/symbol-table.generated.js.map +1 -1
  492. package/dist/mesh/import-model.d.ts +94 -0
  493. package/dist/mesh/import-model.d.ts.map +1 -0
  494. package/dist/mesh/import-model.js +15 -0
  495. package/dist/mesh/import-model.js.map +1 -0
  496. package/dist/mesh/index.d.ts +19 -58
  497. package/dist/mesh/index.d.ts.map +1 -1
  498. package/dist/mesh/index.js +19 -70
  499. package/dist/mesh/index.js.map +1 -1
  500. package/dist/mesh/io.d.ts +33 -16
  501. package/dist/mesh/io.d.ts.map +1 -1
  502. package/dist/mesh/io.js +144 -39
  503. package/dist/mesh/io.js.map +1 -1
  504. package/dist/mesh/primitives.js +1 -1
  505. package/dist/mesh/primitives.js.map +1 -1
  506. package/dist/mesh/threemf-bambu.d.ts +12 -1
  507. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  508. package/dist/mesh/threemf-bambu.js +68 -16
  509. package/dist/mesh/threemf-bambu.js.map +1 -1
  510. package/dist/mesh/threemf-loader.d.ts +14 -1
  511. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  512. package/dist/mesh/threemf-loader.js +24 -7
  513. package/dist/mesh/threemf-loader.js.map +1 -1
  514. package/dist/mesh/transform.d.ts +1 -1
  515. package/dist/mesh/transform.js +1 -1
  516. package/dist/mesh/transform.js.map +1 -1
  517. package/dist/mesh/types.d.ts +5 -5
  518. package/dist/mesh/types.d.ts.map +1 -1
  519. package/dist/mesh/types.js.map +1 -1
  520. package/dist/node-host/cli.d.ts +49 -1
  521. package/dist/node-host/cli.d.ts.map +1 -1
  522. package/dist/node-host/cli.js +125 -19
  523. package/dist/node-host/cli.js.map +1 -1
  524. package/dist/node-host/execute-script.d.ts +55 -0
  525. package/dist/node-host/execute-script.d.ts.map +1 -0
  526. package/dist/node-host/execute-script.js +46 -0
  527. package/dist/node-host/execute-script.js.map +1 -0
  528. package/dist/node.d.ts +2 -0
  529. package/dist/node.d.ts.map +1 -1
  530. package/dist/node.js +3 -0
  531. package/dist/node.js.map +1 -1
  532. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  533. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  534. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  535. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  536. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  537. package/dist/occt-kernel/hullGeometry.js +2 -3
  538. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  539. package/dist/occt-kernel/hullOps.d.ts +3 -3
  540. package/dist/occt-kernel/hullOps.js +4 -4
  541. package/dist/occt-kernel/hullOps.js.map +1 -1
  542. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  543. package/dist/occt-kernel/occt-primitives.js +31 -4
  544. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  545. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  546. package/dist/occt-kernel/occtKernel.js +18 -0
  547. package/dist/occt-kernel/occtKernel.js.map +1 -1
  548. package/dist/occt-scan/recognize.d.ts +58 -0
  549. package/dist/occt-scan/recognize.d.ts.map +1 -0
  550. package/dist/occt-scan/recognize.js +216 -0
  551. package/dist/occt-scan/recognize.js.map +1 -0
  552. package/dist/primitives/brep-primitives.js +7 -7
  553. package/dist/primitives/brep-primitives.js.map +1 -1
  554. package/dist/result/bug.d.ts +1 -1
  555. package/dist/result/bug.js +1 -1
  556. package/dist/result/bug.js.map +1 -1
  557. package/dist/result/errors.d.ts +2 -2
  558. package/dist/result/errors.d.ts.map +1 -1
  559. package/dist/result/errors.js +1 -1
  560. package/dist/result/errors.js.map +1 -1
  561. package/dist/result/vec3.d.ts +1 -1
  562. package/dist/result/vec3.js +1 -1
  563. package/dist/result/vec3.js.map +1 -1
  564. package/dist/runtime-state.d.ts +16 -0
  565. package/dist/runtime-state.d.ts.map +1 -1
  566. package/dist/runtime-state.js +27 -0
  567. package/dist/runtime-state.js.map +1 -1
  568. package/dist/script-globals.d.ts +24 -0
  569. package/dist/script-globals.d.ts.map +1 -0
  570. package/dist/script-globals.js +24 -0
  571. package/dist/script-globals.js.map +1 -0
  572. package/dist/shape.d.ts +24 -0
  573. package/dist/shape.d.ts.map +1 -1
  574. package/dist/shape.js +40 -0
  575. package/dist/shape.js.map +1 -1
  576. package/dist/topology/naming/lineage.d.ts +3 -2
  577. package/dist/topology/naming/lineage.d.ts.map +1 -1
  578. package/dist/topology/naming/lineage.js.map +1 -1
  579. package/dist/weapp.d.ts +1 -1
  580. package/dist/weapp.js +1 -1
  581. package/dist/weapp.js.map +1 -1
  582. package/package.json +8 -10
@@ -26,6 +26,7 @@
26
26
  * static-import guard keeps passing.
27
27
  */
28
28
  import { type BrepCapabilityName } from './cad-runtime/backend-dispatch.js';
29
+ import { type CompoundShape } from './shape.js';
29
30
  import { type SlotMap } from './api/internal/dual-form-args.js';
30
31
  import { type ResultLike } from './api/internal/result-unwrap.js';
31
32
  import type { Shape } from './mesh/types.js';
@@ -65,7 +66,7 @@ export declare function isGeometryInput(v: unknown): v is Shape;
65
66
  * several defineOps within one statement, and only the first one must register.
66
67
  */
67
68
  /** Product of a mesh implementation: raw mesh data, a wrapped Shape, or (with `outputs`) a record of named products. */
68
- export type MeshProduct = MeshData | Shape | Record<string, MeshData | Shape>;
69
+ export type MeshProduct = MeshData | Shape | CompoundShape | Record<string, MeshData | Shape | CompoundShape>;
69
70
  /** Mesh implementation: sync or async (api mesh paths are often async); returns a mesh product. */
70
71
  export type MeshImpl<A extends unknown[]> = (...args: A) => MeshProduct | Promise<MeshProduct>;
71
72
  /** BREP implementation result: a raw handle, or a handle plus face evolution. */
@@ -74,7 +75,7 @@ export interface BrepResult {
74
75
  faceEvolution?: Map<number, number[]>;
75
76
  }
76
77
  /** Product of a BREP implementation: a raw handle, { solid, faceEvolution }, a wrapped Shape, or (with `outputs`) a record of named products. */
77
- export type BrepProduct = BrepHandle | BrepResult | Shape | Record<string, BrepHandle | BrepResult | Shape> | ResultLike;
78
+ export type BrepProduct = BrepHandle | BrepResult | Shape | CompoundShape | Record<string, BrepHandle | BrepResult | Shape | CompoundShape> | ResultLike;
78
79
  /** BREP implementation: sync or async; returns a brep product. */
79
80
  export type BrepImpl<A extends unknown[]> = (...args: A) => BrepProduct | Promise<BrepProduct>;
80
81
  /** Optional declaration: capabilities (D5) and named multi-products (split, scheme C). */
@@ -112,7 +113,7 @@ export interface DualOpOptions {
112
113
  schema?: Record<string, string>;
113
114
  /**
114
115
  * D11 slot-map declaration (§4.2): the positional→object boxing table
115
- * (SlotMap) mapping a brepjs-style positional call onto this op's native
116
+ * (SlotMap) mapping a positional call onto this op's native
116
117
  * object form. Ops without it accept only the form their implementation
117
118
  * natively takes.
118
119
  */
@@ -1 +1 @@
1
- {"version":3,"file":"define-op.d.ts","sourceRoot":"","sources":["../src/define-op.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"define-op.d.ts","sourceRoot":"","sources":["../src/define-op.ts"],"names":[],"mappings":"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"}
package/dist/define-op.js CHANGED
@@ -92,7 +92,7 @@ function wrapByKeys(r, keys, wrapOne) {
92
92
  }
93
93
  // Pass through non-shape data keys (e.g. autoHeal's `report`): declared
94
94
  // outputs are the geometry that gets Shape-wrapped, but sibling data products
95
- // of the same op result must survive the statement boundary (§5.4 selfhost).
95
+ // of the same op result must survive the statement boundary (§5.4).
96
96
  for (const k of Object.keys(src)) {
97
97
  if (!keys.includes(k))
98
98
  out[k] = src[k];
@@ -229,7 +229,7 @@ export function defineOp(decl) {
229
229
  // awaits the call, so returning a Promise is transparent.
230
230
  const wrapped = async (...args) => {
231
231
  // D11 (§4.2): faijs-native ops declare an object-form implementation, so a
232
- // brepjs-style positional call is boxed into the object form here — before
232
+ // positional call is boxed into the object form here — before
233
233
  // dispatch, so geometry inputs are collected from the normalized arg list.
234
234
  const callArgs = (meta.slotMap ? positionalToObject(args, meta.slotMap, opLabel(meta)) : args);
235
235
  // Geometry inputs: identity-or-structure auto collection (execution-time
@@ -1 +1 @@
1
- {"version":3,"file":"define-op.js","sourceRoot":"","sources":["../src/define-op.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * define-op — dual-path implementation decorator for geometry functions\n * (D-face contract: mesh mandatory as the default path, BREP optional).\n *\n *\n * `defineOp({ mesh?, brep?, ... })` declares the implementation set of a\n * geometry function (a function whose signature returns `SolidShape`). The\n * wrapper:\n * - auto-collects geometry inputs via `args.filter(isGeometryInput)` — a shape\n * that is identity-registered (`isShape`) or a structural mesh shape\n * (`isMeshShape`, positions + indices — e.g. bare ManifoldMeshData handed in\n * by a host via `geoToManifoldMesh`). The old per-function form passed the\n * actual geometry args (`dispatchPath([input], ...)`), so a bare mesh input\n * dispatched to the mesh path (`hasBrep=false`); the re-collection must keep\n * that compatibility. No `inputs` field — decided at runtime by the args\n * themselves, not the author.\n * - calls the engine's `dispatchPath` to select brep/mesh by mode (static,\n * no runtime fallback);\n * - wraps raw products: mesh path → `solid()`, brep path → `fromHandle()` /\n * `fromBrep()` (D3/D4: products must come from constructors, brep products\n * must carry a BREP slot).\n *\n * Zero heavy runtime dependencies: imports only runtime-state / shape /\n * handle-bridge / backend-dispatch / mesh/types (a zero-import module holding\n * the Shape type and the structural `isMeshShape` guard) — the dist/sdk.js\n * static-import guard keeps passing.\n */\n\nimport { dispatchPath, firstMissingCapability, type BrepCapabilityName } from './cad-runtime/backend-dispatch'\nimport {\n CONTRACT_VERSION,\n BrepUnsupportedError,\n MeshUnsupportedError,\n getCurrentStmt,\n getRuntimeState,\n nameOf,\n} from './runtime-state'\nimport { asStmtId, type PartName } from './identity'\nimport { isShape, solid, fromBrep, getSlot } from './shape'\nimport { isMeshShape } from './mesh/types'\nimport { fromHandle, meshHandle, isOcctHandle } from './brep/handle-bridge'\nimport { positionalToObject, type SlotMap } from './api/internal/dual-form-args'\nimport { toOpFailure, unwrapResult, OpError, type ResultLike } from './api/internal/result-unwrap'\nimport type { Shape } from './mesh/types'\nimport { BREP_ENGINE_IDS, type BrepEngineId, type BrepHandle } from './brep/engine/types'\nimport type { DimName } from './units'\nimport { type Provenance, runtimeLineage } from './topology/naming/lineage'\n\n/** 合法引擎 id 集合(assertLibConforms 的 engines 校验用,D11-1)。 */\nconst BREP_ENGINE_ID_SET = new Set<string>(BREP_ENGINE_IDS)\n\n/** Raw mesh data (structurally identical to Shape; mesh impls return it). */\nexport type MeshData = { positions: Float32Array; indices: Uint32Array }\n\n/**\n * Geometry-input recognition for dispatch auto-collection.\n *\n * Compat rule: the old per-function form passed the *actual* geometry args to\n * `dispatchPath` (`[input]` / `shapes`), so a bare ManifoldMeshData object\n * (e.g. `geoToManifoldMesh` output passed straight by a host) had no BREP slot\n * → `hasBrep=false` → mesh path. defineOp must keep that: an input counts as\n * geometry when it is identity-registered (`isShape`, constructor product) OR\n * structurally a mesh shape (`positions` + `indices`). Params objects and other\n * scalar args are not geometry inputs.\n *\n * @param v - the candidate argument.\n * @returns true when the argument is a geometry input (registered shape or bare mesh data).\n */\nexport function isGeometryInput(v: unknown): v is Shape {\n return isShape(v) || isMeshShape(v)\n}\n\n/**\n * §1.4 registration guard: the StmtId whose top-level `wrapped` is currently\n * registering a lineage node. Nested op calls (an impl invoking another op /\n * itself) share the same `getCurrentStmt()` anchor and are skipped so they\n * don't trip N3 (E_TOPO_DUPLICATE_STMT) with identical content. C1 (single\n * live runtime) means at most one statement registers at a time.\n *\n * The marker lives on the runtime state and is reset at statement boundaries\n * (runtime-state.setCurrentStmt: anchor change / end-of-statement), NOT at op\n * granularity — a TS library function (cq-compat Workplane op, etc.) may call\n * several defineOps within one statement, and only the first one must register.\n */\n\n/** Product of a mesh implementation: raw mesh data, a wrapped Shape, or (with `outputs`) a record of named products. */\nexport type MeshProduct = MeshData | Shape | Record<string, MeshData | Shape>\n\n/** Mesh implementation: sync or async (api mesh paths are often async); returns a mesh product. */\nexport type MeshImpl<A extends unknown[]> = (...args: A) => MeshProduct | Promise<MeshProduct>\n\n/** BREP implementation result: a raw handle, or a handle plus face evolution. */\nexport interface BrepResult {\n solid: BrepHandle\n faceEvolution?: Map<number, number[]>\n}\n\n/** Product of a BREP implementation: a raw handle, { solid, faceEvolution }, a wrapped Shape, or (with `outputs`) a record of named products. */\nexport type BrepProduct =\n | BrepHandle\n | BrepResult\n | Shape\n | Record<string, BrepHandle | BrepResult | Shape>\n | ResultLike\n\n/** BREP implementation: sync or async; returns a brep product. */\nexport type BrepImpl<A extends unknown[]> = (...args: A) => BrepProduct | Promise<BrepProduct>\n\n/** Optional declaration: capabilities (D5) and named multi-products (split, scheme C). */\nexport interface DualOpOptions {\n /** Op name (error messages); falls back to an anonymous prefix when absent. */\n name?: string\n capabilities?: BrepCapabilityName[]\n /**\n * 平台身份声明(D11,narrowing plan 2026-09-24):本 op 实现可运行在哪些\n * BREP 引擎上——一个**引擎白名单**。缺省 = 全平台(中立 op——实现只用 L1 核心面)。\n *\n * 平台 op(实现 import 了 `occt-kernel/*` / `brepkit-kernel/*`,调用该平台\n * 原生方法)**必须**声明 `engines` 自证身份。\n *\n * 与 `capabilities` **可以并存**(2026-09-24 撤销 D11-7 互斥):两者是正交的两轴——\n * `engines` 收窄「在哪些引擎上跑」,`capabilities` 声明「需要哪些内核能力」。判定\n * 次序 `engines` 在先(D11-2),能力门随后对同一引擎继续求交,故同时声明等于\n * 「只在这些引擎上,且要求这些能力」——不会静默放行\"目标引擎缺该能力\"的组合。\n */\n engines?: readonly BrepEngineId[]\n /**\n * 网格实体路径的引擎要求(方案 2026-10-01 §3.4):本 op 的 mesh 实现**能接受\n * 网格实体输入**的前提是「当前装配的网格后端 id 在此名单内」。\n *\n * 缺省 = `['manifold']`:mesh 实现跑在内置 `mesh/`(manifold CSG)上,它不认识\n * 网格实体——拿网格实体喂它必须在**执行前**静态报错\n * (`E_MESH_SOLID_UNSUPPORTED`),绝不运行时改走别的后端。\n *\n * 与 `engines` 正交:`engines` 收窄的是 **BREP 引擎**身份,本字段收窄的是\n * **网格后端**身份(同一个 op 可以\"BREP 走 occt、网格实体走 brepkit\")。\n */\n meshEngines?: readonly string[]\n outputs?: string[]\n /** L3 schema per named parameter (G1 codegen + UI panel, plain string form). */\n schema?: Record<string, string>\n /**\n * D11 slot-map declaration (§4.2): the positional→object boxing table\n * (SlotMap) mapping a brepjs-style positional call onto this op's native\n * object form. Ops without it accept only the form their implementation\n * natively takes.\n */\n slotMap?: SlotMap\n /**\n * Topology identity provenance (plan §4.4 / Phase 2.3, **required**).\n * Declares the op's face-mapping category + new-face vocabulary.\n * The lineage registrar (§4.3) reads this to build the blood-line graph;\n * missing naming = compile-time error (G4: no undeclared ops).\n */\n naming: Provenance\n /**\n * Script-side dimension declaration (unit-system D8): per-parameter dim for\n * the static `dimension` check stage. Params absent here are treated as\n * dimensionless and exempt from the check. `DimName` is a pure type import.\n */\n paramDims?: Record<string, DimName>\n /** Return dimension declaration (D8): the value produced carries this dim. */\n retDim?: DimName\n}\n\n/** Implementation set (at least one of mesh/brep is required, D1/D1b); options are siblings of the implementations. */\nexport type DualOpImpls<A extends unknown[]> =\n | (DualOpOptions & { mesh: MeshImpl<A>; brep?: BrepImpl<A> })\n | (DualOpOptions & { mesh?: never; brep: BrepImpl<A> })\n\n/** Metadata hung on the wrapped function object (K5: function info is data). */\nexport interface DualOpMeta {\n kind: 'dual-op'\n mesh?: unknown\n brep?: unknown\n /** Op name (error messages). */\n name?: string\n capabilities?: BrepCapabilityName[]\n /** 平台身份声明(D11,镜像 DualOpOptions.engines)。 */\n engines?: readonly BrepEngineId[]\n /** 网格实体路径的引擎要求(镜像 DualOpOptions.meshEngines;缺省 = `['manifold']`)。 */\n meshEngines?: readonly string[]\n outputs?: string[]\n schema?: Record<string, string>\n /** D11 slot-map declaration (positional → object boxing table, §9 naming). */\n slotMap?: SlotMap\n /** Topology identity provenance (Phase 2.3, mirrors DualOpOptions.naming). */\n naming: Provenance\n /** Script-side dimension declaration (D8, mirrors DualOpOptions.paramDims). */\n paramDims?: Record<string, DimName>\n /** Return dimension declaration (D8). */\n retDim?: DimName\n}\n\n/** Property key carrying DualOpMeta on wrapped functions. */\nexport const DUAL_OP_META = '__faijs__dualOp'\n\ntype MetaCarrier = { [DUAL_OP_META]?: DualOpMeta }\n\nfunction wrapMeshOne(v: unknown): Shape {\n if (isShape(v)) return v\n return solid(v as MeshData)\n}\n\nfunction wrapBrepOne(v: unknown): Shape {\n if (isShape(v)) return v\n if (v !== null && typeof v === 'object' && 'faceEvolution' in v) {\n const res = v as BrepResult\n return fromBrep(meshHandle(res.solid), res)\n }\n // A plain object that is not a Shape and not an OCCT handle is a data\n // product (e.g. a compat fn returning a sheetmetal-style record), not a\n // geometry handle — pass it through so it lands in the engine's value\n // store instead of being tessellated as if it were a bare handle. Native\n // OCCT handles from an implementation are hand-computed shape numbers\n // (from a branded number return) or objects; only the number path reaches\n // fromHandle. The handle/data distinction must go through the shared\n // isOcctHandle leaf (handle-bridge) — never a hardcoded '__occtWasm' in v.\n if (v !== null && typeof v === 'object' && !isOcctHandle(v)) {\n return v as unknown as Shape\n }\n return fromHandle(v)\n}\n\nfunction wrapByKeys(r: unknown, keys: string[], wrapOne: (v: unknown) => Shape): Record<string, Shape> {\n const src = (r ?? {}) as Record<string, unknown>\n const out: Record<string, Shape> = {}\n for (const k of keys) {\n const v = src[k]\n // An output may be an array (e.g. the compat adapter adopts each element of\n // an array-valued `outputs` field); wrap element-wise so arrays stay arrays.\n out[k] = Array.isArray(v) ? (v.map(wrapOne) as unknown as Shape) : wrapOne(v)\n }\n // Pass through non-shape data keys (e.g. autoHeal's `report`): declared\n // outputs are the geometry that gets Shape-wrapped, but sibling data products\n // of the same op result must survive the statement boundary (§5.4 selfhost).\n for (const k of Object.keys(src)) {\n if (!keys.includes(k)) out[k] = src[k] as unknown as Shape\n }\n return out\n}\n\n/**\n * 外观继承(设计文档 2026-10-05 v2 §6.1):几何 op 返回新 Shape 时,默认继承\n * 第一个携带外观的几何输入(`inputs.find(appearance !== undefined)`);产物\n * 已有外观则不动(后置 setColor 优先)。实现集中在产物包装点,避免每个 op\n * 手写——mesh 与 brep 两条路径的产物都经此补齐。\n */\nfunction inheritInputAppearance(out: Shape | Record<string, Shape>, inputs: Shape[]): void {\n const src = inputs.find((i) => i.appearance !== undefined)\n if (!src?.appearance) return\n const setIfEmpty = (v: unknown): void => {\n if (v !== null && typeof v === 'object' && 'positions' in v && !(v as Shape).appearance) {\n ;(v as Shape).appearance = src.appearance\n }\n }\n if (isShape(out)) {\n setIfEmpty(out)\n return\n }\n for (const k of Object.keys(out)) {\n const v = out[k]\n if (Array.isArray(v)) (v as unknown[]).forEach(setIfEmpty)\n else setIfEmpty(v)\n }\n}\n\n/**\n * 元数据继承(设计文档 2026-10-05-meta §2 ③):几何 op 返回新 Shape 时,默认\n * 继承第一个携带 meta 的几何输入(`inputs.find(meta !== undefined)`),对象引用\n * 共享;产物已有 meta 则不动(后置 setName 优先)。实现集中在产物包装点,mesh\n * 与 brep 两条路径的产物都经此补齐。名称是显式声明,继承只是保底——需要新名的\n * 产物(组合/变换后)由用户显式 `setName` 覆盖。\n */\nfunction inheritInputMeta(out: Shape | Record<string, Shape>, inputs: Shape[]): void {\n const src = inputs.find((i) => i.meta !== undefined)\n if (!src?.meta) return\n const setIfEmpty = (v: unknown): void => {\n if (v !== null && typeof v === 'object' && 'positions' in v && !(v as Shape).meta) {\n ;(v as Shape).meta = src.meta\n }\n }\n if (isShape(out)) {\n setIfEmpty(out)\n return\n }\n for (const k of Object.keys(out)) {\n const v = out[k]\n if (Array.isArray(v)) (v as unknown[]).forEach(setIfEmpty)\n else setIfEmpty(v)\n }\n}\n\n/** Human-readable op label for error messages (falls back when unnamed). */\nfunction opLabel(meta: DualOpMeta): string {\n return meta.name ?? '<anon>'\n}\n\n/**\n * Run one implementation through the unified Result boundary (§5.2, D1).\n *\n * Transition contract: an implementation may\n * ① return a `Result` → unwrapped here (`err` becomes a throw);\n * ② throw → normalized into an op-labelled error;\n * ③ return a plain product → passed through untouched.\n *\n * The two engine-level routing errors keep their class: `runtime.ts` matches\n * `BrepUnsupportedError` / `MeshUnsupportedError` by `instanceof` to turn them\n * into `ExecutionResult.failedAt`, so they must not be re-wrapped.\n *\n * @param meta - the op's metadata (name).\n * @param impl - the implementation to run.\n * @param args - the normalized argument list.\n * @returns the (unwrapped) implementation product.\n */\nasync function runImpl(\n meta: DualOpMeta,\n impl: ((...a: unknown[]) => unknown) | undefined,\n args: unknown[],\n): Promise<unknown> {\n const label = opLabel(meta)\n let product: unknown\n try {\n product = await (impl as (...a: unknown[]) => unknown)(...args)\n } catch (e) {\n if (e instanceof BrepUnsupportedError || e instanceof MeshUnsupportedError) throw e\n // An OpError is already the engine-recognizable statement failure (thrown\n // by the compat adapter's Result unwrap, or by impls returning a Result);\n // re-wrapping it into a plain Error would make CadRuntime treat it as an\n // uncaught bug instead of a statement failure.\n if (e instanceof OpError) throw e\n throw toOpFailure(label, e)\n }\n return unwrapResult(product, label)\n}\n\n/**\n * Declare a geometry function's dual-path implementation set.\n *\n * At least one implementation (mesh or brep) is required — enforced at\n * compile time by the union type and at construction time by a runtime check.\n * Geometry inputs are auto-collected by identity-or-structure\n * (`args.filter(isGeometryInput)` = `isShape` ∨ `isMeshShape`); raw mesh\n * products are wrapped by `solid()`, raw brep products by\n * `fromHandle()` / `fromBrep()`. `mode` selects the engine path via the\n * engine's static `dispatchPath` — the author never writes an `if (path)`\n * branch.\n *\n * @param decl - the declaration object: implementations `{ mesh }` (mesh-only),\n * `{ brep }` (brep-only, D1b), or `{ mesh, brep }` (dual-path), plus optional\n * `capabilities` (D5: missing capability degrades in auto, errors in brep mode)\n * and `outputs` (named multi-products, e.g. split) as siblings.\n * @returns the wrapped geometry function with dual-op metadata attached.\n */\nexport function defineOp<A extends unknown[]>(\n decl: DualOpImpls<A> & { outputs: string[] },\n): ((...args: A) => Promise<Record<string, Shape>>) & MetaCarrier\n/**\n * Overload without `outputs`: single-product functions resolve to a `Promise<Shape>`.\n * @param decl - the declaration object: implementations `{ mesh }`, `{ brep }`, or `{ mesh, brep }`.\n * @returns the wrapped geometry function with dual-op metadata attached.\n */\nexport function defineOp<A extends unknown[]>(\n decl: DualOpImpls<A>,\n): ((...args: A) => Promise<Shape>) & MetaCarrier\n/** Implementation signature (not visible to callers); matches the union of both overloads. */\nexport function defineOp<A extends unknown[]>(\n decl: DualOpImpls<A>,\n): ((...args: A) => Promise<Shape | Record<string, Shape>>) & MetaCarrier {\n // Construction-time check (②): implementations must be functions, then at\n // least one implementation must be present.\n if (decl.mesh !== undefined && typeof decl.mesh !== 'function') {\n throw new Error('[faijs/defineOp] mesh must be a function')\n }\n if (decl.brep !== undefined && typeof decl.brep !== 'function') {\n throw new Error('[faijs/defineOp] brep must be a function')\n }\n if (typeof decl.mesh !== 'function' && typeof decl.brep !== 'function') {\n throw new Error('[faijs/defineOp] at least one implementation (mesh or brep) is required')\n }\n\n const meta: DualOpMeta = {\n kind: 'dual-op',\n mesh: decl.mesh,\n brep: decl.brep,\n name: decl.name,\n capabilities: decl.capabilities,\n engines: decl.engines,\n meshEngines: decl.meshEngines,\n outputs: decl.outputs,\n schema: decl.schema,\n slotMap: decl.slotMap,\n naming: decl.naming,\n paramDims: decl.paramDims,\n retDim: decl.retDim,\n }\n\n // Async wrapper: implementations may be sync or async (api mesh paths are\n // often async, e.g. drill/engrave/boolean). The compiled .fai.js product always\n // awaits the call, so returning a Promise is transparent.\n const wrapped = async (...args: A): Promise<Shape | Record<string, Shape>> => {\n // D11 (§4.2): faijs-native ops declare an object-form implementation, so a\n // brepjs-style positional call is boxed into the object form here — before\n // dispatch, so geometry inputs are collected from the normalized arg list.\n const callArgs = (\n meta.slotMap ? positionalToObject(args as unknown[], meta.slotMap, opLabel(meta)) : args\n ) as A\n // Geometry inputs: identity-or-structure auto collection (execution-time\n // read, same nature as hasBrep — decided before the implementation runs).\n // Compat: bare ManifoldMeshData args (host geoToManifoldMesh output) are\n // geometry inputs too — old form passed [input] so they reached the mesh path.\n const inputs = (callArgs as unknown[]).filter(isGeometryInput) as Shape[]\n // §1.4 lineage registration (plan §4.3): every top-level dual-op execution\n // records a blood-line node via `runtimeLineage.register`, which enforces\n // N1 (untracked input → throw, never default to chain-root) / N2\n // (stmt↔anchor mismatch) / N3 (conflicting re-register). The graph is\n // cleared per program execution (direct-executor runCode) and C1 guarantees\n // a single live runtime, so the anchor is authoritative inside a statement.\n // Skip when no anchor is set (the op was invoked outside a statement\n // context — there is no lineage to record, and N2 must not fire on a context\n // that legitimately has none).\n //\n // Guard: a statement executes exactly one *top-level* op; an op's\n // implementation may invoke other ops (or itself) internally, and those\n // nested calls share the same `getCurrentStmt()` anchor. They are\n // implementation details, not statements, so they must NOT register a second\n // node under the same StmtId — that would trip N3 (E_TOPO_DUPLICATE_STMT)\n // on identical content. Only the outermost `wrapped` for the current\n // statement registers; the flag below stays set for the *entire* statement\n // execution (including the awaited impl), so nested calls see it and skip.\n const anchor = getCurrentStmt()\n const st = getRuntimeState()\n const isOuter = anchor != null && st.registeredStmtId !== anchor.id\n if (isOuter) st.registeredStmtId = asStmtId(anchor.id)\n try {\n if (isOuter && anchor) {\n runtimeLineage.register(\n {\n stmt: asStmtId(anchor.id),\n op: opLabel(meta),\n inputs,\n outputs: anchor.outputs as [PartName, ...PartName[]],\n provenance: meta.naming,\n },\n {\n nameOf,\n currentStmt: () => {\n const a = getCurrentStmt()\n return a ? { id: a.id } : undefined\n },\n },\n )\n }\n // D5 capability routing: feed the first missing capability to dispatchPath\n // (auto degrades to mesh, brep mode errors). Matched as a concrete name\n // against the engine's declaration set (family booleans + its `evolution`\n // list of *WithHistory kernel function names) — see firstMissingCapability.\n const missing = firstMissingCapability(meta.capabilities)\n const path = dispatchPath(inputs, meta, missing, meta.engines)\n if (path === 'brep') {\n const r = await runImpl(meta, decl.brep as unknown as ((...a: unknown[]) => unknown) | undefined, callArgs)\n const out = meta.outputs ? wrapByKeys(r, meta.outputs, wrapBrepOne) : wrapBrepOne(r)\n inheritInputAppearance(out, inputs)\n inheritInputMeta(out, inputs)\n // 1.10 前置①:执行期把 hash 演化挂到血缘节点(kernel 类回走推进的数据源)。\n // 演化在几何算完那一刻可得(fromBrep → slot.faceEvolution),事后补挂不参与\n // N3 的内容比较(lineage.ts 设计如此)。无演化(identity/construct 等无历史\n // 输出)时跳过——identity 类推进不依赖演化,construct 词汇在节点 provenance 里。\n const outShape = (typeof out === 'object' && out !== null ? Object.values(out)[0] : out) as Shape | undefined\n const evolution = outShape ? getSlot(outShape)?.faceEvolution : undefined\n if (outShape && evolution) {\n runtimeLineage.attachEvolution(asStmtId(anchor!.id), evolution)\n }\n // 1.10 前置③:part 键的 roleTable 旁挂在这里记录(不是 fromBrep)——\n // impl 返回后 anchor.outputs 名字已定,而 fromBrep 时刻 shape 还未被\n // executor 命名(nameOf 为 undefined)。op 实现读输入表(inputRoleTable)\n // 与解析读表(tableOfPart)都走这份 part 键权威表。\n if (outShape && anchor && anchor.outputs.length > 0) {\n const stmtId = asStmtId(anchor.id)\n const table = runtimeLineage.outputTableOf(stmtId)\n const solid = runtimeLineage.outputHandleOf(stmtId)\n if (table) runtimeLineage.recordOutput(stmtId, table, solid, anchor.outputs[0] as PartName)\n }\n return out\n }\n const m = await runImpl(meta, decl.mesh as unknown as ((...a: unknown[]) => unknown) | undefined, callArgs)\n const mOut = meta.outputs ? wrapByKeys(m, meta.outputs, wrapMeshOne) : wrapMeshOne(m)\n inheritInputAppearance(mOut, inputs)\n inheritInputMeta(mOut, inputs)\n return mOut\n } finally {\n // 同语句去重标记不在 op 粒度清理——语句边界由 runtime-state.setCurrentStmt\n // 在锚点变化时重置;TS 库函数体内连续 op 调用共享锚点,嵌套调用正确跳过。\n }\n }\n\n Object.defineProperty(wrapped, DUAL_OP_META, { value: meta, enumerable: false })\n return wrapped as ((...args: A) => Promise<Shape | Record<string, Shape>>) & MetaCarrier\n}\n\n/**\n * Assembly-time validation (③, strict mode, D-4): a library that exports any\n * dual-op function must carry a matching `contractVersion`, and every exported\n * dual-op must be structurally valid (mesh a function, brep a function or\n * undefined, capabilities/outputs well-formed). Called by `registerLib`.\n *\n * Functions without dual-op metadata are left untouched (declarative\n * enforcement boundary — K5 forbids name-based classification).\n *\n * @param lib - the library namespace object being registered.\n */\n/**\n * Detect whether a library namespace exports any dual-op function (carries\n * `DUAL_OP_META`). Used by `registerLib`'s inferred `autoLift` default: a\n * library that already declares dual-ops does not need bare-function lifting.\n *\n * @param ns - the library namespace object.\n * @returns `true` if at least one exported value is a dual-op function.\n */\nexport function hasDualOp(ns: Record<string, unknown>): boolean {\n const values = Object.values(ns)\n return values.some((v) => typeof v === 'function' && (v as MetaCarrier)[DUAL_OP_META])\n}\n\n/**\n * Read the dual-op metadata of a wrapped function (unit-system D8 declaration\n * surface). Returns `undefined` when the function carries no dual-op metadata,\n * so callers never probe the private key directly.\n *\n * @param fn - a function that may have been produced by `defineOp`/`compatOp`.\n * @returns the op's metadata, or `undefined`.\n */\nexport function dualOpMetaOf(fn: unknown): DualOpMeta | undefined {\n if (typeof fn !== 'function') return undefined\n return (fn as MetaCarrier)[DUAL_OP_META]\n}\n\n/**\n * Assert that a library conforms to the dual-op contract: if it exports any\n * dual-op function, it must also export `contractVersion` matching the engine's.\n *\n * @param lib - the library namespace object being registered.\n * @throws {Error} when dual-op functions are present without a matching contract version.\n */\nexport function assertLibConforms(lib: Record<string, unknown>): void {\n if (hasDualOp(lib) && lib.contractVersion !== CONTRACT_VERSION) {\n throw new Error(\n `[faijs] library with dual-op functions must export contractVersion = ${CONTRACT_VERSION} (got ${String(lib.contractVersion)})`,\n )\n }\n\n for (const [name, value] of Object.entries(lib)) {\n if (typeof value !== 'function') continue\n const meta = (value as MetaCarrier)[DUAL_OP_META]\n if (!meta || meta.kind !== 'dual-op') continue\n if (typeof meta.mesh !== 'function' && typeof meta.brep !== 'function') {\n throw new Error(`[faijs] lib function '${name}' declares dual-op without any implementation`)\n }\n if (meta.mesh !== undefined && typeof meta.mesh !== 'function') {\n throw new Error(`[faijs] lib function '${name}' declares dual-op with a non-function mesh implementation`)\n }\n if (meta.brep !== undefined && typeof meta.brep !== 'function') {\n throw new Error(`[faijs] lib function '${name}' declares dual-op with a non-function brep implementation`)\n }\n if (meta.capabilities !== undefined && !Array.isArray(meta.capabilities)) {\n throw new Error(`[faijs] lib function '${name}' declares invalid capabilities (expected string[])`)\n }\n // D11-7 互斥**已撤销**(2026-09-24 用户裁决):engines 与 capabilities 是两条正交的\n // 声明轴——前者是引擎身份白名单(在哪些引擎上跑),后者是实现所需内核能力清单\n // (要用哪些方法)。两者并存是合法且更诚实的写法:engines 收窄候选集,能力门随后\n // 对同一引擎继续求交(dispatchPath 的求值次序本就是 engines 在先,D11-2)。\n // 曾经的理由「能力名空间只收 L1 中立名」与事实不符——BrepCapabilityName 含\n // BrepMethodKind 逐核真名(isNull / dispose / chamfer / shell / ...,见\n // brep/engine/types.ts),本就是内核名空间;平台 op 声明能力名并不越界。\n // 故此处不再校验两者是否同时出现。\n if (meta.engines !== undefined) {\n if (!Array.isArray(meta.engines) || meta.engines.length === 0) {\n throw new Error(`[faijs] lib function '${name}' declares invalid engines (expected non-empty BrepEngineId[])`)\n }\n const bad = meta.engines.find((e) => !BREP_ENGINE_ID_SET.has(e))\n if (bad !== undefined) {\n throw new Error(\n `[faijs] lib function '${name}' declares unknown engine '${String(bad)}' — expected one of ${BREP_ENGINE_IDS.join(', ')}`,\n )\n }\n }\n // meshEngines(方案 2026-10-01 §3.4):非空字符串数组。**不校验 id 是否为\n // \"已注册的网格后端\"**——装配在同一时刻前后,且第三方库可以被装配到我们不知道的\n // 后端上;门禁在 dispatchPath 处按当前装配比对(那里才拿得到真相)。\n if (meta.meshEngines !== undefined) {\n if (!Array.isArray(meta.meshEngines) || meta.meshEngines.length === 0 || meta.meshEngines.some((e) => typeof e !== 'string' || e.length === 0)) {\n throw new Error(`[faijs] lib function '${name}' declares invalid meshEngines (expected non-empty string[])`)\n }\n }\n if (\n meta.outputs !== undefined\n && (!Array.isArray(meta.outputs) || meta.outputs.some((k) => typeof k !== 'string'))\n ) {\n throw new Error(`[faijs] lib function '${name}' declares invalid outputs (expected string[])`)\n }\n if (meta.schema !== undefined && !isValidSchema(meta.schema)) {\n throw new Error(`[faijs] lib function '${name}' declares invalid schema (expected Record<string, string>)`)\n }\n if (meta.name !== undefined && typeof meta.name !== 'string') {\n throw new Error(`[faijs] lib function '${name}' declares invalid name (expected string)`)\n }\n if (meta.slotMap !== undefined && !isValidSlotMap(meta.slotMap)) {\n throw new Error(\n `[faijs] lib function '${name}' declares invalid slotMap (expected { keys: string[]; vec3Keys?: string[]; shapeArity?: number })`,\n )\n }\n }\n}\n\n/** True when the D11 slot-map declaration has a non-empty string `keys` list. */\nfunction isValidSlotMap(form: unknown): form is SlotMap {\n if (form === null || typeof form !== 'object') return false\n const keys = (form as { keys?: unknown }).keys\n if (!Array.isArray(keys) || keys.some((k) => typeof k !== 'string')) return false\n const vec3 = (form as { vec3Keys?: unknown }).vec3Keys\n if (vec3 !== undefined && (!Array.isArray(vec3) || vec3.some((k) => typeof k !== 'string'))) return false\n const arity = (form as { shapeArity?: unknown }).shapeArity\n if (arity !== undefined && (typeof arity !== 'number' || !Number.isInteger(arity) || arity < 0)) return false\n return true\n}\n\n/** True when every schema value is a non-empty string. */\nfunction isValidSchema(schema: unknown): schema is Record<string, string> {\n if (schema === null || typeof schema !== 'object' || Array.isArray(schema)) return false\n return Object.values(schema).every((v) => typeof v === 'string' && v.length > 0)\n}\n"]}
1
+ {"version":3,"file":"define-op.js","sourceRoot":"","sources":["../src/define-op.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * define-op — dual-path implementation decorator for geometry functions\n * (D-face contract: mesh mandatory as the default path, BREP optional).\n *\n *\n * `defineOp({ mesh?, brep?, ... })` declares the implementation set of a\n * geometry function (a function whose signature returns `SolidShape`). The\n * wrapper:\n * - auto-collects geometry inputs via `args.filter(isGeometryInput)` — a shape\n * that is identity-registered (`isShape`) or a structural mesh shape\n * (`isMeshShape`, positions + indices — e.g. bare ManifoldMeshData handed in\n * by a host via `geoToManifoldMesh`). The old per-function form passed the\n * actual geometry args (`dispatchPath([input], ...)`), so a bare mesh input\n * dispatched to the mesh path (`hasBrep=false`); the re-collection must keep\n * that compatibility. No `inputs` field — decided at runtime by the args\n * themselves, not the author.\n * - calls the engine's `dispatchPath` to select brep/mesh by mode (static,\n * no runtime fallback);\n * - wraps raw products: mesh path → `solid()`, brep path → `fromHandle()` /\n * `fromBrep()` (D3/D4: products must come from constructors, brep products\n * must carry a BREP slot).\n *\n * Zero heavy runtime dependencies: imports only runtime-state / shape /\n * handle-bridge / backend-dispatch / mesh/types (a zero-import module holding\n * the Shape type and the structural `isMeshShape` guard) — the dist/sdk.js\n * static-import guard keeps passing.\n */\n\nimport { dispatchPath, firstMissingCapability, type BrepCapabilityName } from './cad-runtime/backend-dispatch'\nimport {\n CONTRACT_VERSION,\n BrepUnsupportedError,\n MeshUnsupportedError,\n getCurrentStmt,\n getRuntimeState,\n nameOf,\n} from './runtime-state'\nimport { asStmtId, type PartName } from './identity'\nimport { isShape, solid, fromBrep, getSlot, type CompoundShape } from './shape'\nimport { isMeshShape } from './mesh/types'\nimport { fromHandle, meshHandle, isOcctHandle } from './brep/handle-bridge'\nimport { positionalToObject, type SlotMap } from './api/internal/dual-form-args'\nimport { toOpFailure, unwrapResult, OpError, type ResultLike } from './api/internal/result-unwrap'\nimport type { Shape } from './mesh/types'\nimport { BREP_ENGINE_IDS, type BrepEngineId, type BrepHandle } from './brep/engine/types'\nimport type { DimName } from './units'\nimport { type Provenance, runtimeLineage } from './topology/naming/lineage'\n\n/** 合法引擎 id 集合(assertLibConforms 的 engines 校验用,D11-1)。 */\nconst BREP_ENGINE_ID_SET = new Set<string>(BREP_ENGINE_IDS)\n\n/** Raw mesh data (structurally identical to Shape; mesh impls return it). */\nexport type MeshData = { positions: Float32Array; indices: Uint32Array }\n\n/**\n * Geometry-input recognition for dispatch auto-collection.\n *\n * Compat rule: the old per-function form passed the *actual* geometry args to\n * `dispatchPath` (`[input]` / `shapes`), so a bare ManifoldMeshData object\n * (e.g. `geoToManifoldMesh` output passed straight by a host) had no BREP slot\n * → `hasBrep=false` → mesh path. defineOp must keep that: an input counts as\n * geometry when it is identity-registered (`isShape`, constructor product) OR\n * structurally a mesh shape (`positions` + `indices`). Params objects and other\n * scalar args are not geometry inputs.\n *\n * @param v - the candidate argument.\n * @returns true when the argument is a geometry input (registered shape or bare mesh data).\n */\nexport function isGeometryInput(v: unknown): v is Shape {\n return isShape(v) || isMeshShape(v)\n}\n\n/**\n * §1.4 registration guard: the StmtId whose top-level `wrapped` is currently\n * registering a lineage node. Nested op calls (an impl invoking another op /\n * itself) share the same `getCurrentStmt()` anchor and are skipped so they\n * don't trip N3 (E_TOPO_DUPLICATE_STMT) with identical content. C1 (single\n * live runtime) means at most one statement registers at a time.\n *\n * The marker lives on the runtime state and is reset at statement boundaries\n * (runtime-state.setCurrentStmt: anchor change / end-of-statement), NOT at op\n * granularity — a TS library function (cq-compat Workplane op, etc.) may call\n * several defineOps within one statement, and only the first one must register.\n */\n\n/** Product of a mesh implementation: raw mesh data, a wrapped Shape, or (with `outputs`) a record of named products. */\nexport type MeshProduct = MeshData | Shape | CompoundShape | Record<string, MeshData | Shape | CompoundShape>\n\n/** Mesh implementation: sync or async (api mesh paths are often async); returns a mesh product. */\nexport type MeshImpl<A extends unknown[]> = (...args: A) => MeshProduct | Promise<MeshProduct>\n\n/** BREP implementation result: a raw handle, or a handle plus face evolution. */\nexport interface BrepResult {\n solid: BrepHandle\n faceEvolution?: Map<number, number[]>\n}\n\n/** Product of a BREP implementation: a raw handle, { solid, faceEvolution }, a wrapped Shape, or (with `outputs`) a record of named products. */\nexport type BrepProduct =\n | BrepHandle\n | BrepResult\n | Shape\n | CompoundShape\n | Record<string, BrepHandle | BrepResult | Shape | CompoundShape>\n | ResultLike\n\n/** BREP implementation: sync or async; returns a brep product. */\nexport type BrepImpl<A extends unknown[]> = (...args: A) => BrepProduct | Promise<BrepProduct>\n\n/** Optional declaration: capabilities (D5) and named multi-products (split, scheme C). */\nexport interface DualOpOptions {\n /** Op name (error messages); falls back to an anonymous prefix when absent. */\n name?: string\n capabilities?: BrepCapabilityName[]\n /**\n * 平台身份声明(D11,narrowing plan 2026-09-24):本 op 实现可运行在哪些\n * BREP 引擎上——一个**引擎白名单**。缺省 = 全平台(中立 op——实现只用 L1 核心面)。\n *\n * 平台 op(实现 import 了 `occt-kernel/*` / `brepkit-kernel/*`,调用该平台\n * 原生方法)**必须**声明 `engines` 自证身份。\n *\n * 与 `capabilities` **可以并存**(2026-09-24 撤销 D11-7 互斥):两者是正交的两轴——\n * `engines` 收窄「在哪些引擎上跑」,`capabilities` 声明「需要哪些内核能力」。判定\n * 次序 `engines` 在先(D11-2),能力门随后对同一引擎继续求交,故同时声明等于\n * 「只在这些引擎上,且要求这些能力」——不会静默放行\"目标引擎缺该能力\"的组合。\n */\n engines?: readonly BrepEngineId[]\n /**\n * 网格实体路径的引擎要求(方案 2026-10-01 §3.4):本 op 的 mesh 实现**能接受\n * 网格实体输入**的前提是「当前装配的网格后端 id 在此名单内」。\n *\n * 缺省 = `['manifold']`:mesh 实现跑在内置 `mesh/`(manifold CSG)上,它不认识\n * 网格实体——拿网格实体喂它必须在**执行前**静态报错\n * (`E_MESH_SOLID_UNSUPPORTED`),绝不运行时改走别的后端。\n *\n * 与 `engines` 正交:`engines` 收窄的是 **BREP 引擎**身份,本字段收窄的是\n * **网格后端**身份(同一个 op 可以\"BREP 走 occt、网格实体走 brepkit\")。\n */\n meshEngines?: readonly string[]\n outputs?: string[]\n /** L3 schema per named parameter (G1 codegen + UI panel, plain string form). */\n schema?: Record<string, string>\n /**\n * D11 slot-map declaration (§4.2): the positional→object boxing table\n * (SlotMap) mapping a positional call onto this op's native\n * object form. Ops without it accept only the form their implementation\n * natively takes.\n */\n slotMap?: SlotMap\n /**\n * Topology identity provenance (plan §4.4 / Phase 2.3, **required**).\n * Declares the op's face-mapping category + new-face vocabulary.\n * The lineage registrar (§4.3) reads this to build the blood-line graph;\n * missing naming = compile-time error (G4: no undeclared ops).\n */\n naming: Provenance\n /**\n * Script-side dimension declaration (unit-system D8): per-parameter dim for\n * the static `dimension` check stage. Params absent here are treated as\n * dimensionless and exempt from the check. `DimName` is a pure type import.\n */\n paramDims?: Record<string, DimName>\n /** Return dimension declaration (D8): the value produced carries this dim. */\n retDim?: DimName\n}\n\n/** Implementation set (at least one of mesh/brep is required, D1/D1b); options are siblings of the implementations. */\nexport type DualOpImpls<A extends unknown[]> =\n | (DualOpOptions & { mesh: MeshImpl<A>; brep?: BrepImpl<A> })\n | (DualOpOptions & { mesh?: never; brep: BrepImpl<A> })\n\n/** Metadata hung on the wrapped function object (K5: function info is data). */\nexport interface DualOpMeta {\n kind: 'dual-op'\n mesh?: unknown\n brep?: unknown\n /** Op name (error messages). */\n name?: string\n capabilities?: BrepCapabilityName[]\n /** 平台身份声明(D11,镜像 DualOpOptions.engines)。 */\n engines?: readonly BrepEngineId[]\n /** 网格实体路径的引擎要求(镜像 DualOpOptions.meshEngines;缺省 = `['manifold']`)。 */\n meshEngines?: readonly string[]\n outputs?: string[]\n schema?: Record<string, string>\n /** D11 slot-map declaration (positional → object boxing table, §9 naming). */\n slotMap?: SlotMap\n /** Topology identity provenance (Phase 2.3, mirrors DualOpOptions.naming). */\n naming: Provenance\n /** Script-side dimension declaration (D8, mirrors DualOpOptions.paramDims). */\n paramDims?: Record<string, DimName>\n /** Return dimension declaration (D8). */\n retDim?: DimName\n}\n\n/** Property key carrying DualOpMeta on wrapped functions. */\nexport const DUAL_OP_META = '__faijs__dualOp'\n\ntype MetaCarrier = { [DUAL_OP_META]?: DualOpMeta }\n\nfunction wrapMeshOne(v: unknown): Shape {\n if (isShape(v)) return v\n return solid(v as MeshData)\n}\n\nfunction wrapBrepOne(v: unknown): Shape {\n if (isShape(v)) return v\n if (v !== null && typeof v === 'object' && 'faceEvolution' in v) {\n const res = v as BrepResult\n return fromBrep(meshHandle(res.solid), res)\n }\n // A plain object that is not a Shape and not an OCCT handle is a data\n // product (e.g. a compat fn returning a sheetmetal-style record), not a\n // geometry handle — pass it through so it lands in the engine's value\n // store instead of being tessellated as if it were a bare handle. Native\n // OCCT handles from an implementation are hand-computed shape numbers\n // (from a branded number return) or objects; only the number path reaches\n // fromHandle. The handle/data distinction must go through the shared\n // isOcctHandle leaf (handle-bridge) — never a hardcoded '__occtWasm' in v.\n if (v !== null && typeof v === 'object' && !isOcctHandle(v)) {\n return v as unknown as Shape\n }\n return fromHandle(v)\n}\n\nfunction wrapByKeys(r: unknown, keys: string[], wrapOne: (v: unknown) => Shape): Record<string, Shape> {\n const src = (r ?? {}) as Record<string, unknown>\n const out: Record<string, Shape> = {}\n for (const k of keys) {\n const v = src[k]\n // An output may be an array (e.g. the compat adapter adopts each element of\n // an array-valued `outputs` field); wrap element-wise so arrays stay arrays.\n out[k] = Array.isArray(v) ? (v.map(wrapOne) as unknown as Shape) : wrapOne(v)\n }\n // Pass through non-shape data keys (e.g. autoHeal's `report`): declared\n // outputs are the geometry that gets Shape-wrapped, but sibling data products\n // of the same op result must survive the statement boundary (§5.4).\n for (const k of Object.keys(src)) {\n if (!keys.includes(k)) out[k] = src[k] as unknown as Shape\n }\n return out\n}\n\n/**\n * 外观继承(设计文档 2026-10-05 v2 §6.1):几何 op 返回新 Shape 时,默认继承\n * 第一个携带外观的几何输入(`inputs.find(appearance !== undefined)`);产物\n * 已有外观则不动(后置 setColor 优先)。实现集中在产物包装点,避免每个 op\n * 手写——mesh 与 brep 两条路径的产物都经此补齐。\n */\nfunction inheritInputAppearance(out: Shape | Record<string, Shape>, inputs: Shape[]): void {\n const src = inputs.find((i) => i.appearance !== undefined)\n if (!src?.appearance) return\n const setIfEmpty = (v: unknown): void => {\n if (v !== null && typeof v === 'object' && 'positions' in v && !(v as Shape).appearance) {\n ;(v as Shape).appearance = src.appearance\n }\n }\n if (isShape(out)) {\n setIfEmpty(out)\n return\n }\n for (const k of Object.keys(out)) {\n const v = out[k]\n if (Array.isArray(v)) (v as unknown[]).forEach(setIfEmpty)\n else setIfEmpty(v)\n }\n}\n\n/**\n * 元数据继承(设计文档 2026-10-05-meta §2 ③):几何 op 返回新 Shape 时,默认\n * 继承第一个携带 meta 的几何输入(`inputs.find(meta !== undefined)`),对象引用\n * 共享;产物已有 meta 则不动(后置 setName 优先)。实现集中在产物包装点,mesh\n * 与 brep 两条路径的产物都经此补齐。名称是显式声明,继承只是保底——需要新名的\n * 产物(组合/变换后)由用户显式 `setName` 覆盖。\n */\nfunction inheritInputMeta(out: Shape | Record<string, Shape>, inputs: Shape[]): void {\n const src = inputs.find((i) => i.meta !== undefined)\n if (!src?.meta) return\n const setIfEmpty = (v: unknown): void => {\n if (v !== null && typeof v === 'object' && 'positions' in v && !(v as Shape).meta) {\n ;(v as Shape).meta = src.meta\n }\n }\n if (isShape(out)) {\n setIfEmpty(out)\n return\n }\n for (const k of Object.keys(out)) {\n const v = out[k]\n if (Array.isArray(v)) (v as unknown[]).forEach(setIfEmpty)\n else setIfEmpty(v)\n }\n}\n\n/** Human-readable op label for error messages (falls back when unnamed). */\nfunction opLabel(meta: DualOpMeta): string {\n return meta.name ?? '<anon>'\n}\n\n/**\n * Run one implementation through the unified Result boundary (§5.2, D1).\n *\n * Transition contract: an implementation may\n * ① return a `Result` → unwrapped here (`err` becomes a throw);\n * ② throw → normalized into an op-labelled error;\n * ③ return a plain product → passed through untouched.\n *\n * The two engine-level routing errors keep their class: `runtime.ts` matches\n * `BrepUnsupportedError` / `MeshUnsupportedError` by `instanceof` to turn them\n * into `ExecutionResult.failedAt`, so they must not be re-wrapped.\n *\n * @param meta - the op's metadata (name).\n * @param impl - the implementation to run.\n * @param args - the normalized argument list.\n * @returns the (unwrapped) implementation product.\n */\nasync function runImpl(\n meta: DualOpMeta,\n impl: ((...a: unknown[]) => unknown) | undefined,\n args: unknown[],\n): Promise<unknown> {\n const label = opLabel(meta)\n let product: unknown\n try {\n product = await (impl as (...a: unknown[]) => unknown)(...args)\n } catch (e) {\n if (e instanceof BrepUnsupportedError || e instanceof MeshUnsupportedError) throw e\n // An OpError is already the engine-recognizable statement failure (thrown\n // by the compat adapter's Result unwrap, or by impls returning a Result);\n // re-wrapping it into a plain Error would make CadRuntime treat it as an\n // uncaught bug instead of a statement failure.\n if (e instanceof OpError) throw e\n throw toOpFailure(label, e)\n }\n return unwrapResult(product, label)\n}\n\n/**\n * Declare a geometry function's dual-path implementation set.\n *\n * At least one implementation (mesh or brep) is required — enforced at\n * compile time by the union type and at construction time by a runtime check.\n * Geometry inputs are auto-collected by identity-or-structure\n * (`args.filter(isGeometryInput)` = `isShape` ∨ `isMeshShape`); raw mesh\n * products are wrapped by `solid()`, raw brep products by\n * `fromHandle()` / `fromBrep()`. `mode` selects the engine path via the\n * engine's static `dispatchPath` — the author never writes an `if (path)`\n * branch.\n *\n * @param decl - the declaration object: implementations `{ mesh }` (mesh-only),\n * `{ brep }` (brep-only, D1b), or `{ mesh, brep }` (dual-path), plus optional\n * `capabilities` (D5: missing capability degrades in auto, errors in brep mode)\n * and `outputs` (named multi-products, e.g. split) as siblings.\n * @returns the wrapped geometry function with dual-op metadata attached.\n */\nexport function defineOp<A extends unknown[]>(\n decl: DualOpImpls<A> & { outputs: string[] },\n): ((...args: A) => Promise<Record<string, Shape>>) & MetaCarrier\n/**\n * Overload without `outputs`: single-product functions resolve to a `Promise<Shape>`.\n * @param decl - the declaration object: implementations `{ mesh }`, `{ brep }`, or `{ mesh, brep }`.\n * @returns the wrapped geometry function with dual-op metadata attached.\n */\nexport function defineOp<A extends unknown[]>(\n decl: DualOpImpls<A>,\n): ((...args: A) => Promise<Shape>) & MetaCarrier\n/** Implementation signature (not visible to callers); matches the union of both overloads. */\nexport function defineOp<A extends unknown[]>(\n decl: DualOpImpls<A>,\n): ((...args: A) => Promise<Shape | Record<string, Shape>>) & MetaCarrier {\n // Construction-time check (②): implementations must be functions, then at\n // least one implementation must be present.\n if (decl.mesh !== undefined && typeof decl.mesh !== 'function') {\n throw new Error('[faijs/defineOp] mesh must be a function')\n }\n if (decl.brep !== undefined && typeof decl.brep !== 'function') {\n throw new Error('[faijs/defineOp] brep must be a function')\n }\n if (typeof decl.mesh !== 'function' && typeof decl.brep !== 'function') {\n throw new Error('[faijs/defineOp] at least one implementation (mesh or brep) is required')\n }\n\n const meta: DualOpMeta = {\n kind: 'dual-op',\n mesh: decl.mesh,\n brep: decl.brep,\n name: decl.name,\n capabilities: decl.capabilities,\n engines: decl.engines,\n meshEngines: decl.meshEngines,\n outputs: decl.outputs,\n schema: decl.schema,\n slotMap: decl.slotMap,\n naming: decl.naming,\n paramDims: decl.paramDims,\n retDim: decl.retDim,\n }\n\n // Async wrapper: implementations may be sync or async (api mesh paths are\n // often async, e.g. drill/engrave/boolean). The compiled .fai.js product always\n // awaits the call, so returning a Promise is transparent.\n const wrapped = async (...args: A): Promise<Shape | Record<string, Shape>> => {\n // D11 (§4.2): faijs-native ops declare an object-form implementation, so a\n // positional call is boxed into the object form here — before\n // dispatch, so geometry inputs are collected from the normalized arg list.\n const callArgs = (\n meta.slotMap ? positionalToObject(args as unknown[], meta.slotMap, opLabel(meta)) : args\n ) as A\n // Geometry inputs: identity-or-structure auto collection (execution-time\n // read, same nature as hasBrep — decided before the implementation runs).\n // Compat: bare ManifoldMeshData args (host geoToManifoldMesh output) are\n // geometry inputs too — old form passed [input] so they reached the mesh path.\n const inputs = (callArgs as unknown[]).filter(isGeometryInput) as Shape[]\n // §1.4 lineage registration (plan §4.3): every top-level dual-op execution\n // records a blood-line node via `runtimeLineage.register`, which enforces\n // N1 (untracked input → throw, never default to chain-root) / N2\n // (stmt↔anchor mismatch) / N3 (conflicting re-register). The graph is\n // cleared per program execution (direct-executor runCode) and C1 guarantees\n // a single live runtime, so the anchor is authoritative inside a statement.\n // Skip when no anchor is set (the op was invoked outside a statement\n // context — there is no lineage to record, and N2 must not fire on a context\n // that legitimately has none).\n //\n // Guard: a statement executes exactly one *top-level* op; an op's\n // implementation may invoke other ops (or itself) internally, and those\n // nested calls share the same `getCurrentStmt()` anchor. They are\n // implementation details, not statements, so they must NOT register a second\n // node under the same StmtId — that would trip N3 (E_TOPO_DUPLICATE_STMT)\n // on identical content. Only the outermost `wrapped` for the current\n // statement registers; the flag below stays set for the *entire* statement\n // execution (including the awaited impl), so nested calls see it and skip.\n const anchor = getCurrentStmt()\n const st = getRuntimeState()\n const isOuter = anchor != null && st.registeredStmtId !== anchor.id\n if (isOuter) st.registeredStmtId = asStmtId(anchor.id)\n try {\n if (isOuter && anchor) {\n runtimeLineage.register(\n {\n stmt: asStmtId(anchor.id),\n op: opLabel(meta),\n inputs,\n outputs: anchor.outputs as [PartName, ...PartName[]],\n provenance: meta.naming,\n },\n {\n nameOf,\n currentStmt: () => {\n const a = getCurrentStmt()\n return a ? { id: a.id } : undefined\n },\n },\n )\n }\n // D5 capability routing: feed the first missing capability to dispatchPath\n // (auto degrades to mesh, brep mode errors). Matched as a concrete name\n // against the engine's declaration set (family booleans + its `evolution`\n // list of *WithHistory kernel function names) — see firstMissingCapability.\n const missing = firstMissingCapability(meta.capabilities)\n const path = dispatchPath(inputs, meta, missing, meta.engines)\n if (path === 'brep') {\n const r = await runImpl(meta, decl.brep as unknown as ((...a: unknown[]) => unknown) | undefined, callArgs)\n const out = meta.outputs ? wrapByKeys(r, meta.outputs, wrapBrepOne) : wrapBrepOne(r)\n inheritInputAppearance(out, inputs)\n inheritInputMeta(out, inputs)\n // 1.10 前置①:执行期把 hash 演化挂到血缘节点(kernel 类回走推进的数据源)。\n // 演化在几何算完那一刻可得(fromBrep → slot.faceEvolution),事后补挂不参与\n // N3 的内容比较(lineage.ts 设计如此)。无演化(identity/construct 等无历史\n // 输出)时跳过——identity 类推进不依赖演化,construct 词汇在节点 provenance 里。\n const outShape = (typeof out === 'object' && out !== null ? Object.values(out)[0] : out) as Shape | undefined\n const evolution = outShape ? getSlot(outShape)?.faceEvolution : undefined\n if (outShape && evolution) {\n runtimeLineage.attachEvolution(asStmtId(anchor!.id), evolution)\n }\n // 1.10 前置③:part 键的 roleTable 旁挂在这里记录(不是 fromBrep)——\n // impl 返回后 anchor.outputs 名字已定,而 fromBrep 时刻 shape 还未被\n // executor 命名(nameOf 为 undefined)。op 实现读输入表(inputRoleTable)\n // 与解析读表(tableOfPart)都走这份 part 键权威表。\n if (outShape && anchor && anchor.outputs.length > 0) {\n const stmtId = asStmtId(anchor.id)\n const table = runtimeLineage.outputTableOf(stmtId)\n const solid = runtimeLineage.outputHandleOf(stmtId)\n if (table) runtimeLineage.recordOutput(stmtId, table, solid, anchor.outputs[0] as PartName)\n }\n return out\n }\n const m = await runImpl(meta, decl.mesh as unknown as ((...a: unknown[]) => unknown) | undefined, callArgs)\n const mOut = meta.outputs ? wrapByKeys(m, meta.outputs, wrapMeshOne) : wrapMeshOne(m)\n inheritInputAppearance(mOut, inputs)\n inheritInputMeta(mOut, inputs)\n return mOut\n } finally {\n // 同语句去重标记不在 op 粒度清理——语句边界由 runtime-state.setCurrentStmt\n // 在锚点变化时重置;TS 库函数体内连续 op 调用共享锚点,嵌套调用正确跳过。\n }\n }\n\n Object.defineProperty(wrapped, DUAL_OP_META, { value: meta, enumerable: false })\n return wrapped as ((...args: A) => Promise<Shape | Record<string, Shape>>) & MetaCarrier\n}\n\n/**\n * Assembly-time validation (③, strict mode, D-4): a library that exports any\n * dual-op function must carry a matching `contractVersion`, and every exported\n * dual-op must be structurally valid (mesh a function, brep a function or\n * undefined, capabilities/outputs well-formed). Called by `registerLib`.\n *\n * Functions without dual-op metadata are left untouched (declarative\n * enforcement boundary — K5 forbids name-based classification).\n *\n * @param lib - the library namespace object being registered.\n */\n/**\n * Detect whether a library namespace exports any dual-op function (carries\n * `DUAL_OP_META`). Used by `registerLib`'s inferred `autoLift` default: a\n * library that already declares dual-ops does not need bare-function lifting.\n *\n * @param ns - the library namespace object.\n * @returns `true` if at least one exported value is a dual-op function.\n */\nexport function hasDualOp(ns: Record<string, unknown>): boolean {\n const values = Object.values(ns)\n return values.some((v) => typeof v === 'function' && (v as MetaCarrier)[DUAL_OP_META])\n}\n\n/**\n * Read the dual-op metadata of a wrapped function (unit-system D8 declaration\n * surface). Returns `undefined` when the function carries no dual-op metadata,\n * so callers never probe the private key directly.\n *\n * @param fn - a function that may have been produced by `defineOp`/`compatOp`.\n * @returns the op's metadata, or `undefined`.\n */\nexport function dualOpMetaOf(fn: unknown): DualOpMeta | undefined {\n if (typeof fn !== 'function') return undefined\n return (fn as MetaCarrier)[DUAL_OP_META]\n}\n\n/**\n * Assert that a library conforms to the dual-op contract: if it exports any\n * dual-op function, it must also export `contractVersion` matching the engine's.\n *\n * @param lib - the library namespace object being registered.\n * @throws {Error} when dual-op functions are present without a matching contract version.\n */\nexport function assertLibConforms(lib: Record<string, unknown>): void {\n if (hasDualOp(lib) && lib.contractVersion !== CONTRACT_VERSION) {\n throw new Error(\n `[faijs] library with dual-op functions must export contractVersion = ${CONTRACT_VERSION} (got ${String(lib.contractVersion)})`,\n )\n }\n\n for (const [name, value] of Object.entries(lib)) {\n if (typeof value !== 'function') continue\n const meta = (value as MetaCarrier)[DUAL_OP_META]\n if (!meta || meta.kind !== 'dual-op') continue\n if (typeof meta.mesh !== 'function' && typeof meta.brep !== 'function') {\n throw new Error(`[faijs] lib function '${name}' declares dual-op without any implementation`)\n }\n if (meta.mesh !== undefined && typeof meta.mesh !== 'function') {\n throw new Error(`[faijs] lib function '${name}' declares dual-op with a non-function mesh implementation`)\n }\n if (meta.brep !== undefined && typeof meta.brep !== 'function') {\n throw new Error(`[faijs] lib function '${name}' declares dual-op with a non-function brep implementation`)\n }\n if (meta.capabilities !== undefined && !Array.isArray(meta.capabilities)) {\n throw new Error(`[faijs] lib function '${name}' declares invalid capabilities (expected string[])`)\n }\n // D11-7 互斥**已撤销**(2026-09-24 用户裁决):engines 与 capabilities 是两条正交的\n // 声明轴——前者是引擎身份白名单(在哪些引擎上跑),后者是实现所需内核能力清单\n // (要用哪些方法)。两者并存是合法且更诚实的写法:engines 收窄候选集,能力门随后\n // 对同一引擎继续求交(dispatchPath 的求值次序本就是 engines 在先,D11-2)。\n // 曾经的理由「能力名空间只收 L1 中立名」与事实不符——BrepCapabilityName 含\n // BrepMethodKind 逐核真名(isNull / dispose / chamfer / shell / ...,见\n // brep/engine/types.ts),本就是内核名空间;平台 op 声明能力名并不越界。\n // 故此处不再校验两者是否同时出现。\n if (meta.engines !== undefined) {\n if (!Array.isArray(meta.engines) || meta.engines.length === 0) {\n throw new Error(`[faijs] lib function '${name}' declares invalid engines (expected non-empty BrepEngineId[])`)\n }\n const bad = meta.engines.find((e) => !BREP_ENGINE_ID_SET.has(e))\n if (bad !== undefined) {\n throw new Error(\n `[faijs] lib function '${name}' declares unknown engine '${String(bad)}' — expected one of ${BREP_ENGINE_IDS.join(', ')}`,\n )\n }\n }\n // meshEngines(方案 2026-10-01 §3.4):非空字符串数组。**不校验 id 是否为\n // \"已注册的网格后端\"**——装配在同一时刻前后,且第三方库可以被装配到我们不知道的\n // 后端上;门禁在 dispatchPath 处按当前装配比对(那里才拿得到真相)。\n if (meta.meshEngines !== undefined) {\n if (!Array.isArray(meta.meshEngines) || meta.meshEngines.length === 0 || meta.meshEngines.some((e) => typeof e !== 'string' || e.length === 0)) {\n throw new Error(`[faijs] lib function '${name}' declares invalid meshEngines (expected non-empty string[])`)\n }\n }\n if (\n meta.outputs !== undefined\n && (!Array.isArray(meta.outputs) || meta.outputs.some((k) => typeof k !== 'string'))\n ) {\n throw new Error(`[faijs] lib function '${name}' declares invalid outputs (expected string[])`)\n }\n if (meta.schema !== undefined && !isValidSchema(meta.schema)) {\n throw new Error(`[faijs] lib function '${name}' declares invalid schema (expected Record<string, string>)`)\n }\n if (meta.name !== undefined && typeof meta.name !== 'string') {\n throw new Error(`[faijs] lib function '${name}' declares invalid name (expected string)`)\n }\n if (meta.slotMap !== undefined && !isValidSlotMap(meta.slotMap)) {\n throw new Error(\n `[faijs] lib function '${name}' declares invalid slotMap (expected { keys: string[]; vec3Keys?: string[]; shapeArity?: number })`,\n )\n }\n }\n}\n\n/** True when the D11 slot-map declaration has a non-empty string `keys` list. */\nfunction isValidSlotMap(form: unknown): form is SlotMap {\n if (form === null || typeof form !== 'object') return false\n const keys = (form as { keys?: unknown }).keys\n if (!Array.isArray(keys) || keys.some((k) => typeof k !== 'string')) return false\n const vec3 = (form as { vec3Keys?: unknown }).vec3Keys\n if (vec3 !== undefined && (!Array.isArray(vec3) || vec3.some((k) => typeof k !== 'string'))) return false\n const arity = (form as { shapeArity?: unknown }).shapeArity\n if (arity !== undefined && (typeof arity !== 'number' || !Number.isInteger(arity) || arity < 0)) return false\n return true\n}\n\n/** True when every schema value is a non-empty string. */\nfunction isValidSchema(schema: unknown): schema is Record<string, string> {\n if (schema === null || typeof schema !== 'object' || Array.isArray(schema)) return false\n return Object.values(schema).every((v) => typeof v === 'string' && v.length > 0)\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * A {@link Plane} carries an origin plus a right-handed, orthonormal frame
5
5
  * `xDir / yDir / zDir` where `zDir` is the plane normal — the same semantic as
6
- * the kernel `gp_Ax3` frame and the `createPlane` helper in `api/brepjs-compat`.
6
+ * the kernel `gp_Ax3` frame and the `createPlane` helper in `api/geom-types`.
7
7
  * The bridge may **not** import `api/` (plan rule against a cycle), so this
8
8
  * module re-derives the framing math self-containedly. Points use the
9
9
  * `{ x, y, z }` shape compatible with the BREP engine's neutral `BrepVec3`.
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * A {@link Plane} carries an origin plus a right-handed, orthonormal frame
5
5
  * `xDir / yDir / zDir` where `zDir` is the plane normal — the same semantic as
6
- * the kernel `gp_Ax3` frame and the `createPlane` helper in `api/brepjs-compat`.
6
+ * the kernel `gp_Ax3` frame and the `createPlane` helper in `api/geom-types`.
7
7
  * The bridge may **not** import `api/` (plan rule against a cycle), so this
8
8
  * module re-derives the framing math self-containedly. Points use the
9
9
  * `{ x, y, z }` shape compatible with the BREP engine's neutral `BrepVec3`.
@@ -1 +1 @@
1
- {"version":3,"file":"plane.js","sourceRoot":"","sources":["../../../src/geometry2d/bridge/plane.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Plane frame helpers for 2D→3D placement (pure TS, no kernel, no `api/` import).\n *\n * A {@link Plane} carries an origin plus a right-handed, orthonormal frame\n * `xDir / yDir / zDir` where `zDir` is the plane normal — the same semantic as\n * the kernel `gp_Ax3` frame and the `createPlane` helper in `api/brepjs-compat`.\n * The bridge may **not** import `api/` (plan rule against a cycle), so this\n * module re-derives the framing math self-containedly. Points use the\n * `{ x, y, z }` shape compatible with the BREP engine's neutral `BrepVec3`.\n * @module\n */\n\n/** A 3D point / vector (neutral {x,y,z} shape, kernel-compatible). */\nexport interface Vec3 {\n x: number\n y: number\n z: number\n}\n\n/** User-facing 3D input: `{x,y,z}` object or `[x,y,z]` array (the script form). */\nexport type Vec3Input = Vec3 | readonly [number, number, number]\n\n/**\n * Normalize a raw script- or API-facing 3D input to the canonical `{x,y,z}`.\n * Accepts both the array form (`[1,0,0]`, as produced by `.fai.js` literals)\n * and the object form (`{x,y,z}`, used by the bridge internals).\n * @param v - the input 3D value.\n * @returns the canonical vector.\n */\nexport function toVec3(v: Vec3Input): Vec3 {\n if (Array.isArray(v)) return { x: v[0]!, y: v[1]!, z: v[2]! }\n const o = v as Vec3\n return { x: o.x, y: o.y, z: o.z }\n}\n\n/**\n * A right-handed, orthonormal plane frame: an origin plus `xDir`/`yDir` (in-plane\n * axes) and `zDir` (the normal). 2D `(x, y)` maps to `origin + x*xDir + y*yDir`.\n */\nexport interface Plane {\n /** The plane's anchor point (the 2D origin maps here). */\n readonly origin: Vec3\n /** The in-plane X axis (maps the 2D +X). */\n readonly xDir: Vec3\n /** The in-plane Y axis (maps the 2D +Y). */\n readonly yDir: Vec3\n /** The plane normal (2D +Z after placement). */\n readonly zDir: Vec3\n}\n\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return { x: a.y * b.z - a.z * b.y, y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x }\n}\n\nfunction dot(a: Vec3, b: Vec3): number {\n return a.x * b.x + a.y * b.y + a.z * b.z\n}\n\nfunction norm(v: Vec3): number {\n return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)\n}\n\nfunction normalize(v: Vec3): Vec3 {\n const len = norm(v)\n return len > 1e-14 ? { x: v.x / len, y: v.y / len, z: v.z / len } : { x: 1, y: 0, z: 0 }\n}\n\n/**\n * Build a right-handed plane frame from an origin, a normal, and an optional\n * in-plane X direction. The X direction is auto-derived (least-aligned-axis\n * cross product) when omitted, mirroring the kernel `gp_Ax3` convention.\n * @param origin - the plane origin (2D origin maps here).\n * @param normal - the plane normal (becomes the zDir); must be non-zero.\n * @param xDir - optional explicit in-plane X; auto-derived when omitted.\n * @returns the orthonormal plane frame.\n */\nexport function makePlane(origin: Vec3Input, normal: Vec3Input, xDir?: Vec3Input): Plane {\n const o = toVec3(origin)\n const z = normalize(toVec3(normal))\n let x: Vec3\n if (xDir) {\n x = normalize(toVec3(xDir))\n } else {\n const ax = Math.abs(z.x), ay = Math.abs(z.y), az = Math.abs(z.z)\n const cand: Vec3 =\n ax <= ay && ax <= az ? { x: 1, y: 0, z: 0 } : ay <= az ? { x: 0, y: 1, z: 0 } : { x: 0, y: 0, z: 1 }\n x = normalize(cross(cand, z))\n }\n const y = normalize(cross(z, x))\n return { origin: o, xDir: x, yDir: y, zDir: z }\n}\n\n/** Named CAD planes with their canonical frames (origin defaults to [0,0,0]). */\nconst NAMED_PLANES: Record<string, { xDir: Vec3; zDir: Vec3 }> = {\n XY: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: 0, z: 1 } },\n XZ: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: -1, z: 0 } },\n YZ: { xDir: { x: 0, y: 1, z: 0 }, zDir: { x: 1, y: 0, z: 0 } },\n front: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: 0, z: 1 } },\n back: { xDir: { x: -1, y: 0, z: 0 }, zDir: { x: 0, y: 0, z: -1 } },\n left: { xDir: { x: 0, y: 0, z: 1 }, zDir: { x: -1, y: 0, z: 0 } },\n right: { xDir: { x: 0, y: 0, z: -1 }, zDir: { x: 1, y: 0, z: 0 } },\n top: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: 1, z: 0 } },\n bottom: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: -1, z: 0 } },\n}\n\n/**\n * Resolve a named plane (e.g. `'XY'` / `'XZ'` / `'top'`) to a frame at a given\n * origin. Unknown names throw.\n * @param name - the canonical plane name.\n * @param origin - the plane origin (default [0,0,0]).\n * @returns the plane frame.\n */\nexport function namedPlane(name: string, origin: Vec3Input = { x: 0, y: 0, z: 0 }): Plane {\n const cfg = NAMED_PLANES[name]\n if (!cfg) throw new Error(`unknown plane '${name}' (expected XY | XZ | YZ | front/back/left/right/top/bottom)`)\n return makePlane(toVec3(origin), cfg.zDir, cfg.xDir)\n}\n\n/**\n * Map a 2D point `(x, y)` into 3D on a plane frame:\n * `origin + x*xDir + y*yDir`. This is the per-point lift used by curve lifting.\n * @param plane - the target plane.\n * @param x - the 2D `x` coordinate.\n * @param y - the 2D `y` coordinate.\n * @returns the 3D point on the plane.\n */\nexport function liftPointToPlane(plane: Plane, x: number, y: number): Vec3 {\n const { origin: o, xDir: u, yDir: v } = plane\n return { x: o.x + x * u.x + y * v.x, y: o.y + x * u.y + y * v.y, z: o.z + x * u.z + y * v.z }\n}\n/**\n * Project a 3D point onto a plane's 2D coordinates — the inverse of\n * {@link liftPointToPlane}. Computes `d = p − origin` and returns\n * `(u, v) = (d·xDir, d·yDir)`. Because `xDir`/`yDir` are orthonormal this is the\n * orthogonal projection: the component of `d` along `zDir` (the plane normal) is\n * dropped. A point already on the plane round-trips losslessly\n * (`worldToPlane(plane, liftPointToPlane(plane, u, v)) === {u, v}`); a point off\n * the plane projects to the foot of the perpendicular — the same behaviour as\n * dropping a sketch point onto its supporting face.\n * @param plane - the supporting plane frame.\n * @param p - the 3D point to project.\n * @returns the 2D `{ u, v }` coordinates on the plane.\n */\nexport function worldToPlane(plane: Plane, p: Vec3Input): { u: number; v: number } {\n const { origin: o, xDir: u, yDir: v } = plane\n const q = toVec3(p)\n const d: Vec3 = { x: q.x - o.x, y: q.y - o.y, z: q.z - o.z }\n return { u: dot(d, u), v: dot(d, v) }\n}"]}
1
+ {"version":3,"file":"plane.js","sourceRoot":"","sources":["../../../src/geometry2d/bridge/plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,CAAY;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAA;IAC7D,MAAM,CAAC,GAAG,CAAS,CAAA;IACnB,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AACnC,CAAC;AAiBD,SAAS,KAAK,CAAC,CAAO,EAAE,CAAO;IAC7B,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;AACzF,CAAC;AAED,SAAS,GAAG,CAAC,CAAO,EAAE,CAAO;IAC3B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,IAAI,CAAC,CAAO;IACnB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,SAAS,SAAS,CAAC,CAAO;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AAC1F,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,MAAiB,EAAE,MAAiB,EAAE,IAAgB;IAC9E,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IACxB,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACnC,IAAI,CAAO,CAAA;IACX,IAAI,IAAI,EAAE,CAAC;QACT,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChE,MAAM,IAAI,GACR,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;QACtG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;IACD,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;AACjD,CAAC;AAED,iFAAiF;AACjF,MAAM,YAAY,GAA+C;IAC/D,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAC9D,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAC/D,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAC9D,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IACjE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;IAClE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IACjE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAClE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAC/D,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;CACpE,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,SAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IAC/E,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,8DAA8D,CAAC,CAAA;IAC/G,OAAO,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAY,EAAE,CAAS,EAAE,CAAS;IACjE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAA;IAC7C,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/F,CAAC;AACD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,CAAY;IACrD,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAA;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,CAAC,GAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5D,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;AACvC,CAAC","sourcesContent":["/**\n * Plane frame helpers for 2D→3D placement (pure TS, no kernel, no `api/` import).\n *\n * A {@link Plane} carries an origin plus a right-handed, orthonormal frame\n * `xDir / yDir / zDir` where `zDir` is the plane normal — the same semantic as\n * the kernel `gp_Ax3` frame and the `createPlane` helper in `api/geom-types`.\n * The bridge may **not** import `api/` (plan rule against a cycle), so this\n * module re-derives the framing math self-containedly. Points use the\n * `{ x, y, z }` shape compatible with the BREP engine's neutral `BrepVec3`.\n * @module\n */\n\n/** A 3D point / vector (neutral {x,y,z} shape, kernel-compatible). */\nexport interface Vec3 {\n x: number\n y: number\n z: number\n}\n\n/** User-facing 3D input: `{x,y,z}` object or `[x,y,z]` array (the script form). */\nexport type Vec3Input = Vec3 | readonly [number, number, number]\n\n/**\n * Normalize a raw script- or API-facing 3D input to the canonical `{x,y,z}`.\n * Accepts both the array form (`[1,0,0]`, as produced by `.fai.js` literals)\n * and the object form (`{x,y,z}`, used by the bridge internals).\n * @param v - the input 3D value.\n * @returns the canonical vector.\n */\nexport function toVec3(v: Vec3Input): Vec3 {\n if (Array.isArray(v)) return { x: v[0]!, y: v[1]!, z: v[2]! }\n const o = v as Vec3\n return { x: o.x, y: o.y, z: o.z }\n}\n\n/**\n * A right-handed, orthonormal plane frame: an origin plus `xDir`/`yDir` (in-plane\n * axes) and `zDir` (the normal). 2D `(x, y)` maps to `origin + x*xDir + y*yDir`.\n */\nexport interface Plane {\n /** The plane's anchor point (the 2D origin maps here). */\n readonly origin: Vec3\n /** The in-plane X axis (maps the 2D +X). */\n readonly xDir: Vec3\n /** The in-plane Y axis (maps the 2D +Y). */\n readonly yDir: Vec3\n /** The plane normal (2D +Z after placement). */\n readonly zDir: Vec3\n}\n\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return { x: a.y * b.z - a.z * b.y, y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x }\n}\n\nfunction dot(a: Vec3, b: Vec3): number {\n return a.x * b.x + a.y * b.y + a.z * b.z\n}\n\nfunction norm(v: Vec3): number {\n return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z)\n}\n\nfunction normalize(v: Vec3): Vec3 {\n const len = norm(v)\n return len > 1e-14 ? { x: v.x / len, y: v.y / len, z: v.z / len } : { x: 1, y: 0, z: 0 }\n}\n\n/**\n * Build a right-handed plane frame from an origin, a normal, and an optional\n * in-plane X direction. The X direction is auto-derived (least-aligned-axis\n * cross product) when omitted, mirroring the kernel `gp_Ax3` convention.\n * @param origin - the plane origin (2D origin maps here).\n * @param normal - the plane normal (becomes the zDir); must be non-zero.\n * @param xDir - optional explicit in-plane X; auto-derived when omitted.\n * @returns the orthonormal plane frame.\n */\nexport function makePlane(origin: Vec3Input, normal: Vec3Input, xDir?: Vec3Input): Plane {\n const o = toVec3(origin)\n const z = normalize(toVec3(normal))\n let x: Vec3\n if (xDir) {\n x = normalize(toVec3(xDir))\n } else {\n const ax = Math.abs(z.x), ay = Math.abs(z.y), az = Math.abs(z.z)\n const cand: Vec3 =\n ax <= ay && ax <= az ? { x: 1, y: 0, z: 0 } : ay <= az ? { x: 0, y: 1, z: 0 } : { x: 0, y: 0, z: 1 }\n x = normalize(cross(cand, z))\n }\n const y = normalize(cross(z, x))\n return { origin: o, xDir: x, yDir: y, zDir: z }\n}\n\n/** Named CAD planes with their canonical frames (origin defaults to [0,0,0]). */\nconst NAMED_PLANES: Record<string, { xDir: Vec3; zDir: Vec3 }> = {\n XY: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: 0, z: 1 } },\n XZ: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: -1, z: 0 } },\n YZ: { xDir: { x: 0, y: 1, z: 0 }, zDir: { x: 1, y: 0, z: 0 } },\n front: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: 0, z: 1 } },\n back: { xDir: { x: -1, y: 0, z: 0 }, zDir: { x: 0, y: 0, z: -1 } },\n left: { xDir: { x: 0, y: 0, z: 1 }, zDir: { x: -1, y: 0, z: 0 } },\n right: { xDir: { x: 0, y: 0, z: -1 }, zDir: { x: 1, y: 0, z: 0 } },\n top: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: 1, z: 0 } },\n bottom: { xDir: { x: 1, y: 0, z: 0 }, zDir: { x: 0, y: -1, z: 0 } },\n}\n\n/**\n * Resolve a named plane (e.g. `'XY'` / `'XZ'` / `'top'`) to a frame at a given\n * origin. Unknown names throw.\n * @param name - the canonical plane name.\n * @param origin - the plane origin (default [0,0,0]).\n * @returns the plane frame.\n */\nexport function namedPlane(name: string, origin: Vec3Input = { x: 0, y: 0, z: 0 }): Plane {\n const cfg = NAMED_PLANES[name]\n if (!cfg) throw new Error(`unknown plane '${name}' (expected XY | XZ | YZ | front/back/left/right/top/bottom)`)\n return makePlane(toVec3(origin), cfg.zDir, cfg.xDir)\n}\n\n/**\n * Map a 2D point `(x, y)` into 3D on a plane frame:\n * `origin + x*xDir + y*yDir`. This is the per-point lift used by curve lifting.\n * @param plane - the target plane.\n * @param x - the 2D `x` coordinate.\n * @param y - the 2D `y` coordinate.\n * @returns the 3D point on the plane.\n */\nexport function liftPointToPlane(plane: Plane, x: number, y: number): Vec3 {\n const { origin: o, xDir: u, yDir: v } = plane\n return { x: o.x + x * u.x + y * v.x, y: o.y + x * u.y + y * v.y, z: o.z + x * u.z + y * v.z }\n}\n/**\n * Project a 3D point onto a plane's 2D coordinates — the inverse of\n * {@link liftPointToPlane}. Computes `d = p − origin` and returns\n * `(u, v) = (d·xDir, d·yDir)`. Because `xDir`/`yDir` are orthonormal this is the\n * orthogonal projection: the component of `d` along `zDir` (the plane normal) is\n * dropped. A point already on the plane round-trips losslessly\n * (`worldToPlane(plane, liftPointToPlane(plane, u, v)) === {u, v}`); a point off\n * the plane projects to the foot of the perpendicular — the same behaviour as\n * dropping a sketch point onto its supporting face.\n * @param plane - the supporting plane frame.\n * @param p - the 3D point to project.\n * @returns the 2D `{ u, v }` coordinates on the plane.\n */\nexport function worldToPlane(plane: Plane, p: Vec3Input): { u: number; v: number } {\n const { origin: o, xDir: u, yDir: v } = plane\n const q = toVec3(p)\n const d: Vec3 = { x: q.x - o.x, y: q.y - o.y, z: q.z - o.z }\n return { u: dot(d, u), v: dot(d, v) }\n}"]}
@@ -6,7 +6,7 @@
6
6
  * - discriminant field renamed `__bk2d` → `kind2d` (2026-09-27 decision),
7
7
  * bbox discriminant `__bk2d_bbox` → `kind2d_b`.
8
8
  * - All curves are plain data objects (no kernel handles, no dispose), per the
9
- * faijs "2D curves are pure objects" design (docs/plans/2d-sketching: A1/B1).
9
+ * faijs "2D curves are pure objects" design.
10
10
  *
11
11
  * Pure TS, zero WASM, zero external deps. All 2D curves represented as plain
12
12
  * objects with a `kind2d` discriminant.
@@ -6,7 +6,7 @@
6
6
  * - discriminant field renamed `__bk2d` → `kind2d` (2026-09-27 decision),
7
7
  * bbox discriminant `__bk2d_bbox` → `kind2d_b`.
8
8
  * - All curves are plain data objects (no kernel handles, no dispose), per the
9
- * faijs "2D curves are pure objects" design (docs/plans/2d-sketching: A1/B1).
9
+ * faijs "2D curves are pure objects" design.
10
10
  *
11
11
  * Pure TS, zero WASM, zero external deps. All 2D curves represented as plain
12
12
  * objects with a `kind2d` discriminant.