@faicad/faijs 0.19.0 → 0.29.3

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 (510) hide show
  1. package/LICENSE +202 -28
  2. package/dist/api/api-namespace.d.ts +5 -5
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +4 -4
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/assert.d.ts +2 -2
  7. package/dist/api/assert.js +8 -8
  8. package/dist/api/assert.js.map +1 -1
  9. package/dist/api/asset.d.ts +1 -1
  10. package/dist/api/asset.js +2 -2
  11. package/dist/api/asset.js.map +1 -1
  12. package/dist/api/boolean.d.ts +1 -1
  13. package/dist/api/boolean.d.ts.map +1 -1
  14. package/dist/api/boolean.js +128 -16
  15. package/dist/api/boolean.js.map +1 -1
  16. package/dist/api/brep-mirror/joinery-brep.d.ts.map +1 -1
  17. package/dist/api/brep-mirror/joinery-brep.js +3 -1
  18. package/dist/api/brep-mirror/joinery-brep.js.map +1 -1
  19. package/dist/api/cadquery-selectors/borrow-bridge.d.ts +14 -0
  20. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -0
  21. package/dist/api/cadquery-selectors/borrow-bridge.js +52 -0
  22. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -0
  23. package/dist/api/cadquery-selectors/edge.d.ts +40 -0
  24. package/dist/api/cadquery-selectors/edge.d.ts.map +1 -0
  25. package/dist/api/cadquery-selectors/edge.js +70 -0
  26. package/dist/api/cadquery-selectors/edge.js.map +1 -0
  27. package/dist/api/cadquery-selectors/entity.d.ts +121 -0
  28. package/dist/api/cadquery-selectors/entity.d.ts.map +1 -0
  29. package/dist/api/cadquery-selectors/entity.js +167 -0
  30. package/dist/api/cadquery-selectors/entity.js.map +1 -0
  31. package/dist/api/cadquery-selectors/face.d.ts +33 -0
  32. package/dist/api/cadquery-selectors/face.d.ts.map +1 -0
  33. package/dist/api/cadquery-selectors/face.js +353 -0
  34. package/dist/api/cadquery-selectors/face.js.map +1 -0
  35. package/dist/api/cadquery-selectors/grammar.d.ts +50 -0
  36. package/dist/api/cadquery-selectors/grammar.d.ts.map +1 -0
  37. package/dist/api/cadquery-selectors/grammar.js +345 -0
  38. package/dist/api/cadquery-selectors/grammar.js.map +1 -0
  39. package/dist/api/cadquery-selectors/index.d.ts +18 -0
  40. package/dist/api/cadquery-selectors/index.d.ts.map +1 -0
  41. package/dist/api/cadquery-selectors/index.js +17 -0
  42. package/dist/api/cadquery-selectors/index.js.map +1 -0
  43. package/dist/api/cadquery-selectors/predicates.d.ts +76 -0
  44. package/dist/api/cadquery-selectors/predicates.d.ts.map +1 -0
  45. package/dist/api/cadquery-selectors/predicates.js +85 -0
  46. package/dist/api/cadquery-selectors/predicates.js.map +1 -0
  47. package/dist/api/cadquery-selectors/resolve.d.ts +41 -0
  48. package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -0
  49. package/dist/api/cadquery-selectors/resolve.js +243 -0
  50. package/dist/api/cadquery-selectors/resolve.js.map +1 -0
  51. package/dist/api/cadquery-selectors/types.d.ts +96 -0
  52. package/dist/api/cadquery-selectors/types.d.ts.map +1 -0
  53. package/dist/api/cadquery-selectors/types.js +11 -0
  54. package/dist/api/cadquery-selectors/types.js.map +1 -0
  55. package/dist/api/chamfer.d.ts +13 -5
  56. package/dist/api/chamfer.d.ts.map +1 -1
  57. package/dist/api/chamfer.js +63 -7
  58. package/dist/api/chamfer.js.map +1 -1
  59. package/dist/api/compound-geom.d.ts +1 -1
  60. package/dist/api/compound-geom.js +1 -1
  61. package/dist/api/compound-geom.js.map +1 -1
  62. package/dist/api/draft.d.ts +1 -1
  63. package/dist/api/draft.js +1 -1
  64. package/dist/api/draft.js.map +1 -1
  65. package/dist/api/edge-ref.d.ts +1 -1
  66. package/dist/api/edge-ref.d.ts.map +1 -1
  67. package/dist/api/edge-ref.js +11 -3
  68. package/dist/api/edge-ref.js.map +1 -1
  69. package/dist/api/engrave.d.ts +1 -1
  70. package/dist/api/engrave.js +7 -7
  71. package/dist/api/engrave.js.map +1 -1
  72. package/dist/api/extrude.d.ts +6 -1
  73. package/dist/api/extrude.d.ts.map +1 -1
  74. package/dist/api/extrude.js +59 -5
  75. package/dist/api/extrude.js.map +1 -1
  76. package/dist/api/face-ref.d.ts +1 -1
  77. package/dist/api/face-ref.js +1 -1
  78. package/dist/api/face-ref.js.map +1 -1
  79. package/dist/api/feature-repair.d.ts +1 -1
  80. package/dist/api/feature-repair.js +1 -1
  81. package/dist/api/feature-repair.js.map +1 -1
  82. package/dist/api/fillet-variable.d.ts +1 -1
  83. package/dist/api/fillet-variable.js +1 -1
  84. package/dist/api/fillet-variable.js.map +1 -1
  85. package/dist/api/fillet.d.ts +28 -8
  86. package/dist/api/fillet.d.ts.map +1 -1
  87. package/dist/api/fillet.js +64 -9
  88. package/dist/api/fillet.js.map +1 -1
  89. package/dist/api/generated/script-face-manifest.d.ts +4 -0
  90. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  91. package/dist/api/generated/script-face-manifest.js.map +1 -1
  92. package/dist/api/geom.d.ts +1 -1
  93. package/dist/api/geom.js +1 -1
  94. package/dist/api/geom.js.map +1 -1
  95. package/dist/api/helix.d.ts +1 -1
  96. package/dist/api/helix.js +1 -1
  97. package/dist/api/helix.js.map +1 -1
  98. package/dist/api/import-brep.d.ts +20 -2
  99. package/dist/api/import-brep.d.ts.map +1 -1
  100. package/dist/api/import-brep.js +28 -3
  101. package/dist/api/import-brep.js.map +1 -1
  102. package/dist/api/import-step.d.ts +17 -2
  103. package/dist/api/import-step.d.ts.map +1 -1
  104. package/dist/api/import-step.js +23 -3
  105. package/dist/api/import-step.js.map +1 -1
  106. package/dist/api/index.d.ts +2 -1
  107. package/dist/api/index.d.ts.map +1 -1
  108. package/dist/api/index.js +5 -2
  109. package/dist/api/index.js.map +1 -1
  110. package/dist/api/internal/compat-op.js +1 -1
  111. package/dist/api/internal/compat-op.js.map +1 -1
  112. package/dist/api/internal/mesh-solid-op.d.ts +236 -0
  113. package/dist/api/internal/mesh-solid-op.d.ts.map +1 -0
  114. package/dist/api/internal/mesh-solid-op.js +352 -0
  115. package/dist/api/internal/mesh-solid-op.js.map +1 -0
  116. package/dist/api/internal/svg-asset-resolver.d.ts +1 -1
  117. package/dist/api/internal/svg-asset-resolver.js +1 -1
  118. package/dist/api/internal/svg-asset-resolver.js.map +1 -1
  119. package/dist/api/knurl.d.ts +1 -1
  120. package/dist/api/knurl.d.ts.map +1 -1
  121. package/dist/api/knurl.js +3 -2
  122. package/dist/api/knurl.js.map +1 -1
  123. package/dist/api/loft.d.ts +1 -1
  124. package/dist/api/loft.js +1 -1
  125. package/dist/api/loft.js.map +1 -1
  126. package/dist/api/measurement/index.d.ts +9 -5
  127. package/dist/api/measurement/index.d.ts.map +1 -1
  128. package/dist/api/measurement/index.js +47 -20
  129. package/dist/api/measurement/index.js.map +1 -1
  130. package/dist/api/pattern.d.ts +5 -3
  131. package/dist/api/pattern.d.ts.map +1 -1
  132. package/dist/api/pattern.js +32 -4
  133. package/dist/api/pattern.js.map +1 -1
  134. package/dist/api/place.d.ts +1 -1
  135. package/dist/api/place.js +1 -1
  136. package/dist/api/place.js.map +1 -1
  137. package/dist/api/primitives.d.ts +5 -4
  138. package/dist/api/primitives.d.ts.map +1 -1
  139. package/dist/api/primitives.js +11 -5
  140. package/dist/api/primitives.js.map +1 -1
  141. package/dist/api/profile.d.ts +64 -8
  142. package/dist/api/profile.d.ts.map +1 -1
  143. package/dist/api/profile.js +61 -10
  144. package/dist/api/profile.js.map +1 -1
  145. package/dist/api/punch-hole.d.ts +3 -0
  146. package/dist/api/punch-hole.d.ts.map +1 -1
  147. package/dist/api/punch-hole.js.map +1 -1
  148. package/dist/api/reconcile.d.ts +1 -1
  149. package/dist/api/reconcile.js +1 -1
  150. package/dist/api/reconcile.js.map +1 -1
  151. package/dist/api/replicate.d.ts.map +1 -1
  152. package/dist/api/replicate.js +122 -1
  153. package/dist/api/replicate.js.map +1 -1
  154. package/dist/api/screw.d.ts +1 -1
  155. package/dist/api/screw.js +3 -3
  156. package/dist/api/screw.js.map +1 -1
  157. package/dist/api/sdf.d.ts +1 -1
  158. package/dist/api/sdf.js +2 -2
  159. package/dist/api/sdf.js.map +1 -1
  160. package/dist/api/section-by-plane.d.ts +1 -1
  161. package/dist/api/section-by-plane.d.ts.map +1 -1
  162. package/dist/api/section-by-plane.js +2 -1
  163. package/dist/api/section-by-plane.js.map +1 -1
  164. package/dist/api/shell.d.ts +11 -4
  165. package/dist/api/shell.d.ts.map +1 -1
  166. package/dist/api/shell.js +53 -7
  167. package/dist/api/shell.js.map +1 -1
  168. package/dist/api/sketch-on-face.d.ts +41 -0
  169. package/dist/api/sketch-on-face.d.ts.map +1 -1
  170. package/dist/api/sketch-on-face.js +100 -1
  171. package/dist/api/sketch-on-face.js.map +1 -1
  172. package/dist/api/sketch-on-plane.d.ts +17 -9
  173. package/dist/api/sketch-on-plane.d.ts.map +1 -1
  174. package/dist/api/sketch-on-plane.js +12 -10
  175. package/dist/api/sketch-on-plane.js.map +1 -1
  176. package/dist/api/split-by-plane.d.ts +1 -1
  177. package/dist/api/split-by-plane.d.ts.map +1 -1
  178. package/dist/api/split-by-plane.js +2 -1
  179. package/dist/api/split-by-plane.js.map +1 -1
  180. package/dist/api/split.d.ts +1 -1
  181. package/dist/api/split.js +2 -2
  182. package/dist/api/split.js.map +1 -1
  183. package/dist/api/surface/arg-spec.d.ts +8 -0
  184. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  185. package/dist/api/surface/arg-spec.js.map +1 -1
  186. package/dist/api/sweep.d.ts +1 -1
  187. package/dist/api/sweep.js +1 -1
  188. package/dist/api/sweep.js.map +1 -1
  189. package/dist/api/thicken.d.ts +1 -1
  190. package/dist/api/thicken.js +1 -1
  191. package/dist/api/thicken.js.map +1 -1
  192. package/dist/api/topo-resolve.d.ts +74 -1
  193. package/dist/api/topo-resolve.d.ts.map +1 -1
  194. package/dist/api/topo-resolve.js +180 -2
  195. package/dist/api/topo-resolve.js.map +1 -1
  196. package/dist/api/transform.d.ts +10 -6
  197. package/dist/api/transform.d.ts.map +1 -1
  198. package/dist/api/transform.js +74 -21
  199. package/dist/api/transform.js.map +1 -1
  200. package/dist/api/wire.d.ts +1 -1
  201. package/dist/api/wire.js +1 -1
  202. package/dist/api/wire.js.map +1 -1
  203. package/dist/api/xml-dom.d.ts +27 -0
  204. package/dist/api/xml-dom.d.ts.map +1 -0
  205. package/dist/api/xml-dom.js +45 -0
  206. package/dist/api/xml-dom.js.map +1 -0
  207. package/dist/brep/brep-ops.d.ts +13 -11
  208. package/dist/brep/brep-ops.d.ts.map +1 -1
  209. package/dist/brep/brep-ops.js +31 -30
  210. package/dist/brep/brep-ops.js.map +1 -1
  211. package/dist/brep/brep-topology.d.ts +5 -4
  212. package/dist/brep/brep-topology.d.ts.map +1 -1
  213. package/dist/brep/brep-topology.js +9 -6
  214. package/dist/brep/brep-topology.js.map +1 -1
  215. package/dist/brep/effective-deflection.d.ts +35 -0
  216. package/dist/brep/effective-deflection.d.ts.map +1 -0
  217. package/dist/brep/effective-deflection.js +49 -0
  218. package/dist/brep/effective-deflection.js.map +1 -0
  219. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  220. package/dist/brep/engine/adapters/brep-mock.js +27 -0
  221. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  222. package/dist/brep/engine/adapters/brepkit.d.ts +18 -0
  223. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  224. package/dist/brep/engine/adapters/brepkit.js +46 -1
  225. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  226. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  227. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  228. package/dist/brep/engine/adapters/occt.js +3 -1
  229. package/dist/brep/engine/adapters/occt.js.map +1 -1
  230. package/dist/brep/engine/primitives.d.ts +29 -7
  231. package/dist/brep/engine/primitives.d.ts.map +1 -1
  232. package/dist/brep/engine/primitives.js.map +1 -1
  233. package/dist/brep/engine/registry.d.ts +24 -1
  234. package/dist/brep/engine/registry.d.ts.map +1 -1
  235. package/dist/brep/engine/registry.js +24 -0
  236. package/dist/brep/engine/registry.js.map +1 -1
  237. package/dist/brep/engine/types.d.ts +54 -3
  238. package/dist/brep/engine/types.d.ts.map +1 -1
  239. package/dist/brep/engine/types.js +10 -0
  240. package/dist/brep/engine/types.js.map +1 -1
  241. package/dist/brep/export/export-model.d.ts +79 -0
  242. package/dist/brep/export/export-model.d.ts.map +1 -0
  243. package/dist/brep/export/export-model.js +336 -0
  244. package/dist/brep/export/export-model.js.map +1 -0
  245. package/dist/brep/face-evolution.d.ts +1 -1
  246. package/dist/brep/face-evolution.d.ts.map +1 -1
  247. package/dist/brep/face-evolution.js +20 -1
  248. package/dist/brep/face-evolution.js.map +1 -1
  249. package/dist/brep/handle-bridge.d.ts +1 -1
  250. package/dist/brep/handle-bridge.js +1 -1
  251. package/dist/brep/handle-bridge.js.map +1 -1
  252. package/dist/brep/mesh-solid.d.ts +218 -0
  253. package/dist/brep/mesh-solid.d.ts.map +1 -0
  254. package/dist/brep/mesh-solid.js +229 -0
  255. package/dist/brep/mesh-solid.js.map +1 -0
  256. package/dist/brep/primitives-brep.d.ts.map +1 -1
  257. package/dist/brep/primitives-brep.js +3 -1
  258. package/dist/brep/primitives-brep.js.map +1 -1
  259. package/dist/brep/text/fontRegistry.d.ts +32 -1
  260. package/dist/brep/text/fontRegistry.d.ts.map +1 -1
  261. package/dist/brep/text/fontRegistry.js +51 -1
  262. package/dist/brep/text/fontRegistry.js.map +1 -1
  263. package/dist/brep/text/text-to-solid.d.ts.map +1 -1
  264. package/dist/brep/text/text-to-solid.js +8 -3
  265. package/dist/brep/text/text-to-solid.js.map +1 -1
  266. package/dist/brepkit-kernel/brepkitKernel.d.ts +18 -2
  267. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  268. package/dist/brepkit-kernel/brepkitKernel.js +453 -125
  269. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  270. package/dist/brepkit-kernel/brepkitWasm.d.ts +8 -0
  271. package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
  272. package/dist/brepkit-kernel/brepkitWasm.js +10 -0
  273. package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
  274. package/dist/browser-host/browser-font-provider.d.ts +12 -0
  275. package/dist/browser-host/browser-font-provider.d.ts.map +1 -1
  276. package/dist/browser-host/browser-font-provider.js +25 -0
  277. package/dist/browser-host/browser-font-provider.js.map +1 -1
  278. package/dist/browser.d.ts +6 -3
  279. package/dist/browser.d.ts.map +1 -1
  280. package/dist/browser.js +10 -3
  281. package/dist/browser.js.map +1 -1
  282. package/dist/cad-runtime/backend-dispatch.d.ts +28 -3
  283. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  284. package/dist/cad-runtime/backend-dispatch.js +119 -4
  285. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  286. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  287. package/dist/cad-runtime/direct-executor.d.ts +19 -3
  288. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  289. package/dist/cad-runtime/direct-executor.js +49 -1
  290. package/dist/cad-runtime/direct-executor.js.map +1 -1
  291. package/dist/cad-runtime/ports.d.ts +3 -3
  292. package/dist/cad-runtime/ports.d.ts.map +1 -1
  293. package/dist/cad-runtime/ports.js.map +1 -1
  294. package/dist/cad-runtime/preview-exec.d.ts +4 -4
  295. package/dist/cad-runtime/preview-exec.js +2 -2
  296. package/dist/cad-runtime/preview-exec.js.map +1 -1
  297. package/dist/cad-runtime/runtime.d.ts +66 -8
  298. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  299. package/dist/cad-runtime/runtime.js +121 -8
  300. package/dist/cad-runtime/runtime.js.map +1 -1
  301. package/dist/define-op.d.ts +37 -1
  302. package/dist/define-op.d.ts.map +1 -1
  303. package/dist/define-op.js +25 -1
  304. package/dist/define-op.js.map +1 -1
  305. package/dist/env-agnostic.d.ts +7 -7
  306. package/dist/env-agnostic.d.ts.map +1 -1
  307. package/dist/env-agnostic.js +3 -3
  308. package/dist/env-agnostic.js.map +1 -1
  309. package/dist/geometry2d/adapt.d.ts +39 -4
  310. package/dist/geometry2d/adapt.d.ts.map +1 -1
  311. package/dist/geometry2d/adapt.js +14 -3
  312. package/dist/geometry2d/adapt.js.map +1 -1
  313. package/dist/geometry2d/blueprint.d.ts +2 -2
  314. package/dist/geometry2d/blueprint.js +2 -2
  315. package/dist/geometry2d/blueprint.js.map +1 -1
  316. package/dist/geometry2d/bridge/lift-on-plane.d.ts +18 -8
  317. package/dist/geometry2d/bridge/lift-on-plane.d.ts.map +1 -1
  318. package/dist/geometry2d/bridge/lift-on-plane.js +71 -12
  319. package/dist/geometry2d/bridge/lift-on-plane.js.map +1 -1
  320. package/dist/geometry2d/bridge/plane.d.ts +17 -0
  321. package/dist/geometry2d/bridge/plane.d.ts.map +1 -1
  322. package/dist/geometry2d/bridge/plane.js +22 -0
  323. package/dist/geometry2d/bridge/plane.js.map +1 -1
  324. package/dist/geometry2d/curve2d.d.ts +25 -0
  325. package/dist/geometry2d/curve2d.d.ts.map +1 -1
  326. package/dist/geometry2d/curve2d.js +41 -5
  327. package/dist/geometry2d/curve2d.js.map +1 -1
  328. package/dist/geometry2d/pen-sketcher.d.ts +25 -0
  329. package/dist/geometry2d/pen-sketcher.d.ts.map +1 -1
  330. package/dist/geometry2d/pen-sketcher.js +43 -0
  331. package/dist/geometry2d/pen-sketcher.js.map +1 -1
  332. package/dist/index.d.ts +6 -2
  333. package/dist/index.d.ts.map +1 -1
  334. package/dist/index.js +10 -3
  335. package/dist/index.js.map +1 -1
  336. package/dist/io/bytes-node.d.ts +11 -0
  337. package/dist/io/bytes-node.d.ts.map +1 -0
  338. package/dist/io/bytes-node.js +28 -0
  339. package/dist/io/bytes-node.js.map +1 -0
  340. package/dist/io/bytes.d.ts +33 -0
  341. package/dist/io/bytes.d.ts.map +1 -0
  342. package/dist/io/bytes.js +41 -0
  343. package/dist/io/bytes.js.map +1 -0
  344. package/dist/io/fai-zip/container-read.d.ts +102 -0
  345. package/dist/io/fai-zip/container-read.d.ts.map +1 -0
  346. package/dist/io/fai-zip/container-read.js +305 -0
  347. package/dist/io/fai-zip/container-read.js.map +1 -0
  348. package/dist/io/fai-zip/container-write.d.ts +70 -0
  349. package/dist/io/fai-zip/container-write.d.ts.map +1 -0
  350. package/dist/io/fai-zip/container-write.js +186 -0
  351. package/dist/io/fai-zip/container-write.js.map +1 -0
  352. package/dist/io/fai-zip/container.d.ts +107 -0
  353. package/dist/io/fai-zip/container.d.ts.map +1 -0
  354. package/dist/io/fai-zip/container.js +89 -0
  355. package/dist/io/fai-zip/container.js.map +1 -0
  356. package/dist/io/fai-zip/index.d.ts +18 -0
  357. package/dist/io/fai-zip/index.d.ts.map +1 -0
  358. package/dist/io/fai-zip/index.js +4 -0
  359. package/dist/io/fai-zip/index.js.map +1 -0
  360. package/dist/io/index.d.ts +10 -0
  361. package/dist/io/index.d.ts.map +1 -0
  362. package/dist/io/index.js +13 -0
  363. package/dist/io/index.js.map +1 -0
  364. package/dist/io/zip.d.ts +68 -0
  365. package/dist/io/zip.d.ts.map +1 -0
  366. package/dist/io/zip.js +147 -0
  367. package/dist/io/zip.js.map +1 -0
  368. package/dist/lang/code-to-args.d.ts +30 -4
  369. package/dist/lang/code-to-args.d.ts.map +1 -1
  370. package/dist/lang/code-to-args.js +42 -3
  371. package/dist/lang/code-to-args.js.map +1 -1
  372. package/dist/lang/codegen.d.ts +45 -1
  373. package/dist/lang/codegen.d.ts.map +1 -1
  374. package/dist/lang/codegen.js +135 -6
  375. package/dist/lang/codegen.js.map +1 -1
  376. package/dist/lang/host-arg.d.ts +6 -0
  377. package/dist/lang/host-arg.d.ts.map +1 -1
  378. package/dist/lang/host-arg.js.map +1 -1
  379. package/dist/lang/metadata-extractor.d.ts +25 -0
  380. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  381. package/dist/lang/metadata-extractor.js +289 -25
  382. package/dist/lang/metadata-extractor.js.map +1 -1
  383. package/dist/lang/parse-error.d.ts +7 -1
  384. package/dist/lang/parse-error.d.ts.map +1 -1
  385. package/dist/lang/parse-error.js.map +1 -1
  386. package/dist/lang/security-scanner.d.ts +9 -1
  387. package/dist/lang/security-scanner.d.ts.map +1 -1
  388. package/dist/lang/security-scanner.js +38 -1
  389. package/dist/lang/security-scanner.js.map +1 -1
  390. package/dist/lang/statement-summary.d.ts +1 -1
  391. package/dist/lang/statement-summary.js +1 -1
  392. package/dist/lang/statement-summary.js.map +1 -1
  393. package/dist/lang/types.d.ts +1 -1
  394. package/dist/lang/types.js +1 -1
  395. package/dist/lang/types.js.map +1 -1
  396. package/dist/mesh/index.d.ts +2 -1
  397. package/dist/mesh/index.d.ts.map +1 -1
  398. package/dist/mesh/index.js +2 -1
  399. package/dist/mesh/index.js.map +1 -1
  400. package/dist/mesh/io.d.ts +69 -9
  401. package/dist/mesh/io.d.ts.map +1 -1
  402. package/dist/mesh/io.js +121 -17
  403. package/dist/mesh/io.js.map +1 -1
  404. package/dist/mesh/reconcile.d.ts +1 -1
  405. package/dist/mesh/reconcile.js +1 -1
  406. package/dist/mesh/reconcile.js.map +1 -1
  407. package/dist/mesh/rigid-transform.d.ts +3 -3
  408. package/dist/mesh/rigid-transform.js +3 -3
  409. package/dist/mesh/rigid-transform.js.map +1 -1
  410. package/dist/mesh/stl-unit.d.ts +24 -0
  411. package/dist/mesh/stl-unit.d.ts.map +1 -0
  412. package/dist/mesh/stl-unit.js +17 -0
  413. package/dist/mesh/stl-unit.js.map +1 -0
  414. package/dist/mesh/threemf-bambu.d.ts +142 -0
  415. package/dist/mesh/threemf-bambu.d.ts.map +1 -0
  416. package/dist/mesh/threemf-bambu.js +334 -0
  417. package/dist/mesh/threemf-bambu.js.map +1 -0
  418. package/dist/mesh/threemf-loader.d.ts +50 -0
  419. package/dist/mesh/threemf-loader.d.ts.map +1 -0
  420. package/dist/mesh/threemf-loader.js +628 -0
  421. package/dist/mesh/threemf-loader.js.map +1 -0
  422. package/dist/mesh/threemf-view.d.ts +71 -0
  423. package/dist/mesh/threemf-view.d.ts.map +1 -0
  424. package/dist/mesh/threemf-view.js +100 -0
  425. package/dist/mesh/threemf-view.js.map +1 -0
  426. package/dist/mesh/transform.d.ts +2 -2
  427. package/dist/mesh/transform.d.ts.map +1 -1
  428. package/dist/mesh/transform.js +3 -3
  429. package/dist/mesh/transform.js.map +1 -1
  430. package/dist/mesh/types.d.ts +1 -1
  431. package/dist/mesh/types.d.ts.map +1 -1
  432. package/dist/mesh/types.js.map +1 -1
  433. package/dist/node-host/cli.d.ts +44 -6
  434. package/dist/node-host/cli.d.ts.map +1 -1
  435. package/dist/node-host/cli.js +127 -50
  436. package/dist/node-host/cli.js.map +1 -1
  437. package/dist/node-host/font-family-index.d.ts +93 -0
  438. package/dist/node-host/font-family-index.d.ts.map +1 -0
  439. package/dist/node-host/font-family-index.js +273 -0
  440. package/dist/node-host/font-family-index.js.map +1 -0
  441. package/dist/node-host/fs-asset-resolver.d.ts +8 -3
  442. package/dist/node-host/fs-asset-resolver.d.ts.map +1 -1
  443. package/dist/node-host/fs-asset-resolver.js +13 -5
  444. package/dist/node-host/fs-asset-resolver.js.map +1 -1
  445. package/dist/node-host/index.d.ts +8 -0
  446. package/dist/node-host/index.d.ts.map +1 -1
  447. package/dist/node-host/index.js +1 -0
  448. package/dist/node-host/index.js.map +1 -1
  449. package/dist/node-host/node-font-provider.d.ts +28 -0
  450. package/dist/node-host/node-font-provider.d.ts.map +1 -1
  451. package/dist/node-host/node-font-provider.js +49 -0
  452. package/dist/node-host/node-font-provider.js.map +1 -1
  453. package/dist/node.d.ts +1 -0
  454. package/dist/node.d.ts.map +1 -1
  455. package/dist/node.js +1 -0
  456. package/dist/node.js.map +1 -1
  457. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  458. package/dist/occt-kernel/occt-primitives.js +35 -2
  459. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  460. package/dist/occt-kernel/occtKernel.d.ts +18 -13
  461. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  462. package/dist/occt-kernel/occtKernel.js +20 -31
  463. package/dist/occt-kernel/occtKernel.js.map +1 -1
  464. package/dist/occt-kernel/stepColorParser.d.ts +18 -0
  465. package/dist/occt-kernel/stepColorParser.d.ts.map +1 -1
  466. package/dist/occt-kernel/stepColorParser.js +38 -0
  467. package/dist/occt-kernel/stepColorParser.js.map +1 -1
  468. package/dist/occt-kernel/topologyExt.d.ts +1 -1
  469. package/dist/occt-kernel/topologyExt.d.ts.map +1 -1
  470. package/dist/occt-kernel/topologyExt.js +8 -6
  471. package/dist/occt-kernel/topologyExt.js.map +1 -1
  472. package/dist/primitives/text/cjk-font.d.ts +2 -15
  473. package/dist/primitives/text/cjk-font.d.ts.map +1 -1
  474. package/dist/primitives/text/cjk-font.js +13 -1
  475. package/dist/primitives/text/cjk-font.js.map +1 -1
  476. package/dist/runtime-state.d.ts +103 -9
  477. package/dist/runtime-state.d.ts.map +1 -1
  478. package/dist/runtime-state.js +95 -2
  479. package/dist/runtime-state.js.map +1 -1
  480. package/dist/sdk.d.ts +4 -4
  481. package/dist/sdk.d.ts.map +1 -1
  482. package/dist/sdk.js +6 -6
  483. package/dist/sdk.js.map +1 -1
  484. package/dist/shape.d.ts +97 -2
  485. package/dist/shape.d.ts.map +1 -1
  486. package/dist/shape.js +126 -1
  487. package/dist/shape.js.map +1 -1
  488. package/dist/tolerance.d.ts +38 -0
  489. package/dist/tolerance.d.ts.map +1 -0
  490. package/dist/tolerance.js +40 -0
  491. package/dist/tolerance.js.map +1 -0
  492. package/dist/topology/naming/lineage.d.ts +6 -0
  493. package/dist/topology/naming/lineage.d.ts.map +1 -1
  494. package/dist/topology/naming/lineage.js +8 -0
  495. package/dist/topology/naming/lineage.js.map +1 -1
  496. package/dist/topology/naming/resolve-edge.d.ts +20 -1
  497. package/dist/topology/naming/resolve-edge.d.ts.map +1 -1
  498. package/dist/topology/naming/resolve-edge.js +54 -20
  499. package/dist/topology/naming/resolve-edge.js.map +1 -1
  500. package/dist/topology/naming/score.js +3 -3
  501. package/dist/topology/naming/score.js.map +1 -1
  502. package/dist/units.d.ts +248 -0
  503. package/dist/units.d.ts.map +1 -0
  504. package/dist/units.js +397 -0
  505. package/dist/units.js.map +1 -0
  506. package/dist/weapp.d.ts +6 -2
  507. package/dist/weapp.d.ts.map +1 -1
  508. package/dist/weapp.js +7 -1
  509. package/dist/weapp.js.map +1 -1
  510. package/package.json +28 -3
