@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
@@ -10,7 +10,7 @@
10
10
  * 1. single-kernel assert (D10) — library code never installs a kernel;
11
11
  * 2. D11 dual-form normalization — object form → positional form, in the
12
12
  * exported function (§4.2 「归一化位置」), not in a script-side adapter;
13
- * 3. the vendored call itself, through `callBrepjs` (Result shape preserved).
13
+ * 3. the brepjs call itself, through `callBrepjs` (Result shape preserved).
14
14
  *
15
15
  * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it
16
16
  * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line
@@ -28,7 +28,7 @@ import { getBackends } from '../../runtime-state.js';
28
28
  * Reads the configured backend's kernel slot, guarding against the throw that
29
29
  * `getBackends()` performs before host configuration. Falls back to the core
30
30
  * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs
31
- * registry 随子包删除——此处只问「core registry 是否已有激活 brep 引擎」)
31
+ * registry 已内化到 core——此处只问「core registry 是否已有激活 brep 引擎」)
32
32
  * when nothing is configured.
33
33
  *
34
34
  * @param name - op name, used in the guiding error message.
@@ -50,10 +50,10 @@ export function assertKernelBound(name) {
50
50
  }
51
51
  }
52
52
  /**
53
- * Project a vendored brepjs function onto the faijs TS compat face.
53
+ * Project a brepjs function onto the faijs TS compat face.
54
54
  *
55
55
  * The returned function is brepjs-shaped: positional arguments in, `Result`
56
- * (or whatever the vendored function returns) out — no faijs `Shape`, no
56
+ * (or whatever the brepjs function returns) out — no faijs `Shape`, no
57
57
  * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job
58
58
  * (§4.3.2 steps 4/5), which is why the script face can wrap the very same
59
59
  * projection the TS face exports.
@@ -62,7 +62,7 @@ export function assertKernelBound(name) {
62
62
  * @param params - machine parameter-name table (object form → positional).
63
63
  * @param formClass - D11 form class (A single-name dual-form / B1 options-only /
64
64
  * B2 two names).
65
- * @param impl - the vendored function.
65
+ * @param impl - the brepjs function.
66
66
  * @returns the projected compat op.
67
67
  */
68
68
  export function projectBrepOp(name, params, formClass, impl) {
@@ -1 +1 @@
1
- {"version":3,"file":"compat-projection.js","sourceRoot":"","sources":["../../../src/api/internal/compat-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,CAAC;QACH,WAAW,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,gEAAgE;YAC7E,0DAA0D,IAAI,SAAS;YACvE,+CAA+C,CAClD,CAAA;IACH,CAAC;AACH,CAAC;AAKD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAgB,EAChB,SAAoB,EACpB,IAAmC;IAEnC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;QAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QACjE,OAAO,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACrC,CAAC,CAAA;AACH,CAAC","sourcesContent":["/**\n * compat-projection — the single BREP-TS projection wrapper factory (P23, §4.2).\n *\n * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2\n *\n * Every symbol on the TS compat face and every generated `compatOp` op funnels\n * through {@link projectBrepOp}. That is what makes the generated face and the\n * hand-curated `api/brepjs-compat` face one mechanism rather than two:\n *\n * 1. single-kernel assert (D10) — library code never installs a kernel;\n * 2. D11 dual-form normalization — object form → positional form, in the\n * exported function (§4.2 「归一化位置」), not in a script-side adapter;\n * 3. the vendored call itself, through `callBrepjs` (Result shape preserved).\n *\n * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it\n * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line\n * per symbol instead of re-expanding the template for each op.\n *\n * @module\n */\n\nimport { resolveArgs, type FormClass } from './dual-form-args'\nimport { callBrepjs } from './l3-bridge'\nimport { getActiveBrepEngineId } from '../../brep/engine/registry'\nimport { getBackends } from '../../runtime-state'\n\n/**\n * Assert that a BREP kernel is bound before invoking a compat op.\n *\n * Reads the configured backend's kernel slot, guarding against the throw that\n * `getBackends()` performs before host configuration. Falls back to the core\n * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs\n * registry 随子包删除——此处只问「core registry 是否已有激活 brep 引擎」)\n * when nothing is configured.\n *\n * @param name - op name, used in the guiding error message.\n * @throws when no BREP kernel is bound (the message tells the host what to do,\n * because library code must never install a kernel itself — §4.2 rule 1).\n */\nexport function assertKernelBound(name: string): void {\n let kernelBound = false\n try {\n kernelBound = getBackends().kernel.brep != null\n } catch {\n // backends not configured yet — that is not an error, just no kernel\n }\n if (!kernelBound && getActiveBrepEngineId() === null) {\n throw new Error(\n `[compat:${name}] no BREP kernel bound; run host init/inject (e.g. initOcct + ` +\n `register the occt brep engine) before the first compat.${name} call. ` +\n `Library code must not install kernels itself.`\n )\n }\n}\n\n/** Signature of a projected compat op (inputs normalized before the call). */\nexport type CompatProjection = (...args: unknown[]) => unknown\n\n/**\n * Project a vendored brepjs function onto the faijs TS compat face.\n *\n * The returned function is brepjs-shaped: positional arguments in, `Result`\n * (or whatever the vendored function returns) out — no faijs `Shape`, no\n * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job\n * (§4.3.2 steps 4/5), which is why the script face can wrap the very same\n * projection the TS face exports.\n *\n * @param name - op name (error messages + D11 discriminant context).\n * @param params - machine parameter-name table (object form → positional).\n * @param formClass - D11 form class (A single-name dual-form / B1 options-only /\n * B2 two names).\n * @param impl - the vendored function.\n * @returns the projected compat op.\n */\nexport function projectBrepOp(\n name: string,\n params: string[],\n formClass: FormClass,\n impl: (...args: never[]) => unknown,\n): CompatProjection {\n return (...args: unknown[]) => {\n assertKernelBound(name)\n const positional = resolveArgs(args, { name, params, formClass })\n return callBrepjs(impl, positional)\n }\n}\n"]}
1
+ {"version":3,"file":"compat-projection.js","sourceRoot":"","sources":["../../../src/api/internal/compat-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,CAAC;QACH,WAAW,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,qBAAqB,EAAE,KAAK,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CACb,WAAW,IAAI,gEAAgE;YAC7E,0DAA0D,IAAI,SAAS;YACvE,+CAA+C,CAClD,CAAA;IACH,CAAC;AACH,CAAC;AAKD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAgB,EAChB,SAAoB,EACpB,IAAmC;IAEnC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;QAC5B,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;QACjE,OAAO,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACrC,CAAC,CAAA;AACH,CAAC","sourcesContent":["/**\n * compat-projection — the single BREP-TS projection wrapper factory (P23, §4.2).\n *\n * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2\n *\n * Every symbol on the TS compat face and every generated `compatOp` op funnels\n * through {@link projectBrepOp}. That is what makes the generated face and the\n * hand-curated `api/brepjs-compat` face one mechanism rather than two:\n *\n * 1. single-kernel assert (D10) — library code never installs a kernel;\n * 2. D11 dual-form normalization — object form → positional form, in the\n * exported function (§4.2 「归一化位置」), not in a script-side adapter;\n * 3. the brepjs call itself, through `callBrepjs` (Result shape preserved).\n *\n * P21's `api/brepjs-compat` used a private copy of steps 1–3 (`wrapDual`); P23 lifts it\n * here so `gen-l3-surface.ts` can emit one `compatOp(projectBrepOp(…), …)` line\n * per symbol instead of re-expanding the template for each op.\n *\n * @module\n */\n\nimport { resolveArgs, type FormClass } from './dual-form-args'\nimport { callBrepjs } from './l3-bridge'\nimport { getActiveBrepEngineId } from '../../brep/engine/registry'\nimport { getBackends } from '../../runtime-state'\n\n/**\n * Assert that a BREP kernel is bound before invoking a compat op.\n *\n * Reads the configured backend's kernel slot, guarding against the throw that\n * `getBackends()` performs before host configuration. Falls back to the core\n * engine-registry activation flag(2026-09-25 core-decouple wrapup:brepjs\n * registry 已内化到 core——此处只问「core registry 是否已有激活 brep 引擎」)\n * when nothing is configured.\n *\n * @param name - op name, used in the guiding error message.\n * @throws when no BREP kernel is bound (the message tells the host what to do,\n * because library code must never install a kernel itself — §4.2 rule 1).\n */\nexport function assertKernelBound(name: string): void {\n let kernelBound = false\n try {\n kernelBound = getBackends().kernel.brep != null\n } catch {\n // backends not configured yet — that is not an error, just no kernel\n }\n if (!kernelBound && getActiveBrepEngineId() === null) {\n throw new Error(\n `[compat:${name}] no BREP kernel bound; run host init/inject (e.g. initOcct + ` +\n `register the occt brep engine) before the first compat.${name} call. ` +\n `Library code must not install kernels itself.`\n )\n }\n}\n\n/** Signature of a projected compat op (inputs normalized before the call). */\nexport type CompatProjection = (...args: unknown[]) => unknown\n\n/**\n * Project a brepjs function onto the faijs TS compat face.\n *\n * The returned function is brepjs-shaped: positional arguments in, `Result`\n * (or whatever the brepjs function returns) out — no faijs `Shape`, no\n * adoption. Adoption and the statement-boundary unwrap are `compatOp`'s job\n * (§4.3.2 steps 4/5), which is why the script face can wrap the very same\n * projection the TS face exports.\n *\n * @param name - op name (error messages + D11 discriminant context).\n * @param params - machine parameter-name table (object form → positional).\n * @param formClass - D11 form class (A single-name dual-form / B1 options-only /\n * B2 two names).\n * @param impl - the brepjs function.\n * @returns the projected compat op.\n */\nexport function projectBrepOp(\n name: string,\n params: string[],\n formClass: FormClass,\n impl: (...args: never[]) => unknown,\n): CompatProjection {\n return (...args: unknown[]) => {\n assertKernelBound(name)\n const positional = resolveArgs(args, { name, params, formClass })\n return callBrepjs(impl, positional)\n }\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * dual-form-args — D11 参数双形态归一化判别器
3
3
  *
4
- * 设计文档:docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2
5
- *
6
4
  * 本文件实现参数双形态归一化(D11):
7
5
  * - A 类(明显可区分):单名双形态,函数内部按参数形态切换实现
8
6
  * - B1 类(人类看来不明显):单名单形态,brepjs options 对象即唯一对象形态
@@ -1 +1 @@
1
- {"version":3,"file":"dual-form-args.d.ts","sourceRoot":"","sources":["../../../src/api/internal/dual-form-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,YAAY;AACZ,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA;AAEzC,YAAY;AACZ,MAAM,WAAW,OAAO;IACtB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,YAAY;IACZ,SAAS,EAAE,SAAS,CAAA;CACrB;AAOD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAQrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,EAAE,CAUX;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAgCrE;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,eAAe;IACf,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,CA0BhF;AAMD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,IAAI,EAAE,MAAM,EAAE,CAAA;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAWD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAoD1F"}
1
+ {"version":3,"file":"dual-form-args.d.ts","sourceRoot":"","sources":["../../../src/api/internal/dual-form-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,YAAY;AACZ,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA;AAEzC,YAAY;AACZ,MAAM,WAAW,OAAO;IACtB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,YAAY;IACZ,SAAS,EAAE,SAAS,CAAA;CACrB;AAOD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAQrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,EAAE,CAUX;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAgCrE;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,eAAe;IACf,YAAY,EAAE,OAAO,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,CA0BhF;AAMD;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,OAAO;IACtB;;;;OAIG;IACH,IAAI,EAAE,MAAM,EAAE,CAAA;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAWD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAoD1F"}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * dual-form-args — D11 参数双形态归一化判别器
3
3
  *
4
- * 设计文档:docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2
5
- *
6
4
  * 本文件实现参数双形态归一化(D11):
7
5
  * - A 类(明显可区分):单名双形态,函数内部按参数形态切换实现
8
6
  * - B1 类(人类看来不明显):单名单形态,brepjs options 对象即唯一对象形态
@@ -21,7 +19,7 @@
21
19
  * B2 条目不走判别器(两个名字各自固定形态)。
22
20
  */
23
21
  import { isShape } from '../../shape.js';
24
- /** 句柄类型守卫(vendored 句柄有 .wrapped 属性)。 */
22
+ /** 句柄类型守卫(compat 句柄有 .wrapped 属性)。 */
25
23
  function isHandleLike(v) {
26
24
  return typeof v === 'object' && v !== null && 'wrapped' in v;
27
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dual-form-args.js","sourceRoot":"","sources":["../../../src/api/internal/dual-form-args.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dual-form-args — D11 参数双形态归一化判别器\n *\n * 设计文档:docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.2 / §4.3.2\n *\n * 本文件实现参数双形态归一化(D11):\n * - A 类(明显可区分):单名双形态,函数内部按参数形态切换实现\n * - B1 类(人类看来不明显):单名单形态,brepjs options 对象即唯一对象形态\n * - B2 类(人类看来不明显):双名,brepjs 形态占正名,faijs 对象形态加描述性后缀\n *\n * 判别规则:\n * 1. 首参是 plain object(Object.getPrototypeOf(a) === Object.prototype)\n * 且非 Shape、非句柄、非数组 → 对象形态\n * 2. 否则 → 位置形态\n *\n * 对象形态映射:\n * - 按 params 表(机器参数名)将对象键映射为位置数组\n * - 缺省键 → undefined\n * - 对象形态含 params 外未知键 → 抛 E_ARGS_FORM\n *\n * B2 条目不走判别器(两个名字各自固定形态)。\n */\n\nimport { isShape } from '../../shape'\n\n/** 形态分类。 */\nexport type FormClass = 'A' | 'B1' | 'B2'\n\n/** 参数规格。 */\nexport interface ArgSpec {\n /** op 名(错误信息用)。 */\n name: string\n /** 机器参数名表(按位置顺序),用于对象形态→位置数组映射。 */\n params?: string[]\n /** 形态分类。 */\n formClass: FormClass\n}\n\n/** 句柄类型守卫(vendored 句柄有 .wrapped 属性)。 */\nfunction isHandleLike(v: unknown): boolean {\n return typeof v === 'object' && v !== null && 'wrapped' in v\n}\n\n/**\n * 判定参数是否为对象形态。\n *\n * 判别式(全仓统一):\n * - 首参是 plain object(Object.getPrototypeOf(a) === Object.prototype)\n * - 且非 Shape、非句柄、非数组\n *\n * @param args - 调用参数数组\n * @returns 是否为对象形态\n */\nexport function isObjectForm(args: unknown[]): boolean {\n if (args.length === 0) return false\n const first = args[0]\n if (first === null || typeof first !== 'object') return false\n if (Array.isArray(first)) return false\n if (isShape(first)) return false\n if (isHandleLike(first)) return false\n return Object.getPrototypeOf(first) === Object.prototype\n}\n\n/**\n * 将对象形态参数归一化为位置数组。\n *\n * @param obj - 对象形态参数\n * @param params - 机器参数名表\n * @param opName - op 名(错误信息用)\n * @returns 位置数组(缺省键 → undefined)\n * @throws E_ARGS_FORM 对象含 params 外未知键时\n */\nexport function normalizeObjectForm(\n obj: Record<string, unknown>,\n params: string[],\n opName: string,\n): unknown[] {\n const keys = Object.keys(obj)\n const unknownKeys = keys.filter(k => !params.includes(k))\n if (unknownKeys.length > 0) {\n throw new Error(\n `[faijs/args] ${opName}: E_ARGS_FORM: unexpected parameter(s): ${unknownKeys.join(', ')}. ` +\n `Expected: ${params.join(', ')}`\n )\n }\n return params.map(k => obj[k])\n}\n\n/**\n * 参数双形态归一化判别器。\n *\n * 根据 args 和 spec 归一化参数:\n * - B2 条目:直接返回原样(两个名字各自固定形态)\n * - B1 条目:直接返回原样(brepjs options 对象即唯一对象形态,§4.2「无需判别」)\n * - 对象形态:按 params 表映射为位置数组\n * - 位置形态:直接返回原样\n *\n * B1 为何原样返回:B1 的 brepjs 位置形态首参本身就是配置对象(如\n * `thread(options: ThreadOptions)`),对象形态与它在首参上撞型,判别式失效;\n * 方案 §4.2 B1 的定义即「faijs 侧无独立对象 schema 时,直接以 brepjs options\n * 对象为唯一对象形态(单名单形态,无需判别)」。若在此处按 params 表归一,\n * 任何 options 键都会因不在 params 表里而误抛 E_ARGS_FORM。\n *\n * @param args - 调用参数数组\n * @param spec - 参数规格\n * @returns 归一化后的参数数组\n * @throws E_ARGS_FORM 形态无法匹配或对象含未知键时\n */\nexport function resolveArgs(args: unknown[], spec: ArgSpec): unknown[] {\n // B2 条目不走判别器(两个名字各自固定形态)\n if (spec.formClass === 'B2') {\n return args\n }\n // B1 条目:brepjs options 对象即唯一对象形态,无需判别(§4.2)\n if (spec.formClass === 'B1') {\n return args\n }\n\n // 无 params 表时无法归一化对象形态,只能接受位置形态\n if (!spec.params) {\n if (isObjectForm(args)) {\n throw new Error(\n `[faijs/args] ${spec.name}: E_ARGS_FORM: object form requires params specification`\n )\n }\n return args\n }\n\n // 判定形态\n if (isObjectForm(args)) {\n // 对象形态 → 位置数组\n return normalizeObjectForm(\n args[0] as Record<string, unknown>,\n spec.params,\n spec.name,\n )\n }\n\n // 位置形态 → 原样返回\n return args\n}\n\n/**\n * 双形态归一化结果。\n *\n * 包含归一化后的参数和是否为对象形态的标记。\n */\nexport interface ResolvedArgs {\n /** 归一化后的参数数组。 */\n args: unknown[]\n /** 是否为对象形态。 */\n isObjectForm: boolean\n}\n\n/**\n * 参数双形态归一化判别器(带形态信息)。\n *\n * 与 resolveArgs 相同,但返回形态信息。\n *\n * @param args - 调用参数数组\n * @param spec - 参数规格\n * @returns 归一化结果\n */\nexport function resolveArgsWithInfo(args: unknown[], spec: ArgSpec): ResolvedArgs {\n if (spec.formClass === 'B2' || spec.formClass === 'B1') {\n return { args, isObjectForm: false }\n }\n\n if (!spec.params) {\n if (isObjectForm(args)) {\n throw new Error(\n `[faijs/args] ${spec.name}: E_ARGS_FORM: object form requires params specification`\n )\n }\n return { args, isObjectForm: false }\n }\n\n if (isObjectForm(args)) {\n return {\n args: normalizeObjectForm(\n args[0] as Record<string, unknown>,\n spec.params,\n spec.name,\n ),\n isObjectForm: true,\n }\n }\n\n return { args, isObjectForm: false }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 反方向:位置形态 → 对象形态(faijs 特有 dual op,impl 原生对象形态)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 位置形态声明(D11 反方向,§4.2「归一方向 = 位置→对象」)。\n *\n * faijs 特有 dual op 的 impl 是对象形态原生(`box(width, depth, height)` 经\n * 装箱为 `{ width, depth, height, ... }`,`translate(shape, { offset })`),brepjs 生态\n * 的位置形态(`box(10, 20, 30, { centered: true })` / `translate(shape, 1, 0, 0)`)\n * 需先归一成对象形态。\n * 声明式而非 if 分支:op 作者只列「哪个键吃几个位置参数」,判别与装箱由\n * {@link positionalToObject} 统一完成。\n *\n * 与语句层的 `StatementSummary.positional`(位置实参**值**)以及投影侧的\n * `ArgSpec.params`(对象→位置**参数名表**)是三个不同概念:`SlotMap` 是\n * 位置槽→对象键的**装箱声明**(位置→对象,D11 反方向;§9 命名区分)。\n */\nexport interface SlotMap {\n /**\n * 对象形态键名,按位置顺序(只描述 Shape 之后的**非几何**形参)。\n * 例:`box(10, 20, 30)` → `keys: ['size']`;`cylinder(5, 40)` →\n * `keys: ['radius', 'height']`。\n */\n keys: string[]\n /**\n * 哪些键是 vec3 槽位(吃掉最多 3 个连续位置参数)。\n * 1 个 → 标量(number 或数组原样);2~3 个 → `[x, y(, z)]` 数组。\n * 例:`box(10)` → `{ size: 10 }`;`box(10, 20, 30)` → `{ size: [10, 20, 30] }`。\n */\n vec3Keys?: string[]\n /**\n * 前置 Shape 形参个数(原样透传,不参与装箱),缺省 0。\n * 例:`translate(shape, 1, 0, 0)` → `shapeArity: 1`。\n */\n shapeArity?: number\n}\n\n/** 判定值是否是可作为对象形态形参的 plain object(与 {@link isObjectForm} 同判别式)。 */\nfunction isPlainObjectValue(v: unknown): boolean {\n if (v === null || typeof v !== 'object') return false\n if (Array.isArray(v)) return false\n if (isShape(v)) return false\n if (isHandleLike(v)) return false\n return Object.getPrototypeOf(v) === Object.prototype\n}\n\n/**\n * 位置形态 → 对象形态归一(faijs 特有 dual op 的 D11 反方向)。\n *\n * 触发条件:声明了 slotMap 且对象槽位(第 `shapeArity` 个实参)不是\n * plain object。已是对象形态或实参不足时原样返回(交由 op 自身的断言报错)。\n *\n * @param args - 调用参数数组\n * @param form - slotMap 声明(位置槽→对象键装箱表)\n * @param name - op 名(错误信息用)\n * @returns 归一后的参数数组(前置 Shape 原样 + 末尾一个对象形态参数)\n * @throws E_ARGS_FORM 位置参数个数与声明的槽位不匹配时\n */\nexport function positionalToObject(args: unknown[], form: SlotMap, name: string): unknown[] {\n const shapeArity = form.shapeArity ?? 0\n if (args.length <= shapeArity) return args // 无位置形参可装箱 → 原样(op 断言报错)\n if (isPlainObjectValue(args[shapeArity])) return args // 已是对象形态\n\n const rest = args.slice(shapeArity)\n const obj: Record<string, unknown> = {}\n let i = 0\n for (const key of form.keys) {\n if (i >= rest.length) break\n // §6.2 尾参 options:当前实参是 plain object(候选尾参 options)→ 停止装箱\n // 交给下方 options 合并,不让任何槽位把它吞进拓扑参数\n // (`box(20,{centered:true})` / `cylinder(5,40,{centered:true})`)。\n if (isPlainObjectValue(rest[i])) break\n if (form.vec3Keys?.includes(key)) {\n // vec3 槽位:吃掉最多 3 个连续实参(1 个 → 标量,2~3 个 → 数组)。\n // 若剩余序列最末是 plain object(候选尾参 options),先为它留位,不让\n // 跨槽 vec3 把 options 吞进拓扑参数(`box(10,20,30,{centered:true})`)。\n const avail = rest.length - i\n const reserveOptions = avail > 1 && isPlainObjectValue(rest[rest.length - 1]) ? 1 : 0\n const take = Math.min(3, avail - reserveOptions)\n const chunk = rest.slice(i, i + take)\n obj[key] = take === 1 ? chunk[0] : chunk\n i += take\n continue\n }\n obj[key] = rest[i]\n i += 1\n }\n // D11 尾参 options 合并(§6.2):位置槽装箱后,若剩余实参恰好 1 个且为\n // plain object → 作为 options 并入 args。让 `box(10,20,30,{centered:true})`、\n // `sphere(5,{at,segments})`、`cylinder(5,40,{centered:true})` 在脚本面可用。\n if (i < rest.length) {\n if (rest.length - i === 1 && isPlainObjectValue(rest[i])) {\n const opts = rest[i] as Record<string, unknown>\n const dup = Object.keys(opts).filter((k) => form.keys.includes(k) || k in obj)\n if (dup.length > 0) {\n throw new Error(\n `[faijs/args] ${name}: E_ARGS_FORM: option key(s) ${dup.join(', ')} ` +\n `conflict with positional slot(s) (${form.keys.join(', ')})`\n )\n }\n Object.assign(obj, opts)\n return [...args.slice(0, shapeArity), obj]\n }\n throw new Error(\n `[faijs/args] ${name}: E_ARGS_FORM: expected ${form.keys.join(', ')} ` +\n `(${form.keys.length} positional slot(s)); got ${rest.length} value(s): ` +\n rest.map((a) => (typeof a === 'object' ? '[object]' : String(a))).join(', ')\n )\n }\n return [...args.slice(0, shapeArity), obj]\n}\n"]}
1
+ {"version":3,"file":"dual-form-args.js","sourceRoot":"","sources":["../../../src/api/internal/dual-form-args.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dual-form-args — D11 参数双形态归一化判别器\n *\n * 本文件实现参数双形态归一化(D11):\n * - A 类(明显可区分):单名双形态,函数内部按参数形态切换实现\n * - B1 类(人类看来不明显):单名单形态,brepjs options 对象即唯一对象形态\n * - B2 类(人类看来不明显):双名,brepjs 形态占正名,faijs 对象形态加描述性后缀\n *\n * 判别规则:\n * 1. 首参是 plain object(Object.getPrototypeOf(a) === Object.prototype)\n * 且非 Shape、非句柄、非数组 → 对象形态\n * 2. 否则 → 位置形态\n *\n * 对象形态映射:\n * - 按 params 表(机器参数名)将对象键映射为位置数组\n * - 缺省键 → undefined\n * - 对象形态含 params 外未知键 → 抛 E_ARGS_FORM\n *\n * B2 条目不走判别器(两个名字各自固定形态)。\n */\n\nimport { isShape } from '../../shape'\n\n/** 形态分类。 */\nexport type FormClass = 'A' | 'B1' | 'B2'\n\n/** 参数规格。 */\nexport interface ArgSpec {\n /** op 名(错误信息用)。 */\n name: string\n /** 机器参数名表(按位置顺序),用于对象形态→位置数组映射。 */\n params?: string[]\n /** 形态分类。 */\n formClass: FormClass\n}\n\n/** 句柄类型守卫(compat 句柄有 .wrapped 属性)。 */\nfunction isHandleLike(v: unknown): boolean {\n return typeof v === 'object' && v !== null && 'wrapped' in v\n}\n\n/**\n * 判定参数是否为对象形态。\n *\n * 判别式(全仓统一):\n * - 首参是 plain object(Object.getPrototypeOf(a) === Object.prototype)\n * - 且非 Shape、非句柄、非数组\n *\n * @param args - 调用参数数组\n * @returns 是否为对象形态\n */\nexport function isObjectForm(args: unknown[]): boolean {\n if (args.length === 0) return false\n const first = args[0]\n if (first === null || typeof first !== 'object') return false\n if (Array.isArray(first)) return false\n if (isShape(first)) return false\n if (isHandleLike(first)) return false\n return Object.getPrototypeOf(first) === Object.prototype\n}\n\n/**\n * 将对象形态参数归一化为位置数组。\n *\n * @param obj - 对象形态参数\n * @param params - 机器参数名表\n * @param opName - op 名(错误信息用)\n * @returns 位置数组(缺省键 → undefined)\n * @throws E_ARGS_FORM 对象含 params 外未知键时\n */\nexport function normalizeObjectForm(\n obj: Record<string, unknown>,\n params: string[],\n opName: string,\n): unknown[] {\n const keys = Object.keys(obj)\n const unknownKeys = keys.filter(k => !params.includes(k))\n if (unknownKeys.length > 0) {\n throw new Error(\n `[faijs/args] ${opName}: E_ARGS_FORM: unexpected parameter(s): ${unknownKeys.join(', ')}. ` +\n `Expected: ${params.join(', ')}`\n )\n }\n return params.map(k => obj[k])\n}\n\n/**\n * 参数双形态归一化判别器。\n *\n * 根据 args 和 spec 归一化参数:\n * - B2 条目:直接返回原样(两个名字各自固定形态)\n * - B1 条目:直接返回原样(brepjs options 对象即唯一对象形态,§4.2「无需判别」)\n * - 对象形态:按 params 表映射为位置数组\n * - 位置形态:直接返回原样\n *\n * B1 为何原样返回:B1 的 brepjs 位置形态首参本身就是配置对象(如\n * `thread(options: ThreadOptions)`),对象形态与它在首参上撞型,判别式失效;\n * 方案 §4.2 B1 的定义即「faijs 侧无独立对象 schema 时,直接以 brepjs options\n * 对象为唯一对象形态(单名单形态,无需判别)」。若在此处按 params 表归一,\n * 任何 options 键都会因不在 params 表里而误抛 E_ARGS_FORM。\n *\n * @param args - 调用参数数组\n * @param spec - 参数规格\n * @returns 归一化后的参数数组\n * @throws E_ARGS_FORM 形态无法匹配或对象含未知键时\n */\nexport function resolveArgs(args: unknown[], spec: ArgSpec): unknown[] {\n // B2 条目不走判别器(两个名字各自固定形态)\n if (spec.formClass === 'B2') {\n return args\n }\n // B1 条目:brepjs options 对象即唯一对象形态,无需判别(§4.2)\n if (spec.formClass === 'B1') {\n return args\n }\n\n // 无 params 表时无法归一化对象形态,只能接受位置形态\n if (!spec.params) {\n if (isObjectForm(args)) {\n throw new Error(\n `[faijs/args] ${spec.name}: E_ARGS_FORM: object form requires params specification`\n )\n }\n return args\n }\n\n // 判定形态\n if (isObjectForm(args)) {\n // 对象形态 → 位置数组\n return normalizeObjectForm(\n args[0] as Record<string, unknown>,\n spec.params,\n spec.name,\n )\n }\n\n // 位置形态 → 原样返回\n return args\n}\n\n/**\n * 双形态归一化结果。\n *\n * 包含归一化后的参数和是否为对象形态的标记。\n */\nexport interface ResolvedArgs {\n /** 归一化后的参数数组。 */\n args: unknown[]\n /** 是否为对象形态。 */\n isObjectForm: boolean\n}\n\n/**\n * 参数双形态归一化判别器(带形态信息)。\n *\n * 与 resolveArgs 相同,但返回形态信息。\n *\n * @param args - 调用参数数组\n * @param spec - 参数规格\n * @returns 归一化结果\n */\nexport function resolveArgsWithInfo(args: unknown[], spec: ArgSpec): ResolvedArgs {\n if (spec.formClass === 'B2' || spec.formClass === 'B1') {\n return { args, isObjectForm: false }\n }\n\n if (!spec.params) {\n if (isObjectForm(args)) {\n throw new Error(\n `[faijs/args] ${spec.name}: E_ARGS_FORM: object form requires params specification`\n )\n }\n return { args, isObjectForm: false }\n }\n\n if (isObjectForm(args)) {\n return {\n args: normalizeObjectForm(\n args[0] as Record<string, unknown>,\n spec.params,\n spec.name,\n ),\n isObjectForm: true,\n }\n }\n\n return { args, isObjectForm: false }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 反方向:位置形态 → 对象形态(faijs 特有 dual op,impl 原生对象形态)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 位置形态声明(D11 反方向,§4.2「归一方向 = 位置→对象」)。\n *\n * faijs 特有 dual op 的 impl 是对象形态原生(`box(width, depth, height)` 经\n * 装箱为 `{ width, depth, height, ... }`,`translate(shape, { offset })`),brepjs 生态\n * 的位置形态(`box(10, 20, 30, { centered: true })` / `translate(shape, 1, 0, 0)`)\n * 需先归一成对象形态。\n * 声明式而非 if 分支:op 作者只列「哪个键吃几个位置参数」,判别与装箱由\n * {@link positionalToObject} 统一完成。\n *\n * 与语句层的 `StatementSummary.positional`(位置实参**值**)以及投影侧的\n * `ArgSpec.params`(对象→位置**参数名表**)是三个不同概念:`SlotMap` 是\n * 位置槽→对象键的**装箱声明**(位置→对象,D11 反方向;§9 命名区分)。\n */\nexport interface SlotMap {\n /**\n * 对象形态键名,按位置顺序(只描述 Shape 之后的**非几何**形参)。\n * 例:`box(10, 20, 30)` → `keys: ['size']`;`cylinder(5, 40)` →\n * `keys: ['radius', 'height']`。\n */\n keys: string[]\n /**\n * 哪些键是 vec3 槽位(吃掉最多 3 个连续位置参数)。\n * 1 个 → 标量(number 或数组原样);2~3 个 → `[x, y(, z)]` 数组。\n * 例:`box(10)` → `{ size: 10 }`;`box(10, 20, 30)` → `{ size: [10, 20, 30] }`。\n */\n vec3Keys?: string[]\n /**\n * 前置 Shape 形参个数(原样透传,不参与装箱),缺省 0。\n * 例:`translate(shape, 1, 0, 0)` → `shapeArity: 1`。\n */\n shapeArity?: number\n}\n\n/** 判定值是否是可作为对象形态形参的 plain object(与 {@link isObjectForm} 同判别式)。 */\nfunction isPlainObjectValue(v: unknown): boolean {\n if (v === null || typeof v !== 'object') return false\n if (Array.isArray(v)) return false\n if (isShape(v)) return false\n if (isHandleLike(v)) return false\n return Object.getPrototypeOf(v) === Object.prototype\n}\n\n/**\n * 位置形态 → 对象形态归一(faijs 特有 dual op 的 D11 反方向)。\n *\n * 触发条件:声明了 slotMap 且对象槽位(第 `shapeArity` 个实参)不是\n * plain object。已是对象形态或实参不足时原样返回(交由 op 自身的断言报错)。\n *\n * @param args - 调用参数数组\n * @param form - slotMap 声明(位置槽→对象键装箱表)\n * @param name - op 名(错误信息用)\n * @returns 归一后的参数数组(前置 Shape 原样 + 末尾一个对象形态参数)\n * @throws E_ARGS_FORM 位置参数个数与声明的槽位不匹配时\n */\nexport function positionalToObject(args: unknown[], form: SlotMap, name: string): unknown[] {\n const shapeArity = form.shapeArity ?? 0\n if (args.length <= shapeArity) return args // 无位置形参可装箱 → 原样(op 断言报错)\n if (isPlainObjectValue(args[shapeArity])) return args // 已是对象形态\n\n const rest = args.slice(shapeArity)\n const obj: Record<string, unknown> = {}\n let i = 0\n for (const key of form.keys) {\n if (i >= rest.length) break\n // §6.2 尾参 options:当前实参是 plain object(候选尾参 options)→ 停止装箱\n // 交给下方 options 合并,不让任何槽位把它吞进拓扑参数\n // (`box(20,{centered:true})` / `cylinder(5,40,{centered:true})`)。\n if (isPlainObjectValue(rest[i])) break\n if (form.vec3Keys?.includes(key)) {\n // vec3 槽位:吃掉最多 3 个连续实参(1 个 → 标量,2~3 个 → 数组)。\n // 若剩余序列最末是 plain object(候选尾参 options),先为它留位,不让\n // 跨槽 vec3 把 options 吞进拓扑参数(`box(10,20,30,{centered:true})`)。\n const avail = rest.length - i\n const reserveOptions = avail > 1 && isPlainObjectValue(rest[rest.length - 1]) ? 1 : 0\n const take = Math.min(3, avail - reserveOptions)\n const chunk = rest.slice(i, i + take)\n obj[key] = take === 1 ? chunk[0] : chunk\n i += take\n continue\n }\n obj[key] = rest[i]\n i += 1\n }\n // D11 尾参 options 合并(§6.2):位置槽装箱后,若剩余实参恰好 1 个且为\n // plain object → 作为 options 并入 args。让 `box(10,20,30,{centered:true})`、\n // `sphere(5,{at,segments})`、`cylinder(5,40,{centered:true})` 在脚本面可用。\n if (i < rest.length) {\n if (rest.length - i === 1 && isPlainObjectValue(rest[i])) {\n const opts = rest[i] as Record<string, unknown>\n const dup = Object.keys(opts).filter((k) => form.keys.includes(k) || k in obj)\n if (dup.length > 0) {\n throw new Error(\n `[faijs/args] ${name}: E_ARGS_FORM: option key(s) ${dup.join(', ')} ` +\n `conflict with positional slot(s) (${form.keys.join(', ')})`\n )\n }\n Object.assign(obj, opts)\n return [...args.slice(0, shapeArity), obj]\n }\n throw new Error(\n `[faijs/args] ${name}: E_ARGS_FORM: expected ${form.keys.join(', ')} ` +\n `(${form.keys.length} positional slot(s)); got ${rest.length} value(s): ` +\n rest.map((a) => (typeof a === 'object' ? '[object]' : String(a))).join(', ')\n )\n }\n return [...args.slice(0, shapeArity), obj]\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5
5
- *
6
4
  * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):
7
5
  * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的
8
6
  * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);
@@ -10,10 +8,10 @@
10
8
  * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是
11
9
  * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,
12
10
  * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件
13
- * 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。
11
+ * 自带最小实现:句柄类型视图 / disposal 解除(no-op)。
14
12
  *
15
13
  * 因此投影一个库函数只需三件事:
16
- * 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);
14
+ * 1. faijs Shape → 库输入:原样直传(faijs-native 库消费 core Shape);
17
15
  * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);
18
16
  * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`
19
17
  * (meshHandle + 身份槽登记,所有权转入 faijs)。
@@ -36,36 +34,6 @@ export interface BorrowedShapeHandle {
36
34
  /** Borrowed views never dispose, so callbacks never fire(no-op)。 */
37
35
  onDispose(callback: () => void): void;
38
36
  }
39
- /** occt-wasm 句柄对象视图(type + id,delete no-op)。 */
40
- export interface OcctWasmHandleView {
41
- __occtWasm: true;
42
- type: string;
43
- id: number;
44
- delete(): void;
45
- HashCode(upperBound: number): number;
46
- IsNull(): boolean;
47
- }
48
- /**
49
- * Borrow a faijs Shape's OCCT handle as a library-side shape handle.
50
- *
51
- * No ownership transfer: the borrowed view is a no-op-dispose wrapper of the
52
- * same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to
53
- * compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.
54
- *
55
- * `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a
56
- * branded number), but library code consumes shapes as *objects* (the
57
- * shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct
58
- * `shape.type` reads) — a raw number crashes there ("Invalid value used as weak
59
- * map key"). The id is therefore wrapped into a structurally valid
60
- * `OcctWasmHandleView`: the type is queried from the bound occt kernel through
61
- * `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —
62
- * the arena slot and its ownership are untouched).
63
- *
64
- * @param s - the faijs Shape whose brep slot is borrowed.
65
- * @returns a library-side ShapeHandle view of the same occt shape.
66
- * @throws when the Shape has no live BREP slot (mesh-only input on a brep op).
67
- */
68
- export declare function borrowBrepjsShape(s: Shape): BorrowedShapeHandle;
69
37
  /**
70
38
  * Adopt a library-side product into a faijs Shape.
71
39
  *
@@ -82,14 +50,14 @@ export declare function adoptBrepjsProduct(product: unknown, segments?: number):
82
50
  /**
83
51
  * Call a library function with a rebuilt positional argument list.
84
52
  *
85
- * Generated wrappers build `__args` positionally (borrowing geometry inputs,
86
- * passing value params through); a plain `fn(...args: unknown[])` spread fails
53
+ * Generated wrappers build `__args` positionally (geometry inputs pass through
54
+ * untouched, value params pass through as-is); a plain `fn(...args: unknown[])` spread fails
87
55
  * TS2556 against fixed-arity signatures, so the call goes through this
88
56
  * rest-typed bridge that preserves the function's own `ReturnType` (so a
89
57
  * `Result` return keeps `.ok`/`.value` for the generated unwrap code).
90
58
  *
91
59
  * @param fn the library function.
92
- * @param args the rebuilt positional argument list (borrowed handles + value params).
60
+ * @param args the rebuilt positional argument list (geometry inputs + value params).
93
61
  * @returns whatever the function returns (typed via ReturnType).
94
62
  */
95
63
  export declare function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F>;
@@ -1 +1 @@
1
- {"version":3,"file":"l3-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAY7C,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,yCAAyC;IACzC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IACxB,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CACtC;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,IAAI,IAAI,CAAA;IACd,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;IACpC,MAAM,IAAI,OAAO,CAAA;CAClB;AA8CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,GAAG,mBAAmB,CAY/D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAa7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAShF;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAkBxF"}
1
+ {"version":3,"file":"l3-bridge.d.ts","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAU7C,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,yCAAyC;IACzC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;IACxB,+BAA+B;IAC/B,MAAM,IAAI,IAAI,CAAA;IACd,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CACtC;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAa7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAEtG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAShF;AAQD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAkBxF"}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)
3
3
  *
4
- * 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5
5
- *
6
4
  * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):
7
5
  * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的
8
6
  * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);
@@ -10,10 +8,10 @@
10
8
  * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是
11
9
  * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,
12
10
  * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件
13
- * 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。
11
+ * 自带最小实现:句柄类型视图 / disposal 解除(no-op)。
14
12
  *
15
13
  * 因此投影一个库函数只需三件事:
16
- * 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);
14
+ * 1. faijs Shape → 库输入:原样直传(faijs-native 库消费 core Shape);
17
15
  * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);
18
16
  * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`
19
17
  * (meshHandle + 身份槽登记,所有权转入 faijs)。
@@ -22,80 +20,13 @@
22
20
  * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖
23
21
  * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。
24
22
  */
25
- import { brepOf } from '../../shape.js';
26
- import { fromHandle, getBrepApi } from '../../brep/handle-bridge.js';
23
+ import { fromHandle } from '../../brep/handle-bridge.js';
27
24
  import { getBackends } from '../../runtime-state.js';
28
25
  import { OpError } from './result-unwrap.js';
29
- const noopFn = () => { };
30
- /** Build an opaque kernel handle for an arena-allocated WASM shape. */
31
- function occtWasmHandleView(type, id) {
32
- return {
33
- __occtWasm: true,
34
- type,
35
- id,
36
- delete: noopFn,
37
- HashCode(upperBound) {
38
- return id % upperBound;
39
- },
40
- IsNull() {
41
- return false;
42
- },
43
- };
44
- }
45
- function isOcctWasmHandle(shape) {
46
- return typeof shape === 'object' && shape !== null && shape.__occtWasm === true;
47
- }
48
- /** Borrow view:不转移所有权、dispose 为 no-op(与 brepjs createBorrowedHandle 同语义)。 */
49
- function createBorrowedHandle(ocShape) {
50
- return {
51
- get wrapped() {
52
- return ocShape;
53
- },
54
- get disposed() {
55
- return false;
56
- },
57
- [Symbol.dispose]: noopFn,
58
- delete: noopFn,
59
- // Intentionally a no-op: a borrowed view never disposes, so a callback would
60
- // never fire. Tie dependent lifetimes to the owning parent's handle instead.
61
- onDispose: noopFn,
62
- };
63
- }
64
26
  /** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */
65
27
  function unregisterFromCleanup(_deletable) {
66
28
  // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)
67
29
  }
68
- /**
69
- * Borrow a faijs Shape's OCCT handle as a library-side shape handle.
70
- *
71
- * No ownership transfer: the borrowed view is a no-op-dispose wrapper of the
72
- * same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to
73
- * compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.
74
- *
75
- * `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a
76
- * branded number), but library code consumes shapes as *objects* (the
77
- * shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct
78
- * `shape.type` reads) — a raw number crashes there ("Invalid value used as weak
79
- * map key"). The id is therefore wrapped into a structurally valid
80
- * `OcctWasmHandleView`: the type is queried from the bound occt kernel through
81
- * `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —
82
- * the arena slot and its ownership are untouched).
83
- *
84
- * @param s - the faijs Shape whose brep slot is borrowed.
85
- * @returns a library-side ShapeHandle view of the same occt shape.
86
- * @throws when the Shape has no live BREP slot (mesh-only input on a brep op).
87
- */
88
- export function borrowBrepjsShape(s) {
89
- const solid = brepOf(s);
90
- if (solid === undefined) {
91
- throw new Error('[faijs/l3-bridge] E_BREP_ONLY_INPUT: operation requires a BREP-backed shape ' +
92
- '(mesh-only input cannot run on the brep path)');
93
- }
94
- const kernelShape = isOcctWasmHandle(solid)
95
- ? solid
96
- : occtWasmHandleView(getBrepApi().shapeType(solid), solid);
97
- return createBorrowedHandle(kernelShape);
98
- }
99
30
  /**
100
31
  * Adopt a library-side product into a faijs Shape.
101
32
  *
@@ -124,14 +55,14 @@ export function adoptBrepjsProduct(product, segments) {
124
55
  /**
125
56
  * Call a library function with a rebuilt positional argument list.
126
57
  *
127
- * Generated wrappers build `__args` positionally (borrowing geometry inputs,
128
- * passing value params through); a plain `fn(...args: unknown[])` spread fails
58
+ * Generated wrappers build `__args` positionally (geometry inputs pass through
59
+ * untouched, value params pass through as-is); a plain `fn(...args: unknown[])` spread fails
129
60
  * TS2556 against fixed-arity signatures, so the call goes through this
130
61
  * rest-typed bridge that preserves the function's own `ReturnType` (so a
131
62
  * `Result` return keeps `.ok`/`.value` for the generated unwrap code).
132
63
  *
133
64
  * @param fn the library function.
134
- * @param args the rebuilt positional argument list (borrowed handles + value params).
65
+ * @param args the rebuilt positional argument list (geometry inputs + value params).
135
66
  * @returns whatever the function returns (typed via ReturnType).
136
67
  */
137
68
  export function callBrepjs(fn, args) {
@@ -187,7 +118,7 @@ export function adoptEntity(product, opName, segments) {
187
118
  return prev;
188
119
  const type = h.wrapped.type;
189
120
  if (type !== undefined && type !== 'solid' && type !== 'compound') {
190
- throw new OpError(opName, 'E_SUBSHAPE_BOUNDARY', `[faijs/brepjs-compat] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +
121
+ throw new OpError(opName, 'E_SUBSHAPE_BOUNDARY', `[faijs/op] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +
191
122
  'must not cross the library boundary; return entity solids or plain data');
192
123
  }
193
124
  unregisterFromCleanup(h); // ★ R1: no-op(brepjs registry 已删除)
@@ -1 +1 @@
1
- {"version":3,"file":"l3-bridge.js","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)\n *\n * 设计文档:docs/plans/2026-09-02-faijs-api-surface-completion.md §E5\n *\n * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):\n * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的\n * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);\n * - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图\n * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是\n * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,\n * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件\n * 自带最小实现:borrow 视图 / 句柄类型视图 / disposal 解除(no-op)。\n *\n * 因此投影一个库函数只需三件事:\n * 1. faijs Shape → 库输入:`createBorrowedHandle(brepOf(s))`(借入,不转移所有权);\n * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);\n * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`\n * (meshHandle + 身份槽登记,所有权转入 faijs)。\n *\n * 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /\n * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖\n * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf } from '../../shape'\nimport { fromHandle, getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBackends } from '../../runtime-state'\nimport { OpError } from './result-unwrap'\n\n// ── brepjs 借用面最小自有化(core-decouple wrapup §4.3)──────────────────────\n// 原实现:@faicad/faijs-brepjs/core/disposal.js(createBorrowedHandle /\n// unregisterFromCleanup / ShapeHandle)与 kernel/occtWasm/helpers.js\n// (handle / isOcctWasmHandle)。brepjs 子包删除后按同语义内联。\n\n/** 库侧消费的 shape 句柄视图(borrowed:不拥有、不释放)。 */\nexport interface BorrowedShapeHandle {\n /** The raw kernel shape handle */\n readonly wrapped: unknown\n /** Manual dispose(borrowed 视图为 no-op) */\n [Symbol.dispose](): void\n /** Alias for Symbol.dispose */\n delete(): void\n /** Always false for a borrowed view */\n readonly disposed: boolean\n /** Borrowed views never dispose, so callbacks never fire(no-op)。 */\n onDispose(callback: () => void): void\n}\n\n/** occt-wasm 句柄对象视图(type + id,delete no-op)。 */\nexport interface OcctWasmHandleView {\n __occtWasm: true\n type: string\n id: number\n delete(): void\n HashCode(upperBound: number): number\n IsNull(): boolean\n}\n\nconst noopFn = (): void => {}\n\n/** Build an opaque kernel handle for an arena-allocated WASM shape. */\nfunction occtWasmHandleView(type: string, id: number): OcctWasmHandleView {\n return {\n __occtWasm: true,\n type,\n id,\n delete: noopFn,\n HashCode(upperBound: number) {\n return id % upperBound\n },\n IsNull() {\n return false\n },\n }\n}\n\nfunction isOcctWasmHandle(shape: unknown): shape is OcctWasmHandleView {\n return typeof shape === 'object' && shape !== null && (shape as OcctWasmHandleView).__occtWasm === true\n}\n\n/** Borrow view:不转移所有权、dispose 为 no-op(与 brepjs createBorrowedHandle 同语义)。 */\nfunction createBorrowedHandle(ocShape: unknown): BorrowedShapeHandle {\n return {\n get wrapped() {\n return ocShape\n },\n get disposed() {\n return false\n },\n [Symbol.dispose]: noopFn,\n delete: noopFn,\n // Intentionally a no-op: a borrowed view never disposes, so a callback would\n // never fire. Tie dependent lifetimes to the owning parent's handle instead.\n onDispose: noopFn,\n }\n}\n\n/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */\nfunction unregisterFromCleanup(_deletable: object): void {\n // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)\n}\n\n/**\n * Borrow a faijs Shape's OCCT handle as a library-side shape handle.\n *\n * No ownership transfer: the borrowed view is a no-op-dispose wrapper of the\n * same occt-wasm shape, valid while the faijs Shape owns it. Pass the result to\n * compatOp-projected functions that take `Shapeable<T>` / `AnyShape`.\n *\n * `brepOf` is a numeric arena id at runtime (occt-wasm's own `ShapeHandle` is a\n * branded number), but library code consumes shapes as *objects* (the\n * shapeTypeCache WeakMap key, `isOcctWasmHandle` discriminant, direct\n * `shape.type` reads) — a raw number crashes there (\"Invalid value used as weak\n * map key\"). The id is therefore wrapped into a structurally valid\n * `OcctWasmHandleView`: the type is queried from the bound occt kernel through\n * `getOcctKernel().getShapeType`, and the `delete` is a no-op (non-owning view —\n * the arena slot and its ownership are untouched).\n *\n * @param s - the faijs Shape whose brep slot is borrowed.\n * @returns a library-side ShapeHandle view of the same occt shape.\n * @throws when the Shape has no live BREP slot (mesh-only input on a brep op).\n */\nexport function borrowBrepjsShape(s: Shape): BorrowedShapeHandle {\n const solid = brepOf(s) as BrepHandle | undefined\n if (solid === undefined) {\n throw new Error(\n '[faijs/l3-bridge] E_BREP_ONLY_INPUT: operation requires a BREP-backed shape ' +\n '(mesh-only input cannot run on the brep path)',\n )\n }\n const kernelShape = isOcctWasmHandle(solid)\n ? solid\n : occtWasmHandleView(getBrepApi().shapeType(solid as never), solid as number)\n return createBorrowedHandle(kernelShape)\n}\n\n/**\n * Adopt a library-side product into a faijs Shape.\n *\n * Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'\n * identity slot via `fromHandle` — ownership transfers to faijs, and the library\n * wrapper must not dispose it afterwards (projected ops return it directly).\n *\n * @param product - a library-side shape (ShapeHandle / AnyShape family).\n * @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;\n * 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).\n * @returns the faijs Shape wrapping the same occt solid.\n */\nexport function adoptBrepjsProduct(product: unknown, segments?: number): Shape {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) {\n throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the library engine')\n }\n // library `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;\n // faijs' kernel meshShape expects the numeric shape id (fromHandle).\n const wrappedAny = (product as { wrapped: unknown }).wrapped\n const rawId =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : (wrappedAny as number)\n const wrapped = rawId as BrepHandle\n return fromHandle(wrapped, segments === undefined ? undefined : { segments })\n}\n\n/**\n * Call a library function with a rebuilt positional argument list.\n *\n * Generated wrappers build `__args` positionally (borrowing geometry inputs,\n * passing value params through); a plain `fn(...args: unknown[])` spread fails\n * TS2556 against fixed-arity signatures, so the call goes through this\n * rest-typed bridge that preserves the function's own `ReturnType` (so a\n * `Result` return keeps `.ok`/`.value` for the generated unwrap code).\n *\n * @param fn the library function.\n * @param args the rebuilt positional argument list (borrowed handles + value params).\n * @returns whatever the function returns (typed via ReturnType).\n */\nexport function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F> {\n return fn(...(args as never[])) as ReturnType<F>\n}\n\n/**\n * Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。\n *\n * 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法\n * (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,\n * D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前\n * 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。\n *\n * @param opName - op 名(报错文案)。\n * @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。\n * @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。\n */\nexport function assertEngineFor(opName: string, engines: readonly string[]): void {\n const current = getBackends().config.brepEngineId\n if (current === null || current === undefined || !engines.some((e) => e === current)) {\n const e = new Error(\n `E_BREP_UNSUPPORTED: op '${opName}' requires engine ${engines.join(' or ')} (current=${current ?? '<none>'})`,\n )\n e.name = 'BrepUnsupportedError'\n throw e\n }\n}\n\n// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────\n\n/** Already-adopted handle dedup table: the same library handle adopted twice →\n * the same faijs Shape (prevents double ownership / double dispose, R6). */\nconst adoptedMap = new WeakMap<object, Shape>()\n\n/**\n * Adopt a library handle as a faijs Shape (compatOp step 5's only adoption\n * entry point).\n *\n * ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);\n * ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY\n * (v1 boundary rejection, R4; the brand is a compile-time phantom type —\n * the runtime kind is read from the occt-wasm handle's own `type` field,\n * same as the kernel getShapeType helpers);\n * ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs\n * finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.\n *\n * @param product - the library result (handle or plain data record).\n * @param opName - the op name (error messages).\n * @param segments - optional tessellation segments (compat `segments?`).\n * @returns the adopted faijs Shape, or the plain data untouched.\n */\nexport function adoptEntity(product: unknown, opName: string, segments?: number): unknown {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) return product\n const h = product as BorrowedShapeHandle\n const prev = adoptedMap.get(h as object)\n if (prev) return prev\n const type = (h.wrapped as { type?: string }).type\n if (type !== undefined && type !== 'solid' && type !== 'compound') {\n throw new OpError(\n opName,\n 'E_SUBSHAPE_BOUNDARY',\n `[faijs/brepjs-compat] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +\n 'must not cross the library boundary; return entity solids or plain data',\n )\n }\n unregisterFromCleanup(h as object) // ★ R1: no-op(brepjs registry 已删除)\n const s = adoptBrepjsProduct(h, segments) // fromHandle: tessellation + identity + BREP slots\n adoptedMap.set(h as object, s)\n return s\n}\n"]}
1
+ {"version":3,"file":"l3-bridge.js","sourceRoot":"","sources":["../../../src/api/internal/l3-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * L3 bridge — faijs Shape ⇄ 库侧 brepjs-shaped shape(生成层共用,E5 模板)\n *\n * 桥接事实(2026-09-02 实测,2026-09-25 core-decouple wrapup 自有化):\n * - faijs 的 brep slot(`brepOf(shape)` → `slot.solid`)运行时是 occt-wasm 的\n * shape 句柄(number,见 `brep/engine/types.ts` 的 `BrepHandle` 注释);\n * - 库侧(compatOp 投影的 brepjs-shaped 函数)消费的 ShapeHandle 是对象视图\n * (`{ wrapped, disposed, delete, onDispose }`),其 `wrapped` 运行时也是\n * 同一 occt-wasm 实例的 shape 句柄 —— D10 单实例保证两者共享同一 wasm,\n * 句柄空间一致,**零拷贝互操作**。brepjs 子包删除后(裁决 9),本文件\n * 自带最小实现:句柄类型视图 / disposal 解除(no-op)。\n *\n * 因此投影一个库函数只需三件事:\n * 1. faijs Shape → 库输入:原样直传(faijs-native 库消费 core Shape);\n * 2. 调库函数(Result 语义由各 op 处理:`ok` 取值 / `err` 抛错);\n * 3. 库产物 → faijs Shape:取 `.wrapped`(owned handle)→ `fromHandle()`\n * (meshHandle + 身份槽登记,所有权转入 faijs)。\n *\n * 依赖约束(同 `brep/handle-bridge.ts`):只允许 import runtime-state / shape /\n * handle-bridge / occt-kernel 的类型与工具,保持 dist/sdk.js 零 heavy 依赖\n * (occt-kernel 的 getOcctKernel 为惰性访问,引擎装配前不触碰 wasm)。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { fromHandle } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\nimport { getBackends } from '../../runtime-state'\nimport { OpError } from './result-unwrap'\n\n// ── brepjs 借用面最小自有化(core-decouple wrapup §4.3)──────────────────────\n// 原实现:@faicad/faijs-brepjs/core/disposal.js(unregisterFromCleanup /\n// ShapeHandle)。brepjs 子包删除后按同语义内联。\n\n/** 库侧消费的 shape 句柄视图(borrowed:不拥有、不释放)。 */\nexport interface BorrowedShapeHandle {\n /** The raw kernel shape handle */\n readonly wrapped: unknown\n /** Manual dispose(borrowed 视图为 no-op) */\n [Symbol.dispose](): void\n /** Alias for Symbol.dispose */\n delete(): void\n /** Always false for a borrowed view */\n readonly disposed: boolean\n /** Borrowed views never dispose, so callbacks never fire(no-op)。 */\n onDispose(callback: () => void): void\n}\n\n/** brepjs 的 finalizer registry 已随子包删除——解除登记为 no-op。 */\nfunction unregisterFromCleanup(_deletable: object): void {\n // no-op(原 brepjs core/disposal.ts#unregisterFromCleanup;registry 已不存在)\n}\n\n/**\n * Adopt a library-side product into a faijs Shape.\n *\n * Unwraps the owned occt handle (`.wrapped`) and registers it into faijs'\n * identity slot via `fromHandle` — ownership transfers to faijs, and the library\n * wrapper must not dispose it afterwards (projected ops return it directly).\n *\n * @param product - a library-side shape (ShapeHandle / AnyShape family).\n * @param segments - optional tessellation segments(投影侧 `segments?`,裁决 1;\n * 透传给 `fromHandle` 的三角化,默认 32 → 64 由 handle-bridge 兜底).\n * @returns the faijs Shape wrapping the same occt solid.\n */\nexport function adoptBrepjsProduct(product: unknown, segments?: number): Shape {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) {\n throw new Error('[faijs/l3-bridge] E_BAD_PRODUCT: expected a shape handle from the library engine')\n }\n // library `wrapped` may be an OcctHandle (`{id}`) or a raw numeric id;\n // faijs' kernel meshShape expects the numeric shape id (fromHandle).\n const wrappedAny = (product as { wrapped: unknown }).wrapped\n const rawId =\n typeof wrappedAny === 'object' && wrappedAny !== null && 'id' in wrappedAny\n ? (wrappedAny as { id: number }).id\n : (wrappedAny as number)\n const wrapped = rawId as BrepHandle\n return fromHandle(wrapped, segments === undefined ? undefined : { segments })\n}\n\n/**\n * Call a library function with a rebuilt positional argument list.\n *\n * Generated wrappers build `__args` positionally (geometry inputs pass through\n * untouched, value params pass through as-is); a plain `fn(...args: unknown[])` spread fails\n * TS2556 against fixed-arity signatures, so the call goes through this\n * rest-typed bridge that preserves the function's own `ReturnType` (so a\n * `Result` return keeps `.ok`/`.value` for the generated unwrap code).\n *\n * @param fn the library function.\n * @param args the rebuilt positional argument list (geometry inputs + value params).\n * @returns whatever the function returns (typed via ReturnType).\n */\nexport function callBrepjs<F extends (...a: never[]) => unknown>(fn: F, args: unknown[]): ReturnType<F> {\n return fn(...(args as never[])) as ReturnType<F>\n}\n\n/**\n * Phase 6(narrowing plan D7):brep 测量 op 的执行前引擎身份断言。\n *\n * 库面 query op 是普通函数(不走 dispatchPath),但部分依赖 occt-only 内核方法\n * (shapeType / linearCenterOfMass / distance / curvature / interference,L2 平台面,\n * D6 表)——在这些 op 的实现上声明 `engines: ['occt']`,函数体第一行即断言当前\n * 引擎身份,在触碰内核之前报出可定位错误(文案与 D11-4 同构),不补桩、不回退。\n *\n * @param opName - op 名(报错文案)。\n * @param engines - 允许执行的引擎 id 集合(arg-spec 条目的 `engines` 字段)。\n * @throws BrepUnsupportedError 当当前引擎不在 `engines` 内。\n */\nexport function assertEngineFor(opName: string, engines: readonly string[]): void {\n const current = getBackends().config.brepEngineId\n if (current === null || current === undefined || !engines.some((e) => e === current)) {\n const e = new Error(\n `E_BREP_UNSUPPORTED: op '${opName}' requires engine ${engines.join(' or ')} (current=${current ?? '<none>'})`,\n )\n e.name = 'BrepUnsupportedError'\n throw e\n }\n}\n\n// ─── adoption (compatOp step 5; R1 fix) ──────────────────────────────────────\n\n/** Already-adopted handle dedup table: the same library handle adopted twice →\n * the same faijs Shape (prevents double ownership / double dispose, R6). */\nconst adoptedMap = new WeakMap<object, Shape>()\n\n/**\n * Adopt a library handle as a faijs Shape (compatOp step 5's only adoption\n * entry point).\n *\n * ① pure data (no `.wrapped`) → pass through unchanged (query/data functions);\n * ② sub-shape kinds (face/edge/wire/vertex/shell) → throw E_SUBSHAPE_BOUNDARY\n * (v1 boundary rejection, R4; the brand is a compile-time phantom type —\n * the runtime kind is read from the occt-wasm handle's own `type` field,\n * same as the kernel getShapeType helpers);\n * ③ entities (solid/compound) → no-op unregisterFromCleanup(★ R1:brepjs\n * finalizer registry 已随子包删除,无孤儿释放风险)→ adoptBrepjsProduct.\n *\n * @param product - the library result (handle or plain data record).\n * @param opName - the op name (error messages).\n * @param segments - optional tessellation segments (compat `segments?`).\n * @returns the adopted faijs Shape, or the plain data untouched.\n */\nexport function adoptEntity(product: unknown, opName: string, segments?: number): unknown {\n if (product === null || typeof product !== 'object' || !('wrapped' in product)) return product\n const h = product as BorrowedShapeHandle\n const prev = adoptedMap.get(h as object)\n if (prev) return prev\n const type = (h.wrapped as { type?: string }).type\n if (type !== undefined && type !== 'solid' && type !== 'compound') {\n throw new OpError(\n opName,\n 'E_SUBSHAPE_BOUNDARY',\n `[faijs/op] ${opName}: E_SUBSHAPE_BOUNDARY: sub-shape handle ('${type}') ` +\n 'must not cross the library boundary; return entity solids or plain data',\n )\n }\n unregisterFromCleanup(h as object) // ★ R1: no-op(brepjs registry 已删除)\n const s = adoptBrepjsProduct(h, segments) // fromHandle: tessellation + identity + BREP slots\n adoptedMap.set(h as object, s)\n return s\n}\n"]}
@@ -10,7 +10,7 @@
10
10
  * - 2D 截面(`cad.profile` 的面)→ 取**外环**(孔环不参与扫掠/放样)。
11
11
  *
12
12
  * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`
13
- * (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是
13
+ * (brepjs 形态保留,供 brep-operations 实现直读)。所有权:面→外环的 wire 是
14
14
  * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;
15
15
  * 曲线借用(borrowed=true)不 release。
16
16
  */
@@ -10,7 +10,7 @@
10
10
  * - 2D 截面(`cad.profile` 的面)→ 取**外环**(孔环不参与扫掠/放样)。
11
11
  *
12
12
  * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`
13
- * (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是
13
+ * (brepjs 形态保留,供 brep-operations 实现直读)。所有权:面→外环的 wire 是
14
14
  * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;
15
15
  * 曲线借用(borrowed=true)不 release。
16
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"profile-wire.js","sourceRoot":"","sources":["../../../src/api/internal/profile-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAUrD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAc;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAe,CAAA;IAC5C,IAAI,YAAY,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACrE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["/**\n * profile-wire — 「截面 Shape → 扫掠/放样所需的 wire 视图」的唯一步径(Phase 4→G5)\n *\n * `sweep` / `loft` 共用:脚本面最常见的截面来源是 `cad.profile(...)`(产出 **face**),\n * 而内核的 `sweep` / `loft` 只吃 wire ⇒ 需要「面 → 外环 wire」输入适配。\n * 两处口径必须逐字一致,故收在此叶子模块(一份实现,不允许第二个判定点)。\n *\n * 判定用 faijs 侧判别位(Phase 3 落地的 `kind:'curve'`),不查内核拓扑类型:\n * - 1D 截面(`cad.wire` / `cad.helix` / `cad.profile({as:'wire'})`)→ 借用原句柄;\n * - 2D 截面(`cad.profile` 的面)→ 取**外环**(孔环不参与扫掠/放样)。\n *\n * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`\n * (brepjs 形态保留,供 brep-mirror 实现直读)。所有权:面→外环的 wire 是\n * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;\n * 曲线借用(borrowed=true)不 release。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf, isCurveShape } from '../../shape'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\n\n/** Wire view for sweep/loft sections: the BREP handle plus its ownership flag. */\nexport interface WireView {\n wrapped: BrepHandle\n /** true = 借用原 shape 句柄(勿 release);false = 新建外环 wire(调用方 release)。 */\n borrowed: boolean\n}\n\n/** 截面 Shape → wire 视图(面取其外环)。\n *\n * @param section - Section shape (curve or face) to adapt.\n * @returns The wire view wrapping the handle and its ownership flag.\n */\nexport function toProfileWireView(section: Shape): WireView {\n const handle = brepOf(section) as BrepHandle\n if (isCurveShape(section)) return { wrapped: handle, borrowed: true }\n const kernel = getBrepApi()\n const faces = kernel.getSubShapes(handle, 'face')\n if (faces.length === 0) return { wrapped: handle, borrowed: true }\n const wires = kernel.getSubShapes(faces[0], 'wire')\n if (wires.length === 0) return { wrapped: handle, borrowed: true }\n return { wrapped: wires[0], borrowed: false }\n}\n"]}
1
+ {"version":3,"file":"profile-wire.js","sourceRoot":"","sources":["../../../src/api/internal/profile-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAUrD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAc;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAe,CAAA;IAC5C,IAAI,YAAY,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IACrE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;IAClE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["/**\n * profile-wire — 「截面 Shape → 扫掠/放样所需的 wire 视图」的唯一步径(Phase 4→G5)\n *\n * `sweep` / `loft` 共用:脚本面最常见的截面来源是 `cad.profile(...)`(产出 **face**),\n * 而内核的 `sweep` / `loft` 只吃 wire ⇒ 需要「面 → 外环 wire」输入适配。\n * 两处口径必须逐字一致,故收在此叶子模块(一份实现,不允许第二个判定点)。\n *\n * 判定用 faijs 侧判别位(Phase 3 落地的 `kind:'curve'`),不查内核拓扑类型:\n * - 1D 截面(`cad.wire` / `cad.helix` / `cad.profile({as:'wire'})`)→ 借用原句柄;\n * - 2D 截面(`cad.profile` 的面)→ 取**外环**(孔环不参与扫掠/放样)。\n *\n * core-decouple G5 后:wire 视图为 `{ wrapped: BrepHandle, borrowed: boolean }`\n * (brepjs 形态保留,供 brep-operations 实现直读)。所有权:面→外环的 wire 是\n * arena 新句柄(borrowed=false),由调用方(loft/sweep)消费后 release;\n * 曲线借用(borrowed=true)不 release。\n */\n\nimport type { Shape } from '../../mesh/types'\nimport { brepOf, isCurveShape } from '../../shape'\nimport { getBrepApi } from '../../brep/handle-bridge'\nimport type { BrepHandle } from '../../brep/engine/types'\n\n/** Wire view for sweep/loft sections: the BREP handle plus its ownership flag. */\nexport interface WireView {\n wrapped: BrepHandle\n /** true = 借用原 shape 句柄(勿 release);false = 新建外环 wire(调用方 release)。 */\n borrowed: boolean\n}\n\n/** 截面 Shape → wire 视图(面取其外环)。\n *\n * @param section - Section shape (curve or face) to adapt.\n * @returns The wire view wrapping the handle and its ownership flag.\n */\nexport function toProfileWireView(section: Shape): WireView {\n const handle = brepOf(section) as BrepHandle\n if (isCurveShape(section)) return { wrapped: handle, borrowed: true }\n const kernel = getBrepApi()\n const faces = kernel.getSubShapes(handle, 'face')\n if (faces.length === 0) return { wrapped: handle, borrowed: true }\n const wires = kernel.getSubShapes(faces[0], 'wire')\n if (wires.length === 0) return { wrapped: handle, borrowed: true }\n return { wrapped: wires[0], borrowed: false }\n}\n"]}
@@ -2,9 +2,7 @@
2
2
  * result-unwrap — the single Result→throw bridge shared by every faijs
3
3
  * statement boundary (D1).
4
4
  *
5
- * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §5.1 / §5.2
6
- *
7
- * Three-layer error semantics (§5.1):
5
+ * Three-layer error semantics:
8
6
  * library internals / TS compat face → `Result<T>` native (BrepError)
9
7
  * statement boundary → `err` unwrapped into a throw
10
8
  * faijs-specific op impls → may return `Result`; same unwrap
@@ -16,7 +14,7 @@
16
14
  *
17
15
  * @module
18
16
  */
19
- /** Structural shape of the vendored `Ok`/`Err` records (`vendored/brepjs/core/result.ts:12-21`). */
17
+ /** Structural shape of the compat `Ok`/`Err` records (`brepjs/core/result.ts:12-21`). */
20
18
  export type ResultLike = {
21
19
  ok: true;
22
20
  value: unknown;
@@ -54,7 +52,7 @@ export declare class OpError extends Error {
54
52
  /**
55
53
  * Structural test for a Result value.
56
54
  *
57
- * Only the `ok: boolean` discriminant is checked — the vendored `Result` is a
55
+ * Only the `ok: boolean` discriminant is checked — the compat `Result` is a
58
56
  * plain record, so no `instanceof` and no import is needed (which is what keeps
59
57
  * this module a leaf).
60
58
  *
@@ -68,7 +66,7 @@ export declare function isResultLike(v: unknown): v is ResultLike;
68
66
  *
69
67
  * The op name and the `BrepError.code` (when present) are always kept so the
70
68
  * engine's statement-level catch reports the same shape the plan's trace A/B
71
- * describe (`[faijs/brepjs-compat] <op>: <CODE>: <message>`).
69
+ * describe (`[faijs/op] <op>: <CODE>: <message>`).
72
70
  *
73
71
  * @param name - the op name.
74
72
  * @param err - the thrown value (Error or anything else).
@@ -1 +1 @@
1
- {"version":3,"file":"result-unwrap.d.ts","sourceRoot":"","sources":["../../../src/api/internal/result-unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,oGAAoG;AACpG,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAE7D;;;;;;;;;;;;;;GAcG;AACH,qBAAa,OAAQ,SAAQ,KAAK;IAChC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBACT,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAMrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CAExD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,KAAK,CAO3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAO/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAU9D"}
1
+ {"version":3,"file":"result-unwrap.d.ts","sourceRoot":"","sources":["../../../src/api/internal/result-unwrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,yFAAyF;AACzF,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAE7D;;;;;;;;;;;;;;GAcG;AACH,qBAAa,OAAQ,SAAQ,KAAK;IAChC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBACT,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAMrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CAExD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,KAAK,CAO3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAO/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAU9D"}
@@ -2,9 +2,7 @@
2
2
  * result-unwrap — the single Result→throw bridge shared by every faijs
3
3
  * statement boundary (D1).
4
4
  *
5
- * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §5.1 / §5.2
6
- *
7
- * Three-layer error semantics (§5.1):
5
+ * Three-layer error semantics:
8
6
  * library internals / TS compat face → `Result<T>` native (BrepError)
9
7
  * statement boundary → `err` unwrapped into a throw
10
8
  * faijs-specific op impls → may return `Result`; same unwrap
@@ -46,7 +44,7 @@ export class OpError extends Error {
46
44
  /**
47
45
  * Structural test for a Result value.
48
46
  *
49
- * Only the `ok: boolean` discriminant is checked — the vendored `Result` is a
47
+ * Only the `ok: boolean` discriminant is checked — the compat `Result` is a
50
48
  * plain record, so no `instanceof` and no import is needed (which is what keeps
51
49
  * this module a leaf).
52
50
  *
@@ -62,7 +60,7 @@ export function isResultLike(v) {
62
60
  *
63
61
  * The op name and the `BrepError.code` (when present) are always kept so the
64
62
  * engine's statement-level catch reports the same shape the plan's trace A/B
65
- * describe (`[faijs/brepjs-compat] <op>: <CODE>: <message>`).
63
+ * describe (`[faijs/op] <op>: <CODE>: <message>`).
66
64
  *
67
65
  * @param name - the op name.
68
66
  * @param err - the thrown value (Error or anything else).
@@ -114,6 +112,6 @@ export function unwrapResult(r, name) {
114
112
  return r.value;
115
113
  const e = (r.error ?? {});
116
114
  const code = e.code ?? 'E_OP_FAILED';
117
- throw new OpError(name, code, `[faijs/brepjs-compat] ${name}: ${code}: ${e.message ?? 'operation failed'}`);
115
+ throw new OpError(name, code, `[faijs/op] ${name}: ${code}: ${e.message ?? 'operation failed'}`);
118
116
  }
119
117
  //# sourceMappingURL=result-unwrap.js.map