@@ -11,7 +11,19 @@
11
11
  * Uses the Local Font Access API (window.queryLocalFonts) to load system CJK
12
12
  * fonts; glyph path parsing lives in the consumer.
13
13
  */
14
- import * as opentype from 'opentype.js';
14
+ import * as opentypeModule from 'opentype.js';
15
+ /**
16
+ * `opentype.js` publishes no `exports` map: it ships a UMD bundle (`main`) plus
17
+ * an ESM build (`module`). Node ESM resolves the UMD `main`, whose CommonJS
18
+ * interop exposes a namespace import as `{ default }` only — so
19
+ * `opentypeModule.parse` is undefined there — whereas bundlers (vite/vitest)
20
+ * resolve the ESM build and expose the named exports directly. Resolve once,
21
+ * here, so glyph parsing works in every host (CLI/tsx = Node ESM,
22
+ * vitest/browser = bundler).
23
+ */
24
+ const opentype = typeof opentypeModule.parse === 'function'
25
+ ? opentypeModule
26
+ : opentypeModule.default;
15
27
  /**
16
28
  * Check if a character is CJK (CJK Unified Ideographs + extensions).
17
29
  *
@@ -1 +1 @@
1
- {"version":3,"file":"cjk-font.js","sourceRoot":"","sources":["../../../src/primitives/text/cjk-font.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * cjk-font — CJK character classification and system font loading.\n *\n * Zero-three module: the geometry half of the former `primitives/text/cjk.ts`\n * (`createMixedTextGeometry`) consumers on the editor extension library, whose\n * `cad.text` BREP path still needs the character test and the Local Font Access\n * API loader. Keeping the font half here means the platform `cad.text` BREP path\n * (and the CJK fallback it shares with the mesh path) no longer drags three's\n * `Shape`/`ExtrudeGeometry` into the platform surface.\n *\n * Uses the Local Font Access API (window.queryLocalFonts) to load system CJK\n * fonts; glyph path parsing lives in the consumer.\n */\nimport * as opentype from 'opentype.js'\n\n/**\n * Check if a character is CJK (CJK Unified Ideographs + extensions).\n *\n * @param ch - the single character to test.\n * @returns true when the character falls in a CJK code point range.\n */\nexport function isCjkChar(ch: string): boolean {\n const code = ch.charCodeAt(0)\n return (\n (code >= 0x4E00 && code <= 0x9FFF) || // CJK Unified Ideographs\n (code >= 0x3400 && code <= 0x4DBF) || // CJK Extension A\n (code >= 0x2F800 && code <= 0x2FA1F) || // CJK Compatibility Ideographs Supplement\n (code >= 0x3000 && code <= 0x303F) || // CJK Symbols and Punctuation\n (code >= 0xFF00 && code <= 0xFFEF) // Fullwidth Forms\n )\n}\n\n/**\n * Check if a text string contains any CJK characters.\n *\n * @param text - the text to scan.\n * @returns true when at least one character is CJK.\n */\nexport function containsCjk(text: string): boolean {\n for (const ch of text) {\n if (isCjkChar(ch)) return true\n }\n return false\n}\n\n/** Result of loading a system CJK font. */\nexport interface CjkFontResult {\n font: opentype.Font\n family: string\n}\n\n/**\n * Load a CJK font from the system using the Local Font Access API.\n * Returns null if unavailable (no permission, unsupported browser, or no CJK font found).\n *\n * @returns a promise resolving to the parsed CJK font and its family name,\n * or null when no usable system CJK font is available.\n */\nexport async function loadSystemCjkFont(): Promise<CjkFontResult | null> {\n const w = typeof window !== 'undefined' ? (window as any) : undefined\n if (!w || typeof w.queryLocalFonts !== 'function') {\n return null\n }\n\n try {\n const fonts: Array<{ family: string; fullName: string; style: string; postscriptName: string; blob: () => Promise<Blob> }> = await w.queryLocalFonts()\n\n // Find a font that supports CJK\n const cjkFont = fonts.find((f) =>\n f.family.includes('Microsoft YaHei') ||\n f.family.includes('SimSun') ||\n f.family.includes('Noto Sans') ||\n f.family.includes('Noto Serif') ||\n f.fullName.includes('CJK') ||\n f.fullName.includes('SC') ||\n f.fullName.includes('CN') ||\n f.fullName.includes('JP') ||\n f.fullName.includes('KR') ||\n f.family.includes('Source Han') ||\n f.family.includes('思源') ||\n f.family.includes('微软雅黑') ||\n f.family.includes('宋体') ||\n f.family.includes('黑体') ||\n f.family.includes('楷体') ||\n f.family.includes('仿宋')\n )\n\n if (!cjkFont) return null\n\n const fontData = await cjkFont.blob()\n const buf = await fontData.arrayBuffer()\n const font = opentype.parse(buf)\n\n return { font, family: cjkFont.family }\n } catch {\n // User denied permission or other error\n return null\n }\n}\n"]}
1
+ {"version":3,"file":"cjk-font.js","sourceRoot":"","sources":["../../../src/primitives/text/cjk-font.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,cAAc,MAAM,aAAa,CAAA;AAG7C;;;;;;;;GAQG;AACH,MAAM,QAAQ,GACZ,OAAQ,cAAsC,CAAC,KAAK,KAAK,UAAU;IACjE,CAAC,CAAC,cAAc;IAChB,CAAC,CAAE,cAAgE,CAAC,OAAO,CAAA;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAC7B,OAAO,CACL,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAO,yBAAyB;QAClE,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAO,kBAAkB;QAC3D,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,IAAK,0CAA0C;QACnF,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAO,8BAA8B;QACvE,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,CAAO,kBAAkB;KAC5D,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,SAAS,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAA;IAChC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAQD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAE,MAAc,CAAC,CAAC,CAAC,SAAS,CAAA;IACrE,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAkH,MAAM,CAAC,CAAC,eAAe,EAAE,CAAA;QAEtJ,gCAAgC;QAChC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACpC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC9B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/B,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC1B,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CACxB,CAAA;QAED,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QAEzB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QACrC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;QACxC,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC","sourcesContent":["/**\n * cjk-font — CJK character classification and system font loading.\n *\n * Zero-three module: the geometry half of the former `primitives/text/cjk.ts`\n * (`createMixedTextGeometry`) consumers on the editor extension library, whose\n * `cad.text` BREP path still needs the character test and the Local Font Access\n * API loader. Keeping the font half here means the platform `cad.text` BREP path\n * (and the CJK fallback it shares with the mesh path) no longer drags three's\n * `Shape`/`ExtrudeGeometry` into the platform surface.\n *\n * Uses the Local Font Access API (window.queryLocalFonts) to load system CJK\n * fonts; glyph path parsing lives in the consumer.\n */\nimport * as opentypeModule from 'opentype.js'\nimport type { Font } from 'opentype.js'\n\n/**\n * `opentype.js` publishes no `exports` map: it ships a UMD bundle (`main`) plus\n * an ESM build (`module`). Node ESM resolves the UMD `main`, whose CommonJS\n * interop exposes a namespace import as `{ default }` only — so\n * `opentypeModule.parse` is undefined there — whereas bundlers (vite/vitest)\n * resolve the ESM build and expose the named exports directly. Resolve once,\n * here, so glyph parsing works in every host (CLI/tsx = Node ESM,\n * vitest/browser = bundler).\n */\nconst opentype: typeof opentypeModule =\n typeof (opentypeModule as { parse?: unknown }).parse === 'function'\n ? opentypeModule\n : (opentypeModule as unknown as { default: typeof opentypeModule }).default\n\n/**\n * Check if a character is CJK (CJK Unified Ideographs + extensions).\n *\n * @param ch - the single character to test.\n * @returns true when the character falls in a CJK code point range.\n */\nexport function isCjkChar(ch: string): boolean {\n const code = ch.charCodeAt(0)\n return (\n (code >= 0x4E00 && code <= 0x9FFF) || // CJK Unified Ideographs\n (code >= 0x3400 && code <= 0x4DBF) || // CJK Extension A\n (code >= 0x2F800 && code <= 0x2FA1F) || // CJK Compatibility Ideographs Supplement\n (code >= 0x3000 && code <= 0x303F) || // CJK Symbols and Punctuation\n (code >= 0xFF00 && code <= 0xFFEF) // Fullwidth Forms\n )\n}\n\n/**\n * Check if a text string contains any CJK characters.\n *\n * @param text - the text to scan.\n * @returns true when at least one character is CJK.\n */\nexport function containsCjk(text: string): boolean {\n for (const ch of text) {\n if (isCjkChar(ch)) return true\n }\n return false\n}\n\n/** Result of loading a system CJK font. */\nexport interface CjkFontResult {\n font: Font\n family: string\n}\n\n/**\n * Load a CJK font from the system using the Local Font Access API.\n * Returns null if unavailable (no permission, unsupported browser, or no CJK font found).\n *\n * @returns a promise resolving to the parsed CJK font and its family name,\n * or null when no usable system CJK font is available.\n */\nexport async function loadSystemCjkFont(): Promise<CjkFontResult | null> {\n const w = typeof window !== 'undefined' ? (window as any) : undefined\n if (!w || typeof w.queryLocalFonts !== 'function') {\n return null\n }\n\n try {\n const fonts: Array<{ family: string; fullName: string; style: string; postscriptName: string; blob: () => Promise<Blob> }> = await w.queryLocalFonts()\n\n // Find a font that supports CJK\n const cjkFont = fonts.find((f) =>\n f.family.includes('Microsoft YaHei') ||\n f.family.includes('SimSun') ||\n f.family.includes('Noto Sans') ||\n f.family.includes('Noto Serif') ||\n f.fullName.includes('CJK') ||\n f.fullName.includes('SC') ||\n f.fullName.includes('CN') ||\n f.fullName.includes('JP') ||\n f.fullName.includes('KR') ||\n f.family.includes('Source Han') ||\n f.family.includes('思源') ||\n f.family.includes('微软雅黑') ||\n f.family.includes('宋体') ||\n f.family.includes('黑体') ||\n f.family.includes('楷体') ||\n f.family.includes('仿宋')\n )\n\n if (!cjkFont) return null\n\n const fontData = await cjkFont.blob()\n const buf = await fontData.arrayBuffer()\n const font = opentype.parse(buf)\n\n return { font, family: cjkFont.family }\n } catch {\n // User denied permission or other error\n return null\n }\n}\n"]}
@@ -2,12 +2,12 @@
2
2
  * runtime-state — 全局运行时状态锚点(零依赖层)
3
3
  *
4
4
  *
5
- * 本模块位于 L0+(零运行时依赖),是 L3 API 面(core/src/api,原 stdlib)与
5
+ * 本模块位于 L0+(零运行时依赖),是 L3 API 面(core/src/api)与
6
6
  * cad-runtime(L2)之间唯一的共享状态。**放在这一层是为了避免循环依赖**:
7
7
  * api/ 不能 import cad-runtime(cad-runtime/api-namespace.ts 已经 import 了 api/)。
8
8
  *
9
9
  * 承载三类状态:
10
- * 1. Backends —— 宿主注入的环境资源(内核 / 端口 / 模式 / 标准库命名空间)
10
+ * 1. Backends —— 宿主注入的环境资源(内核 / 端口 / 模式 / 平台库命名空间)
11
11
  * 2. 当前执行语句 —— keep() 归属用(引擎在语句 fn 之前设置)
12
12
  * 3. Shape 身份表 —— 构造器登记(isShape 依据)与 Shape→PartName 反查
13
13
  *
@@ -80,14 +80,25 @@ export interface Backends {
80
80
  readonly brep: unknown | null;
81
81
  readonly csg: unknown | undefined;
82
82
  readonly sdf: unknown | undefined;
83
+ /**
84
+ * 网格实体后端(网格语义路径的内核;`brep/mesh-solid.ts` 的 `MeshSolidBackend`)。
85
+ *
86
+ * **与 `brep` 独立**:mesh 零件既可以在「宿主用 OCCT 做 BREP、用 brepkit 做
87
+ * mesh」的装配下产出,也可以在纯 mesh 模式下产出。未装配 → `undefined`,
88
+ * 此时 `load` 的 mesh 路径保持"裸网格、无近似拓扑"的历史行为(这不是静默
89
+ * 降级:没有网格内核是宿主的装配事实,与"规范化失败"是两回事)。
90
+ *
91
+ * 类型在本模块里写 `unknown`(零依赖红线),权威类型见 `MeshSolidBackend`。
92
+ */
93
+ readonly meshSolid?: unknown;
83
94
  };
84
95
  /** 宿主端口(透传 HostPorts) */
85
96
  readonly fonts: unknown;
86
97
  readonly texture: unknown;
87
98
  readonly assets: unknown;
88
99
  readonly events: unknown;
89
- /** faijs 自带标准库命名空间(引擎不区分它与第三方库——都是库函数;P5 起由宿主注入,core 不默认装配) */
90
- readonly cad?: StdlibNamespace;
100
+ /** faijs 平台库命名空间(引擎不区分它与第三方库——都是库函数;由宿主注入,core 不默认装配) */
101
+ readonly cad?: LibNamespace;
91
102
  }
92
103
  /**
93
104
  * 契约版本。破坏性变更 +1。加载第三方库时校验,不兼容即抛错。
@@ -99,10 +110,10 @@ export interface Backends {
99
110
  */
100
111
  export declare const CONTRACT_VERSION = 3;
101
112
  /** 库函数签名(引擎视角:任意参数的普通函数,信息均匀化,不按名字分支)。 */
102
- export type StdlibFn = (...args: any[]) => unknown;
103
- /** 库命名空间:函数名 → 库函数(faijs 自带标准库与第三方库同构)。 */
104
- export interface StdlibNamespace {
105
- [name: string]: StdlibFn;
113
+ export type LibFn = (...args: any[]) => unknown;
114
+ /** 库命名空间:函数名 → 库函数(faijs 平台库与第三方库同构)。 */
115
+ export interface LibNamespace {
116
+ [name: string]: LibFn;
106
117
  }
107
118
  /**
108
119
  * 契约版本校验(P7 第三方库通道):加载时校验,不兼容即抛错(不静默降级)。
@@ -175,9 +186,30 @@ export declare function registerFunctionBrep(solid: unknown): void;
175
186
  * @returns 当前函数域的句柄登记表快照。
176
187
  */
177
188
  export declare function takeFunctionBrepDomain(): unknown[];
178
- /** Shape 身份槽(OCCT 句柄 + 面演化 + 拓扑命名 + 装配行为)。 */
189
+ /** Shape 身份槽(OCCT 句柄 + 网格实体句柄 + 网格面句柄 + 面演化 + 拓扑命名 + 装配行为)。 */
179
190
  export interface ShapeSlot {
191
+ /** BREP 精度链句柄。与 `meshSolid` / `meshFace` **互斥**(同时存在 = 缺陷)。 */
180
192
  solid?: unknown;
193
+ /**
194
+ * 网格实体句柄(近似链)。与 `solid` **互斥**——网格零件按定义没有精度链,
195
+ * BREP 实体也不携带网格实体。互斥由 `backend-dispatch.assertShapeSlotExclusive`
196
+ * 在分派前静态校验(不给运行时"选边站"的机会;方案 §3.2)。
197
+ *
198
+ * 它只表示"这个 Shape 是网格零件"这一事实,句柄的生命周期由
199
+ * `brep/mesh-solid.ts` 的 `MeshSolidRegistry` 持有。
200
+ */
201
+ meshSolid?: unknown;
202
+ /**
203
+ * 网格链**面**句柄(近似链的构造中几何,方案 2026-10-01 §4 Phase 3)。
204
+ *
205
+ * 与 `solid` / `meshSolid` 互斥:它是网格链上的一张面(`sketchOnFace` 在
206
+ * 近似拓扑面上铺草图后的产物),既不是精度链实体,也不是网格零件本身。
207
+ * 它存在的原因和 BREP 链上「面 Shape」完全对称——BREP 侧 `sketchOnFace` 返回
208
+ * `fromBrep(face, { solid: face })`,面句柄同样占着 `solid` 槽;网格侧若把面句柄
209
+ * 塞进 `solid`,`hasBrep` 会变真、分派会走精度链,在只有网格后端的宿主上必然报错。
210
+ * 所以面句柄需要自己的一格,不能借位。
211
+ */
212
+ meshFace?: unknown;
181
213
  faceEvolution?: Map<number, number[]>;
182
214
  /** mesh/primitive 面 hint 快照(§3.6 setTopology 注入时由 runtime 提炼写入,解析兜底用)。 */
183
215
  faceHints?: unknown;
@@ -321,4 +353,66 @@ export declare function keep(...shapes: unknown[]): void;
321
353
  * @param shapes - the shapes whose corresponding variables should be kept hidden.
322
354
  */
323
355
  export declare function keepHidden(...shapes: unknown[]): void;
356
+ /** Per-part declared file units (key = PartName; null-never — absent key = unknown). */
357
+ export type DetectedUnits = Map<PartName, string>;
358
+ /**
359
+ * Register a part's declared file unit (called from the load op body; the unit
360
+ * is metadata only — coordinates are already base-unit, never re-scaled).
361
+ *
362
+ * @param partName - the variable name the loaded shape will be bound to.
363
+ * @param unit - the file's own declared unit (faijs UnitName).
364
+ */
365
+ export declare function setPendingDetectedUnit(partName: PartName, unit: string): void;
366
+ /**
367
+ * Take all pending detected units and clear them (engine, after each statement;
368
+ * consumed exactly once).
369
+ *
370
+ * @returns a fresh Map of part name → declared unit, copied from the pending
371
+ * store and cleared so it is consumed exactly once.
372
+ */
373
+ export declare function takePendingDetectedUnits(): DetectedUnits;
374
+ /** Per-part declared multi-part degradation (key = PartName; absent = 单零件/无多零件文件). */
375
+ export type MultiPartCounts = Map<PartName, number>;
376
+ /**
377
+ * Register a part that was downgraded from a multi-part file (called from the
378
+ * load op body; the shape returned is only the first-part geometry).
379
+ *
380
+ * @param partName - the variable name the loaded (single) shape is bound to.
381
+ * @param partCount - the total number of parts the source file declared (>= 2).
382
+ */
383
+ export declare function setPendingMultiPartCount(partName: PartName, partCount: number): void;
384
+ /**
385
+ * Take all pending multi-part counts and clear them (engine, after each
386
+ * statement; consumed exactly once).
387
+ *
388
+ * @returns a fresh Map of part name → part count, copied from the pending store.
389
+ */
390
+ export declare function takePendingMultiPartCounts(): MultiPartCounts;
391
+ /**
392
+ * 登记某 part 的网格实体句柄(load op 调用;由引擎在语句执行后收编)。
393
+ *
394
+ * @param partName - the variable name the loaded mesh shape will be bound to.
395
+ * @param solid - the normalized mesh solid handle (opaque outside the mesh backend).
396
+ */
397
+ export declare function setPendingMeshSolid(partName: PartName, solid: unknown): void;
398
+ /**
399
+ * 取走全部待收编的网格实体句柄并清空(引擎在语句执行后调用,消费一次)。
400
+ *
401
+ * @returns a fresh Map of part name → mesh solid handle.
402
+ */
403
+ export declare function takePendingMeshSolids(): Map<PartName, unknown>;
404
+ /**
405
+ * 登记某 part 的近似拓扑数据(load op 调用;`SelectorRuntimeData`,本层只按
406
+ * `unknown` 透传——零依赖红线)。
407
+ *
408
+ * @param partName - the variable name the loaded mesh shape will be bound to.
409
+ * @param data - the serializable selector runtime data built from the mesh solid.
410
+ */
411
+ export declare function setPendingMeshTopology(partName: PartName, data: unknown): void;
412
+ /**
413
+ * 取走全部待收编的近似拓扑数据并清空(引擎在语句执行后调用,消费一次)。
414
+ *
415
+ * @returns a fresh Map of part name → selector runtime data.
416
+ */
417
+ export declare function takePendingMeshTopologies(): Map<PartName, unknown>;
324
418
  //# sourceMappingURL=runtime-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,12 @@
2
2
  * runtime-state — 全局运行时状态锚点(零依赖层)
3
3
  *
4
4
  *
5
- * 本模块位于 L0+(零运行时依赖),是 L3 API 面(core/src/api,原 stdlib)与
5
+ * 本模块位于 L0+(零运行时依赖),是 L3 API 面(core/src/api)与
6
6
  * cad-runtime(L2)之间唯一的共享状态。**放在这一层是为了避免循环依赖**:
7
7
  * api/ 不能 import cad-runtime(cad-runtime/api-namespace.ts 已经 import 了 api/)。
8
8
  *
9
9
  * 承载三类状态:
10
- * 1. Backends —— 宿主注入的环境资源(内核 / 端口 / 模式 / 标准库命名空间)
10
+ * 1. Backends —— 宿主注入的环境资源(内核 / 端口 / 模式 / 平台库命名空间)
11
11
  * 2. 当前执行语句 —— keep() 归属用(引擎在语句 fn 之前设置)
12
12
  * 3. Shape 身份表 —— 构造器登记(isShape 依据)与 Shape→PartName 反查
13
13
  *
@@ -321,4 +321,97 @@ function registerKeep(shapes, hidden) {
321
321
  return;
322
322
  keepSink(String(stmt.id), names, hidden);
323
323
  }
324
+ const pendingDetectedUnits = new Map();
325
+ /**
326
+ * Register a part's declared file unit (called from the load op body; the unit
327
+ * is metadata only — coordinates are already base-unit, never re-scaled).
328
+ *
329
+ * @param partName - the variable name the loaded shape will be bound to.
330
+ * @param unit - the file's own declared unit (faijs UnitName).
331
+ */
332
+ export function setPendingDetectedUnit(partName, unit) {
333
+ pendingDetectedUnits.set(partName, unit);
334
+ }
335
+ /**
336
+ * Take all pending detected units and clear them (engine, after each statement;
337
+ * consumed exactly once).
338
+ *
339
+ * @returns a fresh Map of part name → declared unit, copied from the pending
340
+ * store and cleared so it is consumed exactly once.
341
+ */
342
+ export function takePendingDetectedUnits() {
343
+ const out = new Map(pendingDetectedUnits);
344
+ pendingDetectedUnits.clear();
345
+ return out;
346
+ }
347
+ const pendingMultiPartCounts = new Map();
348
+ /**
349
+ * Register a part that was downgraded from a multi-part file (called from the
350
+ * load op body; the shape returned is only the first-part geometry).
351
+ *
352
+ * @param partName - the variable name the loaded (single) shape is bound to.
353
+ * @param partCount - the total number of parts the source file declared (>= 2).
354
+ */
355
+ export function setPendingMultiPartCount(partName, partCount) {
356
+ pendingMultiPartCounts.set(partName, partCount);
357
+ }
358
+ /**
359
+ * Take all pending multi-part counts and clear them (engine, after each
360
+ * statement; consumed exactly once).
361
+ *
362
+ * @returns a fresh Map of part name → part count, copied from the pending store.
363
+ */
364
+ export function takePendingMultiPartCounts() {
365
+ const out = new Map(pendingMultiPartCounts);
366
+ pendingMultiPartCounts.clear();
367
+ return out;
368
+ }
369
+ // ── 网格实体登记(方案 2026-10-01 §3.3:load 的 mesh 路径产出网格实体 + 近似拓扑)──
370
+ // 与 pendingDetectedUnits 同模式:load op(在 @faicad/faijs-extra)不能直接持有
371
+ // CadRuntime 实例,故把"规范化得到的句柄"与"近似拓扑数据"登记到这里,引擎在语句
372
+ // 执行后取走:句柄进 MeshSolidRegistry + 写 Shape 槽,拓扑进 topologyCache。
373
+ //
374
+ // 两步分开登记(而不是塞进一个结构)是为了让**拓扑可缺失**:句柄是 mesh 零件的
375
+ // 身份,拓扑是它的可用性;将来若出现"只有句柄、拓扑延后构建"的路径,不需要改协议。
376
+ const pendingMeshSolids = new Map();
377
+ const pendingMeshTopologies = new Map();
378
+ /**
379
+ * 登记某 part 的网格实体句柄(load op 调用;由引擎在语句执行后收编)。
380
+ *
381
+ * @param partName - the variable name the loaded mesh shape will be bound to.
382
+ * @param solid - the normalized mesh solid handle (opaque outside the mesh backend).
383
+ */
384
+ export function setPendingMeshSolid(partName, solid) {
385
+ pendingMeshSolids.set(partName, solid);
386
+ }
387
+ /**
388
+ * 取走全部待收编的网格实体句柄并清空(引擎在语句执行后调用,消费一次)。
389
+ *
390
+ * @returns a fresh Map of part name → mesh solid handle.
391
+ */
392
+ export function takePendingMeshSolids() {
393
+ const out = new Map(pendingMeshSolids);
394
+ pendingMeshSolids.clear();
395
+ return out;
396
+ }
397
+ /**
398
+ * 登记某 part 的近似拓扑数据(load op 调用;`SelectorRuntimeData`,本层只按
399
+ * `unknown` 透传——零依赖红线)。
400
+ *
401
+ * @param partName - the variable name the loaded mesh shape will be bound to.
402
+ * @param data - the serializable selector runtime data built from the mesh solid.
403
+ */
404
+ export function setPendingMeshTopology(partName, data) {
405
+ pendingMeshTopologies.set(partName, data);
406
+ }
407
+ /**
408
+ * 取走全部待收编的近似拓扑数据并清空(引擎在语句执行后调用,消费一次)。
409
+ *
410
+ * @returns a fresh Map of part name → selector runtime data.
411
+ */
412
+ export function takePendingMeshTopologies() {
413
+ const out = new Map(pendingMeshTopologies);
414
+ pendingMeshTopologies.clear();
415
+ return out;
416
+ }
324
417
  //# sourceMappingURL=runtime-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * runtime-state — 全局运行时状态锚点(零依赖层)\n *\n *\n * 本模块位于 L0+(零运行时依赖),是 L3 API 面(core/src/api,原 stdlib)与\n * cad-runtime(L2)之间唯一的共享状态。**放在这一层是为了避免循环依赖**:\n * api/ 不能 import cad-runtime(cad-runtime/api-namespace.ts 已经 import 了 api/)。\n *\n * 承载三类状态:\n * 1. Backends —— 宿主注入的环境资源(内核 / 端口 / 模式 / 标准库命名空间)\n * 2. 当前执行语句 —— keep() 归属用(引擎在语句 fn 之前设置)\n * 3. Shape 身份表 —— 构造器登记(isShape 依据)与 Shape→PartName 反查\n *\n * ⚠️ 依赖方向红线:本文件不得 import 任何 src/ 下的模块(只可 import type)。\n */\n\nimport type { PartName, StmtId } from './identity'\n\n/**\n * Lightweight execution anchor — carries only the fields consumed by\n * library functions via getCurrentStmt(): `id` (StmtId), `outputs` (PartName[]),\n * `callee`, and `hasAssignment`. The DirectExecutor creates these from\n * line-number + writes.\n */\nexport interface ExecutionAnchor {\n readonly id: string\n readonly outputs: PartName[]\n readonly callee?: string\n readonly hasAssignment?: boolean\n}\n\n// ── 后端配置(宿主注入的环境资源)──\n\n/**\n * 执行模式(与 src/cad-runtime/ports.ts 的 ExecutionMode 保持一致)。\n *\n * 此处重复定义是为了保持本模块零依赖。一致性由 `cad-runtime/runtime.ts:460`\n * (`mode: this.mode`,`ExecutionMode` → 本类型的赋值)在编译期间接钉住:\n * 只给 `ExecutionMode` 加成员而不加到这里 → 该行 tsc 报错。\n * (2026-09-22 核实:无独立守卫测试。)\n */\nexport type RuntimeExecutionMode = 'auto' | 'brep' | 'mesh'\n\n/** 宿主注入的环境资源。字段类型用宽松结构,避免本模块依赖具体实现。 */\nexport interface Backends {\n /** 契约版本(装配期校验,不兼容即抛错) */\n readonly contractVersion: number\n /** 执行配置(可变对象,宿主可在运行期切换) */\n readonly config: {\n mode: RuntimeExecutionMode\n /** 当前 BREP 引擎 id(注册表首个注册者;未注册为 null)。能力路由读(§8.4)。 */\n brepEngineId?: string | null\n /**\n * 当前引擎能力声明(宽松结构,零依赖)。能力路由读(§8.4)。\n *\n * `evolution` = 本引擎**实际提供**的 `*WithHistory` 核函数名名单\n * (`brep/engine/types.ts` 的 `BrepEvolutionKind`)。**不是**族级布尔——\n * 族级布尔会多报能力、使静态判定失效(Phase 0.2)。\n * 本模块须零依赖,故此处只写 `readonly string[]`;权威类型见\n * `BrepCapabilities`,消费侧由 `backend-dispatch.engineCapabilitySet` 归一化。\n */\n brepCapabilities?: {\n evolution?: readonly string[]\n /**\n * 非演化内核方法名(D5):本引擎**实际提供**的 L1 中立方法名\n * (`getBoundingBox` / `getVolume` / `getSurfaceArea` / `getLength` /\n * `getCenterOfMass` 等)。2026-09-24 narrowing plan §2.4:与\n * `backend-dispatch.EngineCapabilitiesLike` 对齐(该类型有 `methods`,\n * 运行时配置镜像此前缺失——非字面量赋值不做 excess property 检查,\n * `methods` 判定\"能用但没被契约钉住\")。\n */\n methods?: readonly string[]\n heal?: boolean\n directEdit?: boolean\n advSurface?: boolean\n assembly?: boolean\n meshLift?: boolean\n }\n partTransform?: { position: [number, number, number]; scale?: [number, number, number] }\n }\n /** 几何后端。brep 引擎异步初始化 → 用 getter。 */\n readonly kernel: {\n readonly brep: unknown | null\n readonly csg: unknown | undefined\n readonly sdf: unknown | undefined\n }\n /** 宿主端口(透传 HostPorts) */\n readonly fonts: unknown\n readonly texture: unknown\n readonly assets: unknown\n readonly events: unknown\n /** faijs 自带标准库命名空间(引擎不区分它与第三方库——都是库函数;P5 起由宿主注入,core 不默认装配) */\n readonly cad?: StdlibNamespace\n}\n\n/**\n * 契约版本。破坏性变更 +1。加载第三方库时校验,不兼容即抛错。\n *\n * v3(P23,§5.2 / D11):`defineOp` 的实现边界统一为 Result 语义——实现可返回\n * `Result`(边界 unwrap,`err` → 抛错)、可抛错(归一为带 op 名的错误),\n * 也可照旧返回裸产物(透传);并新增 D11 `positional` 位置形态声明。\n * v2 → v3 是破坏性变更:按 v2 契约构建的库必须重新构建。\n */\nexport const CONTRACT_VERSION = 3\n\n/** 库函数签名(引擎视角:任意参数的普通函数,信息均匀化,不按名字分支)。 */\nexport type StdlibFn = (...args: any[]) => unknown\n\n/** 库命名空间:函数名 → 库函数(faijs 自带标准库与第三方库同构)。 */\nexport interface StdlibNamespace {\n [name: string]: StdlibFn\n}\n\n/**\n * 契约版本校验(P7 第三方库通道):加载时校验,不兼容即抛错(不静默降级)。\n * 第三方库模块若带 contractVersion 字段(与 CONTRACT_VERSION 对齐),必须匹配。\n *\n * @param lib - the library module whose contractVersion field is validated.\n */\nexport function assertContractVersion(lib: { contractVersion?: unknown }): void {\n if (lib.contractVersion !== undefined && lib.contractVersion !== CONTRACT_VERSION) {\n throw new Error(\n `[faijs] library contract version mismatch: got ${String(lib.contractVersion)}, expected ${CONTRACT_VERSION}`,\n )\n }\n}\n\n/**\n * brep 强制模式下的不支持错误(mesh-only 函数 / 输入不在 BREP 链)。\n *\n * 由分派路径抛出,CadRuntime 捕获后转换为 ExecutionResult.failedAt\n * (与旧解释器\"brep 模式立即返回 E_BREP_UNSUPPORTED,不静默回退 mesh\"的语义一致)。\n * P2 起定义在本层(零依赖),L3 API 命名空间与引擎共享同一类(instanceof 判定)。\n */\nexport class BrepUnsupportedError extends Error {\n /** The statement that triggered the unsupported operation, when available. */\n readonly stmt?: ExecutionAnchor\n constructor(message: string, stmt?: ExecutionAnchor) {\n super(message)\n this.name = 'BrepUnsupportedError'\n this.stmt = stmt\n }\n}\n\n/**\n * Unsupported error for mesh-forced mode (brep-only functions, or auto-mode\n * brep-only functions with a broken input chain).\n *\n * Symmetric to BrepUnsupportedError: thrown statically by the dispatch path,\n * caught by CadRuntime and converted into ExecutionResult.failedAt. A brep-only\n * function being unavailable in mesh mode is expected behavior (mode ×\n * implementation-set mismatch), not a bug fallback — the static-dispatch red\n * line (no try-catch, no runtime fallback) is unchanged.\n */\nexport class MeshUnsupportedError extends Error {\n /** The statement that triggered the unsupported operation, when available. */\n readonly stmt?: ExecutionAnchor\n constructor(message: string, stmt?: ExecutionAnchor) {\n super(message)\n this.name = 'MeshUnsupportedError'\n this.stmt = stmt\n }\n}\n\n// ── 状态容器 ──\n\n/**\n * The global runtime state singleton: backend configuration, the currently\n * executing statement, and the Shape identity tables (constructor registry,\n * identity slots, and Shape → PartName reverse lookup).\n */\nexport interface FaijsRuntimeState {\n readonly stateVersion: number\n /** 后端配置(configureBackends 写入) */\n backends: Backends | undefined\n /** 当前执行语句锚点(引擎在语句 fn 之前设置) */\n currentStmt: ExecutionAnchor | undefined\n /** Shape 构造器登记(isShape 的唯一依据) */\n readonly created: WeakSet<object>\n /** Shape 身份槽 */\n readonly slots: WeakMap<object, ShapeSlot>\n /** Shape → PartName 反查(keep 与 dependentsOf 用) */\n readonly shapeToName: WeakMap<object, PartName>\n /** 同语句 lineage 去重标记(define-op 写入;语句边界 setCurrentStmt 重置)。 */\n registeredStmtId: StmtId | undefined\n}\n\n// ── 函数 BREP 域(控制流放松方案 §5.6 / D13) ──\n// 本机函数体内的瞬态 BREP 句柄:进入函数时开启登记域,op 输出句柄写入时经\n// registerFunctionBrep 登记;函数返回后引擎取走域、释放除返回值可到达句柄外的全部\n// (对齐「调用方负责句柄生命周期」brep-ops.ts 与 meshesToStep 的 finally 模式)。\n// 全局计数与 DirectExecutor.userFunctionDepth 同步(单 runtime 场景,与 setCurrentStmt 同构)。\n\nlet functionBrepDepth = 0\nconst functionBrepDomain: unknown[] = []\n\n/** 进入函数 BREP 域(DirectExecutor 执行 local 语句 fn 之前调用)。 */\nexport function enterFunctionBrep(): void {\n if (functionBrepDepth === 0) functionBrepDomain.length = 0\n functionBrepDepth++\n}\n\n/** 退出函数 BREP 域(fn 结束后调用)。 */\nexport function exitFunctionBrep(): void {\n functionBrepDepth = Math.max(0, functionBrepDepth - 1)\n}\n\n/**\n * 登记函数域内新产生的 BREP 句柄(hook 点在 op 输出 shape 槽位写入处——fromBrep)。\n * 非函数域(depth = 0)时 no-op(零开销,现状路径不变)。\n * @param solid - 新产生的 OCCT 句柄。\n */\nexport function registerFunctionBrep(solid: unknown): void {\n if (functionBrepDepth > 0) functionBrepDomain.push(solid)\n}\n\n/**\n * 取走当前函数域的句柄登记表并清空(引擎在 fn 结束后调用,随后释放非返回值句柄)。\n * @returns 当前函数域的句柄登记表快照。\n */\nexport function takeFunctionBrepDomain(): unknown[] {\n const domain = [...functionBrepDomain]\n functionBrepDomain.length = 0\n return domain\n}\n\n/** Shape 身份槽(OCCT 句柄 + 面演化 + 拓扑命名 + 装配行为)。 */\nexport interface ShapeSlot {\n solid?: unknown\n faceEvolution?: Map<number, number[]>\n // 1.10 前置③:roleTable 槽字段已删除——权威落点在血缘图旁挂\n // (topology/naming/lineage.ts 的 recordOutput / tableOfPart),\n // 解析缓存 miss 由回走重算恢复(api/topo-resolve.ts)。\n /** mesh/primitive 面 hint 快照(§3.6 setTopology 注入时由 runtime 提炼写入,解析兜底用)。 */\n faceHints?: unknown\n behavior?: unknown\n}\n\n/**\n * 装配变换(引擎应用):求解在库(solveTransforms),应用与下游失效在引擎(P6)。\n * index = 成员下标(compound.children 内)。\n */\nexport interface AssemblyTransform {\n index: number\n quaternion: [number, number, number, number]\n pivot: [number, number, number]\n translation: [number, number, number]\n rotationMatrix: number[]\n}\n\n/**\n * do_assemble 的待应用变换登记(P6:求解 ≠ 传播)。\n * 库只把求解结果写到这里;引擎在语句执行后取走并应用 + 失效下游。\n */\nconst pendingAssemblyKeys = new Set<object>()\nconst pendingAssemblyTransforms = new WeakMap<object, AssemblyTransform[]>()\n\n/**\n * Register a compound's pending assembly transforms (called from the\n * do_assemble method body; accumulates across calls).\n *\n * @param c - the compound object that owns the transforms.\n * @param ts - the assembly transforms to append.\n */\nexport function setPendingAssemblyTransforms(c: object, ts: AssemblyTransform[]): void {\n if (ts.length === 0) return\n pendingAssemblyKeys.add(c)\n const existing = pendingAssemblyTransforms.get(c) ?? []\n pendingAssemblyTransforms.set(c, [...existing, ...ts])\n}\n\n/**\n * Take all pending assembly transforms and clear them (called by the engine's\n * afterStatement hook; consumed exactly once).\n *\n * @returns the list of compounds with their accumulated transforms.\n */\nexport function takePendingAssemblyTransforms(): Array<{ compound: object; transforms: AssemblyTransform[] }> {\n const out: Array<{ compound: object; transforms: AssemblyTransform[] }> = []\n for (const c of pendingAssemblyKeys) {\n const ts = pendingAssemblyTransforms.get(c)\n if (ts && ts.length > 0) out.push({ compound: c, transforms: ts })\n pendingAssemblyTransforms.delete(c)\n }\n pendingAssemblyKeys.clear()\n return out\n}\n\n// ── P3:运动副位姿登记(ExecutionResult.kinematics)──\n// 与 pendingAssemblyTransforms 同模式:库只把 solveKinematics 的 per-member 位姿\n// 写到这里,引擎在语句执行后取走并放入 ExecutionResult.kinematics(宿主动画/导出\n// 从 ExecutionResult 读取,不新增返回值消费语义)。\n\n/** 单个成员的位姿(position + faijs [x,y,z,w] rotation;与 api/assembly/joints 的 KinematicsPose 结构一致)。 */\nexport interface AssemblyKinematicsPose {\n position: [number, number, number]\n rotation: [number, number, number, number]\n}\n\n/** 位姿键:成员名 → AssemblyKinematicsPose(含恒等链根;键 = PartName)。 */\nexport type AssemblyKinematics = Record<string, AssemblyKinematicsPose>\n\nconst pendingKinematicsKeys = new Set<object>()\nconst pendingAssemblyKinematics = new WeakMap<object, AssemblyKinematics>()\n\n/**\n * Register a compound's pending assembly kinematics (P3; called from the\n * do_assemble/solve method body; accumulates across calls).\n *\n * @param c - the compound object that owns the kinematics.\n * @param kin - per-member poses keyed by member name (all members, incl. identity).\n */\nexport function setPendingAssemblyKinematics(c: object, kin: AssemblyKinematics): void {\n pendingKinematicsKeys.add(c)\n pendingAssemblyKinematics.set(c, kin)\n}\n\n/**\n * Take all pending assembly kinematics and clear them (called by the engine after\n * an assembly statement; consumed exactly once).\n *\n * @returns the list of compounds with their per-member kinematics.\n */\nexport function takePendingAssemblyKinematics(): Array<{ compound: object; kinematics: AssemblyKinematics }> {\n const out: Array<{ compound: object; kinematics: AssemblyKinematics }> = []\n for (const c of pendingKinematicsKeys) {\n const kin = pendingAssemblyKinematics.get(c)\n if (kin) out.push({ compound: c, kinematics: kin })\n pendingAssemblyKinematics.delete(c)\n }\n pendingKinematicsKeys.clear()\n return out\n}\n\nconst STATE_VERSION = 1\nconst KEY = '__FAICAD_FAIJS_RUNTIME__'\n\n/**\n * 获取全局状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 打进一份)共享同一份状态——两份 WeakSet 会导致 Shape 身份不通(几何孤岛)。\n * 构建期去重(external)是主手段,这里是兜底。\n *\n * @returns the shared global runtime state singleton.\n */\nexport function getRuntimeState(): FaijsRuntimeState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[KEY] as FaijsRuntimeState | undefined\n if (existing) {\n if (existing.stateVersion !== STATE_VERSION) {\n throw new Error(\n `[faijs] runtime state version mismatch: loaded=${existing.stateVersion}, expected=${STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: FaijsRuntimeState = {\n stateVersion: STATE_VERSION,\n backends: undefined,\n currentStmt: undefined,\n created: new WeakSet<object>(),\n slots: new WeakMap<object, ShapeSlot>(),\n shapeToName: new WeakMap<object, PartName>(),\n registeredStmtId: undefined,\n }\n g[KEY] = created\n return created\n}\n\n// ── 后端配置读写 ──\n\n/**\n * 宿主在启动时调用一次,注入环境资源。\n *\n * @param backends - the host-injected environment resources.\n */\nexport function configureBackends(backends: Backends): void {\n getRuntimeState().backends = backends\n}\n\n/**\n * 读取后端配置。库函数通过它获取内核与宿主端口。\n *\n * 未配置时抛错——不要返回默认值兜底(配置是宿主的责任,缺失必须暴露)。\n *\n * @returns the configured backend resources.\n */\nexport function getBackends(): Backends {\n const b = getRuntimeState().backends\n if (!b) {\n throw new Error('[faijs] backends not configured: call configureBackends() before executing')\n }\n return b\n}\n\n// ── 当前执行语句(引擎内部状态)──\n\n/**\n * 引擎在语句 fn 之前调用(替换现状的 exec.currentStmt = source)。\n *\n * @param stmt - the statement currently being executed.\n */\nexport function setCurrentStmt(stmt: ExecutionAnchor | undefined): void {\n const s = getRuntimeState()\n // 语句边界:锚点变化(含语句结束置 undefined)时解除同语句 lineage 去重标记,\n // 使下一条语句(或同 id 复跑)重新获得注册资格;同一条语句内 TS 库函数\n // (如 cq-compat Workplane op)连续调用多个 defineOp 时共享锚点,标记保持\n // 生效,嵌套调用正确跳过注册(见 define-op 的 isOuter 判定)。\n if (s.currentStmt?.id !== stmt?.id) s.registeredStmtId = undefined\n s.currentStmt = stmt\n}\n\n/**\n * 读取当前执行语句。库函数不应调用它(F1)。\n *\n * @returns the currently executing statement, or undefined if none.\n */\nexport function getCurrentStmt(): ExecutionAnchor | undefined {\n return getRuntimeState().currentStmt\n}\n\n// ── Shape 身份表 ──\n\n/**\n * Shape → 变量名反查(keep 与 dependentsOf 依赖)。\n *\n * @param shape - the shape to look up.\n * @returns the part name registered for the shape, or undefined.\n */\nexport function nameOf(shape: object): PartName | undefined {\n return getRuntimeState().shapeToName.get(shape)\n}\n\n/**\n * 登记 Shape → 变量名映射。\n *\n * @param shape - the shape to register.\n * @param name - the part name to associate with the shape.\n */\nexport function setName(shape: object, name: PartName): void {\n getRuntimeState().shapeToName.set(shape, name)\n}\n\n// ── keep 声明(库函数体调用)──\n\n/**\n * 登记回调类型。由 DirectExecutor 在装配时注入(保持 runtime-state 零依赖)。\n */\nexport type KeepSink = (stmtId: string, names: PartName[], hidden: boolean) => void\n\nlet keepSink: KeepSink | undefined\n\n/**\n * 引擎装配 keep 的落地目标(DirectExecutor.registerKeep)。\n *\n * @param sink - the keep callback registered by the engine, or undefined to clear.\n */\nexport function setKeepSink(sink: KeepSink | undefined): void {\n keepSink = sink\n}\n\n/**\n * 函数体 keep 声明:声明保留这些 Shape 对应的变量(可见)。\n *\n * 库作者在库函数体内调用:\n * ```ts\n * import { keep } from '@faicad/faijs'\n * export function group(params) {\n * keep(...params.members)\n * return compound(params.members)\n * }\n * ```\n *\n * 归属到\"当前正在执行的语句\"(引擎在 fn 之前 setCurrentStmt)。\n * 未登记在 shapeToName 的对象(库内部的自定义对象)被忽略——这是刻意的静默。\n *\n * @param shapes - the shapes whose corresponding variables should be kept.\n */\nexport function keep(...shapes: unknown[]): void {\n registerKeep(shapes, false)\n}\n\n/**\n * 函数体 keep 声明:保留但 canvas 不渲染(布尔系函数的源)。\n *\n * @param shapes - the shapes whose corresponding variables should be kept hidden.\n */\nexport function keepHidden(...shapes: unknown[]): void {\n registerKeep(shapes, true)\n}\n\nfunction registerKeep(shapes: unknown[], hidden: boolean): void {\n const stmt = getRuntimeState().currentStmt\n if (!stmt || !keepSink) return\n const names: PartName[] = []\n for (const s of shapes) {\n if (s === null || typeof s !== 'object') continue\n const n = nameOf(s)\n if (n !== undefined) names.push(n)\n }\n if (names.length === 0) return\n keepSink(String(stmt.id), names, hidden)\n}\n"]}
1
+ {"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * runtime-state — 全局运行时状态锚点(零依赖层)\n *\n *\n * 本模块位于 L0+(零运行时依赖),是 L3 API 面(core/src/api)与\n * cad-runtime(L2)之间唯一的共享状态。**放在这一层是为了避免循环依赖**:\n * api/ 不能 import cad-runtime(cad-runtime/api-namespace.ts 已经 import 了 api/)。\n *\n * 承载三类状态:\n * 1. Backends —— 宿主注入的环境资源(内核 / 端口 / 模式 / 平台库命名空间)\n * 2. 当前执行语句 —— keep() 归属用(引擎在语句 fn 之前设置)\n * 3. Shape 身份表 —— 构造器登记(isShape 依据)与 Shape→PartName 反查\n *\n * ⚠️ 依赖方向红线:本文件不得 import 任何 src/ 下的模块(只可 import type)。\n */\n\nimport type { PartName, StmtId } from './identity'\n\n/**\n * Lightweight execution anchor — carries only the fields consumed by\n * library functions via getCurrentStmt(): `id` (StmtId), `outputs` (PartName[]),\n * `callee`, and `hasAssignment`. The DirectExecutor creates these from\n * line-number + writes.\n */\nexport interface ExecutionAnchor {\n readonly id: string\n readonly outputs: PartName[]\n readonly callee?: string\n readonly hasAssignment?: boolean\n}\n\n// ── 后端配置(宿主注入的环境资源)──\n\n/**\n * 执行模式(与 src/cad-runtime/ports.ts 的 ExecutionMode 保持一致)。\n *\n * 此处重复定义是为了保持本模块零依赖。一致性由 `cad-runtime/runtime.ts:460`\n * (`mode: this.mode`,`ExecutionMode` → 本类型的赋值)在编译期间接钉住:\n * 只给 `ExecutionMode` 加成员而不加到这里 → 该行 tsc 报错。\n * (2026-09-22 核实:无独立守卫测试。)\n */\nexport type RuntimeExecutionMode = 'auto' | 'brep' | 'mesh'\n\n/** 宿主注入的环境资源。字段类型用宽松结构,避免本模块依赖具体实现。 */\nexport interface Backends {\n /** 契约版本(装配期校验,不兼容即抛错) */\n readonly contractVersion: number\n /** 执行配置(可变对象,宿主可在运行期切换) */\n readonly config: {\n mode: RuntimeExecutionMode\n /** 当前 BREP 引擎 id(注册表首个注册者;未注册为 null)。能力路由读(§8.4)。 */\n brepEngineId?: string | null\n /**\n * 当前引擎能力声明(宽松结构,零依赖)。能力路由读(§8.4)。\n *\n * `evolution` = 本引擎**实际提供**的 `*WithHistory` 核函数名名单\n * (`brep/engine/types.ts` 的 `BrepEvolutionKind`)。**不是**族级布尔——\n * 族级布尔会多报能力、使静态判定失效(Phase 0.2)。\n * 本模块须零依赖,故此处只写 `readonly string[]`;权威类型见\n * `BrepCapabilities`,消费侧由 `backend-dispatch.engineCapabilitySet` 归一化。\n */\n brepCapabilities?: {\n evolution?: readonly string[]\n /**\n * 非演化内核方法名(D5):本引擎**实际提供**的 L1 中立方法名\n * (`getBoundingBox` / `getVolume` / `getSurfaceArea` / `getLength` /\n * `getCenterOfMass` 等)。2026-09-24 narrowing plan §2.4:与\n * `backend-dispatch.EngineCapabilitiesLike` 对齐(该类型有 `methods`,\n * 运行时配置镜像此前缺失——非字面量赋值不做 excess property 检查,\n * `methods` 判定\"能用但没被契约钉住\")。\n */\n methods?: readonly string[]\n heal?: boolean\n directEdit?: boolean\n advSurface?: boolean\n assembly?: boolean\n meshLift?: boolean\n }\n partTransform?: { position: [number, number, number]; scale?: [number, number, number] }\n }\n /** 几何后端。brep 引擎异步初始化 → 用 getter。 */\n readonly kernel: {\n readonly brep: unknown | null\n readonly csg: unknown | undefined\n readonly sdf: unknown | undefined\n /**\n * 网格实体后端(网格语义路径的内核;`brep/mesh-solid.ts` 的 `MeshSolidBackend`)。\n *\n * **与 `brep` 独立**:mesh 零件既可以在「宿主用 OCCT 做 BREP、用 brepkit 做\n * mesh」的装配下产出,也可以在纯 mesh 模式下产出。未装配 → `undefined`,\n * 此时 `load` 的 mesh 路径保持\"裸网格、无近似拓扑\"的历史行为(这不是静默\n * 降级:没有网格内核是宿主的装配事实,与\"规范化失败\"是两回事)。\n *\n * 类型在本模块里写 `unknown`(零依赖红线),权威类型见 `MeshSolidBackend`。\n */\n readonly meshSolid?: unknown\n }\n /** 宿主端口(透传 HostPorts) */\n readonly fonts: unknown\n readonly texture: unknown\n readonly assets: unknown\n readonly events: unknown\n /** faijs 平台库命名空间(引擎不区分它与第三方库——都是库函数;由宿主注入,core 不默认装配) */\n readonly cad?: LibNamespace\n}\n\n/**\n * 契约版本。破坏性变更 +1。加载第三方库时校验,不兼容即抛错。\n *\n * v3(P23,§5.2 / D11):`defineOp` 的实现边界统一为 Result 语义——实现可返回\n * `Result`(边界 unwrap,`err` → 抛错)、可抛错(归一为带 op 名的错误),\n * 也可照旧返回裸产物(透传);并新增 D11 `positional` 位置形态声明。\n * v2 → v3 是破坏性变更:按 v2 契约构建的库必须重新构建。\n */\nexport const CONTRACT_VERSION = 3\n\n/** 库函数签名(引擎视角:任意参数的普通函数,信息均匀化,不按名字分支)。 */\nexport type LibFn = (...args: any[]) => unknown\n\n/** 库命名空间:函数名 → 库函数(faijs 平台库与第三方库同构)。 */\nexport interface LibNamespace {\n [name: string]: LibFn\n}\n\n/**\n * 契约版本校验(P7 第三方库通道):加载时校验,不兼容即抛错(不静默降级)。\n * 第三方库模块若带 contractVersion 字段(与 CONTRACT_VERSION 对齐),必须匹配。\n *\n * @param lib - the library module whose contractVersion field is validated.\n */\nexport function assertContractVersion(lib: { contractVersion?: unknown }): void {\n if (lib.contractVersion !== undefined && lib.contractVersion !== CONTRACT_VERSION) {\n throw new Error(\n `[faijs] library contract version mismatch: got ${String(lib.contractVersion)}, expected ${CONTRACT_VERSION}`,\n )\n }\n}\n\n/**\n * brep 强制模式下的不支持错误(mesh-only 函数 / 输入不在 BREP 链)。\n *\n * 由分派路径抛出,CadRuntime 捕获后转换为 ExecutionResult.failedAt\n * (与旧解释器\"brep 模式立即返回 E_BREP_UNSUPPORTED,不静默回退 mesh\"的语义一致)。\n * P2 起定义在本层(零依赖),L3 API 命名空间与引擎共享同一类(instanceof 判定)。\n */\nexport class BrepUnsupportedError extends Error {\n /** The statement that triggered the unsupported operation, when available. */\n readonly stmt?: ExecutionAnchor\n constructor(message: string, stmt?: ExecutionAnchor) {\n super(message)\n this.name = 'BrepUnsupportedError'\n this.stmt = stmt\n }\n}\n\n/**\n * Unsupported error for mesh-forced mode (brep-only functions, or auto-mode\n * brep-only functions with a broken input chain).\n *\n * Symmetric to BrepUnsupportedError: thrown statically by the dispatch path,\n * caught by CadRuntime and converted into ExecutionResult.failedAt. A brep-only\n * function being unavailable in mesh mode is expected behavior (mode ×\n * implementation-set mismatch), not a bug fallback — the static-dispatch red\n * line (no try-catch, no runtime fallback) is unchanged.\n */\nexport class MeshUnsupportedError extends Error {\n /** The statement that triggered the unsupported operation, when available. */\n readonly stmt?: ExecutionAnchor\n constructor(message: string, stmt?: ExecutionAnchor) {\n super(message)\n this.name = 'MeshUnsupportedError'\n this.stmt = stmt\n }\n}\n\n// ── 状态容器 ──\n\n/**\n * The global runtime state singleton: backend configuration, the currently\n * executing statement, and the Shape identity tables (constructor registry,\n * identity slots, and Shape → PartName reverse lookup).\n */\nexport interface FaijsRuntimeState {\n readonly stateVersion: number\n /** 后端配置(configureBackends 写入) */\n backends: Backends | undefined\n /** 当前执行语句锚点(引擎在语句 fn 之前设置) */\n currentStmt: ExecutionAnchor | undefined\n /** Shape 构造器登记(isShape 的唯一依据) */\n readonly created: WeakSet<object>\n /** Shape 身份槽 */\n readonly slots: WeakMap<object, ShapeSlot>\n /** Shape → PartName 反查(keep 与 dependentsOf 用) */\n readonly shapeToName: WeakMap<object, PartName>\n /** 同语句 lineage 去重标记(define-op 写入;语句边界 setCurrentStmt 重置)。 */\n registeredStmtId: StmtId | undefined\n}\n\n// ── 函数 BREP 域(控制流放松方案 §5.6 / D13) ──\n// 本机函数体内的瞬态 BREP 句柄:进入函数时开启登记域,op 输出句柄写入时经\n// registerFunctionBrep 登记;函数返回后引擎取走域、释放除返回值可到达句柄外的全部\n// (对齐「调用方负责句柄生命周期」brep-ops.ts 与 meshesToStep 的 finally 模式)。\n// 全局计数与 DirectExecutor.userFunctionDepth 同步(单 runtime 场景,与 setCurrentStmt 同构)。\n\nlet functionBrepDepth = 0\nconst functionBrepDomain: unknown[] = []\n\n/** 进入函数 BREP 域(DirectExecutor 执行 local 语句 fn 之前调用)。 */\nexport function enterFunctionBrep(): void {\n if (functionBrepDepth === 0) functionBrepDomain.length = 0\n functionBrepDepth++\n}\n\n/** 退出函数 BREP 域(fn 结束后调用)。 */\nexport function exitFunctionBrep(): void {\n functionBrepDepth = Math.max(0, functionBrepDepth - 1)\n}\n\n/**\n * 登记函数域内新产生的 BREP 句柄(hook 点在 op 输出 shape 槽位写入处——fromBrep)。\n * 非函数域(depth = 0)时 no-op(零开销,现状路径不变)。\n * @param solid - 新产生的 OCCT 句柄。\n */\nexport function registerFunctionBrep(solid: unknown): void {\n if (functionBrepDepth > 0) functionBrepDomain.push(solid)\n}\n\n/**\n * 取走当前函数域的句柄登记表并清空(引擎在 fn 结束后调用,随后释放非返回值句柄)。\n * @returns 当前函数域的句柄登记表快照。\n */\nexport function takeFunctionBrepDomain(): unknown[] {\n const domain = [...functionBrepDomain]\n functionBrepDomain.length = 0\n return domain\n}\n\n/** Shape 身份槽(OCCT 句柄 + 网格实体句柄 + 网格面句柄 + 面演化 + 拓扑命名 + 装配行为)。 */\nexport interface ShapeSlot {\n /** BREP 精度链句柄。与 `meshSolid` / `meshFace` **互斥**(同时存在 = 缺陷)。 */\n solid?: unknown\n /**\n * 网格实体句柄(近似链)。与 `solid` **互斥**——网格零件按定义没有精度链,\n * BREP 实体也不携带网格实体。互斥由 `backend-dispatch.assertShapeSlotExclusive`\n * 在分派前静态校验(不给运行时\"选边站\"的机会;方案 §3.2)。\n *\n * 它只表示\"这个 Shape 是网格零件\"这一事实,句柄的生命周期由\n * `brep/mesh-solid.ts` 的 `MeshSolidRegistry` 持有。\n */\n meshSolid?: unknown\n /**\n * 网格链**面**句柄(近似链的构造中几何,方案 2026-10-01 §4 Phase 3)。\n *\n * 与 `solid` / `meshSolid` 互斥:它是网格链上的一张面(`sketchOnFace` 在\n * 近似拓扑面上铺草图后的产物),既不是精度链实体,也不是网格零件本身。\n * 它存在的原因和 BREP 链上「面 Shape」完全对称——BREP 侧 `sketchOnFace` 返回\n * `fromBrep(face, { solid: face })`,面句柄同样占着 `solid` 槽;网格侧若把面句柄\n * 塞进 `solid`,`hasBrep` 会变真、分派会走精度链,在只有网格后端的宿主上必然报错。\n * 所以面句柄需要自己的一格,不能借位。\n */\n meshFace?: unknown\n faceEvolution?: Map<number, number[]>\n // 1.10 前置③:roleTable 槽字段已删除——权威落点在血缘图旁挂\n // (topology/naming/lineage.ts 的 recordOutput / tableOfPart),\n // 解析缓存 miss 由回走重算恢复(api/topo-resolve.ts)。\n /** mesh/primitive 面 hint 快照(§3.6 setTopology 注入时由 runtime 提炼写入,解析兜底用)。 */\n faceHints?: unknown\n behavior?: unknown\n}\n\n/**\n * 装配变换(引擎应用):求解在库(solveTransforms),应用与下游失效在引擎(P6)。\n * index = 成员下标(compound.children 内)。\n */\nexport interface AssemblyTransform {\n index: number\n quaternion: [number, number, number, number]\n pivot: [number, number, number]\n translation: [number, number, number]\n rotationMatrix: number[]\n}\n\n/**\n * do_assemble 的待应用变换登记(P6:求解 ≠ 传播)。\n * 库只把求解结果写到这里;引擎在语句执行后取走并应用 + 失效下游。\n */\nconst pendingAssemblyKeys = new Set<object>()\nconst pendingAssemblyTransforms = new WeakMap<object, AssemblyTransform[]>()\n\n/**\n * Register a compound's pending assembly transforms (called from the\n * do_assemble method body; accumulates across calls).\n *\n * @param c - the compound object that owns the transforms.\n * @param ts - the assembly transforms to append.\n */\nexport function setPendingAssemblyTransforms(c: object, ts: AssemblyTransform[]): void {\n if (ts.length === 0) return\n pendingAssemblyKeys.add(c)\n const existing = pendingAssemblyTransforms.get(c) ?? []\n pendingAssemblyTransforms.set(c, [...existing, ...ts])\n}\n\n/**\n * Take all pending assembly transforms and clear them (called by the engine's\n * afterStatement hook; consumed exactly once).\n *\n * @returns the list of compounds with their accumulated transforms.\n */\nexport function takePendingAssemblyTransforms(): Array<{ compound: object; transforms: AssemblyTransform[] }> {\n const out: Array<{ compound: object; transforms: AssemblyTransform[] }> = []\n for (const c of pendingAssemblyKeys) {\n const ts = pendingAssemblyTransforms.get(c)\n if (ts && ts.length > 0) out.push({ compound: c, transforms: ts })\n pendingAssemblyTransforms.delete(c)\n }\n pendingAssemblyKeys.clear()\n return out\n}\n\n// ── P3:运动副位姿登记(ExecutionResult.kinematics)──\n// 与 pendingAssemblyTransforms 同模式:库只把 solveKinematics 的 per-member 位姿\n// 写到这里,引擎在语句执行后取走并放入 ExecutionResult.kinematics(宿主动画/导出\n// 从 ExecutionResult 读取,不新增返回值消费语义)。\n\n/** 单个成员的位姿(position + faijs [x,y,z,w] rotation;与 api/assembly/joints 的 KinematicsPose 结构一致)。 */\nexport interface AssemblyKinematicsPose {\n position: [number, number, number]\n rotation: [number, number, number, number]\n}\n\n/** 位姿键:成员名 → AssemblyKinematicsPose(含恒等链根;键 = PartName)。 */\nexport type AssemblyKinematics = Record<string, AssemblyKinematicsPose>\n\nconst pendingKinematicsKeys = new Set<object>()\nconst pendingAssemblyKinematics = new WeakMap<object, AssemblyKinematics>()\n\n/**\n * Register a compound's pending assembly kinematics (P3; called from the\n * do_assemble/solve method body; accumulates across calls).\n *\n * @param c - the compound object that owns the kinematics.\n * @param kin - per-member poses keyed by member name (all members, incl. identity).\n */\nexport function setPendingAssemblyKinematics(c: object, kin: AssemblyKinematics): void {\n pendingKinematicsKeys.add(c)\n pendingAssemblyKinematics.set(c, kin)\n}\n\n/**\n * Take all pending assembly kinematics and clear them (called by the engine after\n * an assembly statement; consumed exactly once).\n *\n * @returns the list of compounds with their per-member kinematics.\n */\nexport function takePendingAssemblyKinematics(): Array<{ compound: object; kinematics: AssemblyKinematics }> {\n const out: Array<{ compound: object; kinematics: AssemblyKinematics }> = []\n for (const c of pendingKinematicsKeys) {\n const kin = pendingAssemblyKinematics.get(c)\n if (kin) out.push({ compound: c, kinematics: kin })\n pendingAssemblyKinematics.delete(c)\n }\n pendingKinematicsKeys.clear()\n return out\n}\n\nconst STATE_VERSION = 1\nconst KEY = '__FAICAD_FAIJS_RUNTIME__'\n\n/**\n * 获取全局状态(单例)。\n *\n * 挂在 globalThis 上是为了让\"两份 faijs 代码\"(宿主 bundle 一份、第三方库\n * 打进一份)共享同一份状态——两份 WeakSet 会导致 Shape 身份不通(几何孤岛)。\n * 构建期去重(external)是主手段,这里是兜底。\n *\n * @returns the shared global runtime state singleton.\n */\nexport function getRuntimeState(): FaijsRuntimeState {\n const g = globalThis as unknown as Record<string, unknown>\n const existing = g[KEY] as FaijsRuntimeState | undefined\n if (existing) {\n if (existing.stateVersion !== STATE_VERSION) {\n throw new Error(\n `[faijs] runtime state version mismatch: loaded=${existing.stateVersion}, expected=${STATE_VERSION}`,\n )\n }\n return existing\n }\n const created: FaijsRuntimeState = {\n stateVersion: STATE_VERSION,\n backends: undefined,\n currentStmt: undefined,\n created: new WeakSet<object>(),\n slots: new WeakMap<object, ShapeSlot>(),\n shapeToName: new WeakMap<object, PartName>(),\n registeredStmtId: undefined,\n }\n g[KEY] = created\n return created\n}\n\n// ── 后端配置读写 ──\n\n/**\n * 宿主在启动时调用一次,注入环境资源。\n *\n * @param backends - the host-injected environment resources.\n */\nexport function configureBackends(backends: Backends): void {\n getRuntimeState().backends = backends\n}\n\n/**\n * 读取后端配置。库函数通过它获取内核与宿主端口。\n *\n * 未配置时抛错——不要返回默认值兜底(配置是宿主的责任,缺失必须暴露)。\n *\n * @returns the configured backend resources.\n */\nexport function getBackends(): Backends {\n const b = getRuntimeState().backends\n if (!b) {\n throw new Error('[faijs] backends not configured: call configureBackends() before executing')\n }\n return b\n}\n\n// ── 当前执行语句(引擎内部状态)──\n\n/**\n * 引擎在语句 fn 之前调用(替换现状的 exec.currentStmt = source)。\n *\n * @param stmt - the statement currently being executed.\n */\nexport function setCurrentStmt(stmt: ExecutionAnchor | undefined): void {\n const s = getRuntimeState()\n // 语句边界:锚点变化(含语句结束置 undefined)时解除同语句 lineage 去重标记,\n // 使下一条语句(或同 id 复跑)重新获得注册资格;同一条语句内 TS 库函数\n // (如 cq-compat Workplane op)连续调用多个 defineOp 时共享锚点,标记保持\n // 生效,嵌套调用正确跳过注册(见 define-op 的 isOuter 判定)。\n if (s.currentStmt?.id !== stmt?.id) s.registeredStmtId = undefined\n s.currentStmt = stmt\n}\n\n/**\n * 读取当前执行语句。库函数不应调用它(F1)。\n *\n * @returns the currently executing statement, or undefined if none.\n */\nexport function getCurrentStmt(): ExecutionAnchor | undefined {\n return getRuntimeState().currentStmt\n}\n\n// ── Shape 身份表 ──\n\n/**\n * Shape → 变量名反查(keep 与 dependentsOf 依赖)。\n *\n * @param shape - the shape to look up.\n * @returns the part name registered for the shape, or undefined.\n */\nexport function nameOf(shape: object): PartName | undefined {\n return getRuntimeState().shapeToName.get(shape)\n}\n\n/**\n * 登记 Shape → 变量名映射。\n *\n * @param shape - the shape to register.\n * @param name - the part name to associate with the shape.\n */\nexport function setName(shape: object, name: PartName): void {\n getRuntimeState().shapeToName.set(shape, name)\n}\n\n// ── keep 声明(库函数体调用)──\n\n/**\n * 登记回调类型。由 DirectExecutor 在装配时注入(保持 runtime-state 零依赖)。\n */\nexport type KeepSink = (stmtId: string, names: PartName[], hidden: boolean) => void\n\nlet keepSink: KeepSink | undefined\n\n/**\n * 引擎装配 keep 的落地目标(DirectExecutor.registerKeep)。\n *\n * @param sink - the keep callback registered by the engine, or undefined to clear.\n */\nexport function setKeepSink(sink: KeepSink | undefined): void {\n keepSink = sink\n}\n\n/**\n * 函数体 keep 声明:声明保留这些 Shape 对应的变量(可见)。\n *\n * 库作者在库函数体内调用:\n * ```ts\n * import { keep } from '@faicad/faijs'\n * export function group(params) {\n * keep(...params.members)\n * return compound(params.members)\n * }\n * ```\n *\n * 归属到\"当前正在执行的语句\"(引擎在 fn 之前 setCurrentStmt)。\n * 未登记在 shapeToName 的对象(库内部的自定义对象)被忽略——这是刻意的静默。\n *\n * @param shapes - the shapes whose corresponding variables should be kept.\n */\nexport function keep(...shapes: unknown[]): void {\n registerKeep(shapes, false)\n}\n\n/**\n * 函数体 keep 声明:保留但 canvas 不渲染(布尔系函数的源)。\n *\n * @param shapes - the shapes whose corresponding variables should be kept hidden.\n */\nexport function keepHidden(...shapes: unknown[]): void {\n registerKeep(shapes, true)\n}\n\nfunction registerKeep(shapes: unknown[], hidden: boolean): void {\n const stmt = getRuntimeState().currentStmt\n if (!stmt || !keepSink) return\n const names: PartName[] = []\n for (const s of shapes) {\n if (s === null || typeof s !== 'object') continue\n const n = nameOf(s)\n if (n !== undefined) names.push(n)\n }\n if (names.length === 0) return\n keepSink(String(stmt.id), names, hidden)\n}\n\n// ── 文件单位登记(unit-system §10.6:load op 的 detectedUnit 回传)──\n// 与 pendingAssemblyTransforms 同模式:load op 把读出的文件声明单位写到这里,\n// 引擎在语句执行后取走并按 part 名放进 ExecutionResult.detectedUnits(宿主写进\n// LoadedFileModel.sourceUnit,不新增返回值消费语义)。\n\n/** Per-part declared file units (key = PartName; null-never — absent key = unknown). */\nexport type DetectedUnits = Map<PartName, string>\n\nconst pendingDetectedUnits = new Map<PartName, string>()\n\n/**\n * Register a part's declared file unit (called from the load op body; the unit\n * is metadata only — coordinates are already base-unit, never re-scaled).\n *\n * @param partName - the variable name the loaded shape will be bound to.\n * @param unit - the file's own declared unit (faijs UnitName).\n */\nexport function setPendingDetectedUnit(partName: PartName, unit: string): void {\n pendingDetectedUnits.set(partName, unit)\n}\n\n/**\n * Take all pending detected units and clear them (engine, after each statement;\n * consumed exactly once).\n *\n * @returns a fresh Map of part name → declared unit, copied from the pending\n * store and cleared so it is consumed exactly once.\n */\nexport function takePendingDetectedUnits(): DetectedUnits {\n const out = new Map(pendingDetectedUnits)\n pendingDetectedUnits.clear()\n return out\n}\n\n// ── 多零件降级登记(fileid-container-and-nesting §5.4:cad.load 只支持单零件)──\n// 与 pendingDetectedUnits 同模式:`cad.load` op 读到多零件文件(多 solid STEP /\n// 多 object 3MF)时降级取第一个零件,并把\"原文件零件数\"登记到这里;引擎在语句\n// 执行后取走并按 part 名放进 ExecutionResult.multiPartCounts(宿主据此弹警告\n// 「该文件包含 N 个零件,当前仅加载第一个」,§5.4:166)。\n\n/** Per-part declared multi-part degradation (key = PartName; absent = 单零件/无多零件文件). */\nexport type MultiPartCounts = Map<PartName, number>\n\nconst pendingMultiPartCounts = new Map<PartName, number>()\n\n/**\n * Register a part that was downgraded from a multi-part file (called from the\n * load op body; the shape returned is only the first-part geometry).\n *\n * @param partName - the variable name the loaded (single) shape is bound to.\n * @param partCount - the total number of parts the source file declared (>= 2).\n */\nexport function setPendingMultiPartCount(partName: PartName, partCount: number): void {\n pendingMultiPartCounts.set(partName, partCount)\n}\n\n/**\n * Take all pending multi-part counts and clear them (engine, after each\n * statement; consumed exactly once).\n *\n * @returns a fresh Map of part name → part count, copied from the pending store.\n */\nexport function takePendingMultiPartCounts(): MultiPartCounts {\n const out = new Map(pendingMultiPartCounts)\n pendingMultiPartCounts.clear()\n return out\n}\n\n// ── 网格实体登记(方案 2026-10-01 §3.3:load 的 mesh 路径产出网格实体 + 近似拓扑)──\n// 与 pendingDetectedUnits 同模式:load op(在 @faicad/faijs-extra)不能直接持有\n// CadRuntime 实例,故把\"规范化得到的句柄\"与\"近似拓扑数据\"登记到这里,引擎在语句\n// 执行后取走:句柄进 MeshSolidRegistry + 写 Shape 槽,拓扑进 topologyCache。\n//\n// 两步分开登记(而不是塞进一个结构)是为了让**拓扑可缺失**:句柄是 mesh 零件的\n// 身份,拓扑是它的可用性;将来若出现\"只有句柄、拓扑延后构建\"的路径,不需要改协议。\n\nconst pendingMeshSolids = new Map<PartName, unknown>()\nconst pendingMeshTopologies = new Map<PartName, unknown>()\n\n/**\n * 登记某 part 的网格实体句柄(load op 调用;由引擎在语句执行后收编)。\n *\n * @param partName - the variable name the loaded mesh shape will be bound to.\n * @param solid - the normalized mesh solid handle (opaque outside the mesh backend).\n */\nexport function setPendingMeshSolid(partName: PartName, solid: unknown): void {\n pendingMeshSolids.set(partName, solid)\n}\n\n/**\n * 取走全部待收编的网格实体句柄并清空(引擎在语句执行后调用,消费一次)。\n *\n * @returns a fresh Map of part name → mesh solid handle.\n */\nexport function takePendingMeshSolids(): Map<PartName, unknown> {\n const out = new Map(pendingMeshSolids)\n pendingMeshSolids.clear()\n return out\n}\n\n/**\n * 登记某 part 的近似拓扑数据(load op 调用;`SelectorRuntimeData`,本层只按\n * `unknown` 透传——零依赖红线)。\n *\n * @param partName - the variable name the loaded mesh shape will be bound to.\n * @param data - the serializable selector runtime data built from the mesh solid.\n */\nexport function setPendingMeshTopology(partName: PartName, data: unknown): void {\n pendingMeshTopologies.set(partName, data)\n}\n\n/**\n * 取走全部待收编的近似拓扑数据并清空(引擎在语句执行后调用,消费一次)。\n *\n * @returns a fresh Map of part name → selector runtime data.\n */\nexport function takePendingMeshTopologies(): Map<PartName, unknown> {\n const out = new Map(pendingMeshTopologies)\n pendingMeshTopologies.clear()\n return out\n}\n"]}
package/dist/sdk.d.ts CHANGED
@@ -10,23 +10,23 @@
10
10
  * ```
11
11
  *
12
12
  * 本入口**零 heavy 运行时依赖**:只 re-export runtime-state(L0+ 零依赖锚点层)
13
- * 与 stdlib/shape(构造器 + 身份表,仅 type-import mesh 类型)。
13
+ * 与 api/shape(构造器 + 身份表,仅 type-import mesh 类型)。
14
14
  * 值导入闭包不含 three / occt-wasm / manifold / node:*——由守卫测试保证
15
15
  * (dist/sdk.js 静态 import 扫描)。
16
16
  *
17
17
  * 与主入口的关系:sdk 是主入口的**子集 + 极薄 re-export**,供库作者按需导入;
18
- * 主入口 / browser / stdlib 不受影响(additive)。
18
+ * 主入口 / browser / api 层不受影响(additive)。
19
19
  */
20
20
  export { solid, fromBrep, compound, isShape, isCompound, hasBrep, brepOf, nameOfShapes, getSlot, ensureSlot, } from './shape.js';
21
21
  export type { SolidShape, CompoundShape, ShapeKind, StdShape, BrepHolder, } from './shape.js';
22
22
  export type { Shape } from './mesh/types.js';
23
23
  export { keep, keepHidden, getBackends, configureBackends, assertContractVersion, CONTRACT_VERSION, BrepUnsupportedError, MeshUnsupportedError, } from './runtime-state.js';
24
- export type { Backends, RuntimeExecutionMode, StdlibFn, StdlibNamespace, ShapeSlot, KeepSink, } from './runtime-state.js';
24
+ export type { Backends, RuntimeExecutionMode, LibFn, LibNamespace, ShapeSlot, KeepSink, } from './runtime-state.js';
25
25
  export { getKernel, getBrepApi, meshHandle, fromHandle } from './brep/handle-bridge.js';
26
26
  export type { MeshHandleOptions } from './brep/handle-bridge.js';
27
27
  export { BREP_ENGINE_IDS, type BrepEngineId, type BrepHandle } from './brep/engine/types.js';
28
28
  export type { BrepEngineApi } from './brep/engine/primitives.js';
29
- export { defineOp, assertLibConforms, hasDualOp, DUAL_OP_META } from './define-op.js';
29
+ export { defineOp, assertLibConforms, hasDualOp, dualOpMetaOf, DUAL_OP_META } from './define-op.js';
30
30
  export type { DualOpMeta, DualOpOptions, DualOpImpls, MeshImpl, BrepImpl, MeshData, BrepResult, } from './define-op.js';
31
31
  export type { BrepCapabilityName } from './cad-runtime/backend-dispatch.js';
32
32
  //# sourceMappingURL=sdk.d.ts.map
package/dist/sdk.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAIzC,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,QAAQ,EACR,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,iBAAiB,CAAA;AAMxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACzF,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAQ7D,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClF,YAAY,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,GACX,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAIzC,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,QAAQ,EACR,oBAAoB,EACpB,KAAK,EACL,YAAY,EACZ,SAAS,EACT,QAAQ,GACT,MAAM,iBAAiB,CAAA;AAMxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACzF,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAQ7D,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAChG,YAAY,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA"}
package/dist/sdk.js CHANGED
@@ -10,26 +10,26 @@
10
10
  * ```
11
11
  *
12
12
  * 本入口**零 heavy 运行时依赖**:只 re-export runtime-state(L0+ 零依赖锚点层)
13
- * 与 stdlib/shape(构造器 + 身份表,仅 type-import mesh 类型)。
13
+ * 与 api/shape(构造器 + 身份表,仅 type-import mesh 类型)。
14
14
  * 值导入闭包不含 three / occt-wasm / manifold / node:*——由守卫测试保证
15
15
  * (dist/sdk.js 静态 import 扫描)。
16
16
  *
17
17
  * 与主入口的关系:sdk 是主入口的**子集 + 极薄 re-export**,供库作者按需导入;
18
- * 主入口 / browser / stdlib 不受影响(additive)。
18
+ * 主入口 / browser / api 层不受影响(additive)。
19
19
  */
20
- // ── 构造器与身份表(stdlib/shape:类型化构造器 + BREP 句柄登记) ──
20
+ // ── 构造器与身份表(api/shape:类型化构造器 + BREP 句柄登记) ──
21
21
  export { solid, fromBrep, compound, isShape, isCompound, hasBrep, brepOf, nameOfShapes, getSlot, ensureSlot, } from './shape.js';
22
22
  // ── 运行时状态锚点(零依赖层:keep / backends / 契约版本 / 错误类型) ──
23
23
  export { keep, keepHidden, getBackends, configureBackends, assertContractVersion, CONTRACT_VERSION, BrepUnsupportedError, MeshUnsupportedError, } from './runtime-state.js';
24
24
  // ── BREP 桥接(B1:第三方库造 BREP 产物的三角化入口) ──
25
- // handle-bridge 只 import runtime-state / stdlib/shape / type-only mesh/types,
25
+ // handle-bridge 只 import runtime-state / api/shape / type-only mesh/types,
26
26
  // 零 heavy 依赖——dist/sdk.js 守卫测试继续通过。
27
27
  export { getKernel, getBrepApi, meshHandle, fromHandle } from './brep/handle-bridge.js';
28
28
  export { BREP_ENGINE_IDS } from './brep/engine/types.js';
29
29
  // ── 双路径实现声明(D 面契约:mesh 必选、BREP 可选;几何函数专用) ──
30
- // define-op 只依赖 runtime-state / stdlib/shape / handle-bridge / backend-dispatch
30
+ // define-op 只依赖 runtime-state / api/shape / handle-bridge / backend-dispatch
31
31
  // 与 type-only mesh、brep 类型——零 heavy 依赖,dist/sdk.js 守卫继续通过。
32
32
  // 第三方库作者用 defineOp 声明实现集合;dispatchPath 不再直接导出——
33
33
  // 分派由 defineOp 包装器内部调用(规则仍是引擎 backend-dispatch.ts 单点)。
34
- export { defineOp, assertLibConforms, hasDualOp, DUAL_OP_META } from './define-op.js';
34
+ export { defineOp, assertLibConforms, hasDualOp, dualOpMetaOf, DUAL_OP_META } from './define-op.js';
35
35
  //# sourceMappingURL=sdk.js.map
package/dist/sdk.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iDAAiD;AAEjD,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAA;AAUhB,oDAAoD;AAEpD,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAUxB,wCAAwC;AACxC,8EAA8E;AAC9E,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEpF,OAAO,EAAE,eAAe,EAAsC,MAAM,qBAAqB,CAAA;AAGzF,8CAA8C;AAC9C,gFAAgF;AAChF,2DAA2D;AAC3D,gDAAgD;AAChD,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA","sourcesContent":["/**\n * sdk — 第三方库开发面(F3 / roadmap V2.2)\n *\n *\n * 第三方库模块(`import * as gear from 'my-lib'` 的目标)用它开发:\n * ```ts\n * import { solid, fromBrep, isShape, keep, getBackends, CONTRACT_VERSION } from '@faicad/faijs/sdk'\n * export const contractVersion = CONTRACT_VERSION\n * export function makeSpurGear(params) { ... }\n * ```\n *\n * 本入口**零 heavy 运行时依赖**:只 re-export runtime-state(L0+ 零依赖锚点层)\n * 与 stdlib/shape(构造器 + 身份表,仅 type-import mesh 类型)。\n * 值导入闭包不含 three / occt-wasm / manifold / node:*——由守卫测试保证\n * (dist/sdk.js 静态 import 扫描)。\n *\n * 与主入口的关系:sdk 是主入口的**子集 + 极薄 re-export**,供库作者按需导入;\n * 主入口 / browser / stdlib 不受影响(additive)。\n */\n\n// ── 构造器与身份表(stdlib/shape:类型化构造器 + BREP 句柄登记) ──\n\nexport {\n solid,\n fromBrep,\n compound,\n isShape,\n isCompound,\n hasBrep,\n brepOf,\n nameOfShapes,\n getSlot,\n ensureSlot,\n} from './shape'\nexport type {\n SolidShape,\n CompoundShape,\n ShapeKind,\n StdShape,\n BrepHolder,\n} from './shape'\nexport type { Shape } from './mesh/types'\n\n// ── 运行时状态锚点(零依赖层:keep / backends / 契约版本 / 错误类型) ──\n\nexport {\n keep,\n keepHidden,\n getBackends,\n configureBackends,\n assertContractVersion,\n CONTRACT_VERSION,\n BrepUnsupportedError,\n MeshUnsupportedError,\n} from './runtime-state'\nexport type {\n Backends,\n RuntimeExecutionMode,\n StdlibFn,\n StdlibNamespace,\n ShapeSlot,\n KeepSink,\n} from './runtime-state'\n\n// ── BREP 桥接(B1:第三方库造 BREP 产物的三角化入口) ──\n// handle-bridge 只 import runtime-state / stdlib/shape / type-only mesh/types,\n// 零 heavy 依赖——dist/sdk.js 守卫测试继续通过。\n\nexport { getKernel, getBrepApi, meshHandle, fromHandle } from './brep/handle-bridge'\nexport type { MeshHandleOptions } from './brep/handle-bridge'\nexport { BREP_ENGINE_IDS, type BrepEngineId, type BrepHandle } from './brep/engine/types'\nexport type { BrepEngineApi } from './brep/engine/primitives'\n\n// ── 双路径实现声明(D 面契约:mesh 必选、BREP 可选;几何函数专用) ──\n// define-op 只依赖 runtime-state / stdlib/shape / handle-bridge / backend-dispatch\n// 与 type-only mesh、brep 类型——零 heavy 依赖,dist/sdk.js 守卫继续通过。\n// 第三方库作者用 defineOp 声明实现集合;dispatchPath 不再直接导出——\n// 分派由 defineOp 包装器内部调用(规则仍是引擎 backend-dispatch.ts 单点)。\n\nexport { defineOp, assertLibConforms, hasDualOp, DUAL_OP_META } from './define-op'\nexport type {\n DualOpMeta,\n DualOpOptions,\n DualOpImpls,\n MeshImpl,\n BrepImpl,\n MeshData,\n BrepResult,\n} from './define-op'\nexport type { BrepCapabilityName } from './cad-runtime/backend-dispatch'\n"]}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,8CAA8C;AAE9C,OAAO,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,YAAY,EACZ,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAA;AAUhB,oDAAoD;AAEpD,OAAO,EACL,IAAI,EACJ,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,iBAAiB,CAAA;AAUxB,wCAAwC;AACxC,2EAA2E;AAC3E,oCAAoC;AAEpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEpF,OAAO,EAAE,eAAe,EAAsC,MAAM,qBAAqB,CAAA;AAGzF,8CAA8C;AAC9C,6EAA6E;AAC7E,2DAA2D;AAC3D,gDAAgD;AAChD,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA","sourcesContent":["/**\n * sdk — 第三方库开发面(F3 / roadmap V2.2)\n *\n *\n * 第三方库模块(`import * as gear from 'my-lib'` 的目标)用它开发:\n * ```ts\n * import { solid, fromBrep, isShape, keep, getBackends, CONTRACT_VERSION } from '@faicad/faijs/sdk'\n * export const contractVersion = CONTRACT_VERSION\n * export function makeSpurGear(params) { ... }\n * ```\n *\n * 本入口**零 heavy 运行时依赖**:只 re-export runtime-state(L0+ 零依赖锚点层)\n * 与 api/shape(构造器 + 身份表,仅 type-import mesh 类型)。\n * 值导入闭包不含 three / occt-wasm / manifold / node:*——由守卫测试保证\n * (dist/sdk.js 静态 import 扫描)。\n *\n * 与主入口的关系:sdk 是主入口的**子集 + 极薄 re-export**,供库作者按需导入;\n * 主入口 / browser / api 层不受影响(additive)。\n */\n\n// ── 构造器与身份表(api/shape:类型化构造器 + BREP 句柄登记) ──\n\nexport {\n solid,\n fromBrep,\n compound,\n isShape,\n isCompound,\n hasBrep,\n brepOf,\n nameOfShapes,\n getSlot,\n ensureSlot,\n} from './shape'\nexport type {\n SolidShape,\n CompoundShape,\n ShapeKind,\n StdShape,\n BrepHolder,\n} from './shape'\nexport type { Shape } from './mesh/types'\n\n// ── 运行时状态锚点(零依赖层:keep / backends / 契约版本 / 错误类型) ──\n\nexport {\n keep,\n keepHidden,\n getBackends,\n configureBackends,\n assertContractVersion,\n CONTRACT_VERSION,\n BrepUnsupportedError,\n MeshUnsupportedError,\n} from './runtime-state'\nexport type {\n Backends,\n RuntimeExecutionMode,\n LibFn,\n LibNamespace,\n ShapeSlot,\n KeepSink,\n} from './runtime-state'\n\n// ── BREP 桥接(B1:第三方库造 BREP 产物的三角化入口) ──\n// handle-bridge 只 import runtime-state / api/shape / type-only mesh/types,\n// 零 heavy 依赖——dist/sdk.js 守卫测试继续通过。\n\nexport { getKernel, getBrepApi, meshHandle, fromHandle } from './brep/handle-bridge'\nexport type { MeshHandleOptions } from './brep/handle-bridge'\nexport { BREP_ENGINE_IDS, type BrepEngineId, type BrepHandle } from './brep/engine/types'\nexport type { BrepEngineApi } from './brep/engine/primitives'\n\n// ── 双路径实现声明(D 面契约:mesh 必选、BREP 可选;几何函数专用) ──\n// define-op 只依赖 runtime-state / api/shape / handle-bridge / backend-dispatch\n// 与 type-only mesh、brep 类型——零 heavy 依赖,dist/sdk.js 守卫继续通过。\n// 第三方库作者用 defineOp 声明实现集合;dispatchPath 不再直接导出——\n// 分派由 defineOp 包装器内部调用(规则仍是引擎 backend-dispatch.ts 单点)。\n\nexport { defineOp, assertLibConforms, hasDualOp, dualOpMetaOf, DUAL_OP_META } from './define-op'\nexport type {\n DualOpMeta,\n DualOpOptions,\n DualOpImpls,\n MeshImpl,\n BrepImpl,\n MeshData,\n BrepResult,\n} from './define-op'\nexport type { BrepCapabilityName } from './cad-runtime/backend-dispatch'\n"]}