@faicad/faijs 0.13.2 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/dist/api/api-namespace.d.ts +7 -0
  2. package/dist/api/api-namespace.d.ts.map +1 -1
  3. package/dist/api/api-namespace.js +44 -17
  4. package/dist/api/api-namespace.js.map +1 -1
  5. package/dist/api/boolean.d.ts +19 -0
  6. package/dist/api/boolean.d.ts.map +1 -1
  7. package/dist/api/boolean.js +71 -12
  8. package/dist/api/boolean.js.map +1 -1
  9. package/dist/api/chamfer.d.ts.map +1 -1
  10. package/dist/api/chamfer.js +12 -8
  11. package/dist/api/chamfer.js.map +1 -1
  12. package/dist/api/compound-geom.d.ts +45 -0
  13. package/dist/api/compound-geom.d.ts.map +1 -0
  14. package/dist/api/compound-geom.js +85 -0
  15. package/dist/api/compound-geom.js.map +1 -0
  16. package/dist/api/edge-ref.d.ts.map +1 -1
  17. package/dist/api/edge-ref.js +7 -4
  18. package/dist/api/edge-ref.js.map +1 -1
  19. package/dist/api/engrave.d.ts.map +1 -1
  20. package/dist/api/engrave.js +1 -0
  21. package/dist/api/engrave.js.map +1 -1
  22. package/dist/api/extrude.d.ts.map +1 -1
  23. package/dist/api/extrude.js +131 -3
  24. package/dist/api/extrude.js.map +1 -1
  25. package/dist/api/face-ref.d.ts.map +1 -1
  26. package/dist/api/face-ref.js +7 -4
  27. package/dist/api/face-ref.js.map +1 -1
  28. package/dist/api/fillet.d.ts.map +1 -1
  29. package/dist/api/fillet.js +6 -5
  30. package/dist/api/fillet.js.map +1 -1
  31. package/dist/api/generated/cad/script-face.d.ts +1 -1
  32. package/dist/api/generated/cad/script-face.d.ts.map +1 -1
  33. package/dist/api/generated/cad/script-face.js +1 -2
  34. package/dist/api/generated/cad/script-face.js.map +1 -1
  35. package/dist/api/generated/operations.js +16 -16
  36. package/dist/api/generated/operations.js.map +1 -1
  37. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  38. package/dist/api/generated/script-face-manifest.js +0 -2
  39. package/dist/api/generated/script-face-manifest.js.map +1 -1
  40. package/dist/api/generated/script-face.d.ts +1 -7
  41. package/dist/api/generated/script-face.d.ts.map +1 -1
  42. package/dist/api/generated/script-face.js +2 -4
  43. package/dist/api/generated/script-face.js.map +1 -1
  44. package/dist/api/generated/sketching.js +1 -1
  45. package/dist/api/generated/sketching.js.map +1 -1
  46. package/dist/api/generated/topology.d.ts +0 -56
  47. package/dist/api/generated/topology.d.ts.map +1 -1
  48. package/dist/api/generated/topology.js +19 -68
  49. package/dist/api/generated/topology.js.map +1 -1
  50. package/dist/api/import-brep.d.ts +36 -0
  51. package/dist/api/import-brep.d.ts.map +1 -0
  52. package/dist/api/import-brep.js +72 -0
  53. package/dist/api/import-brep.js.map +1 -0
  54. package/dist/api/import-step.d.ts +28 -0
  55. package/dist/api/import-step.d.ts.map +1 -0
  56. package/dist/api/import-step.js +57 -0
  57. package/dist/api/import-step.js.map +1 -0
  58. package/dist/api/index.d.ts +8 -12
  59. package/dist/api/index.d.ts.map +1 -1
  60. package/dist/api/index.js +22 -16
  61. package/dist/api/index.js.map +1 -1
  62. package/dist/api/internal/compat-op.d.ts.map +1 -1
  63. package/dist/api/internal/compat-op.js +2 -1
  64. package/dist/api/internal/compat-op.js.map +1 -1
  65. package/dist/api/internal/compat-projection.d.ts +3 -1
  66. package/dist/api/internal/compat-projection.d.ts.map +1 -1
  67. package/dist/api/internal/compat-projection.js +8 -5
  68. package/dist/api/internal/compat-projection.js.map +1 -1
  69. package/dist/api/internal/replica-role-table.d.ts +36 -0
  70. package/dist/api/internal/replica-role-table.d.ts.map +1 -0
  71. package/dist/api/internal/replica-role-table.js +73 -0
  72. package/dist/api/internal/replica-role-table.js.map +1 -0
  73. package/dist/api/internal/result-unwrap.d.ts +3 -1
  74. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  75. package/dist/api/internal/result-unwrap.js +2 -2
  76. package/dist/api/internal/result-unwrap.js.map +1 -1
  77. package/dist/api/knurl.d.ts.map +1 -1
  78. package/dist/api/knurl.js +1 -0
  79. package/dist/api/knurl.js.map +1 -1
  80. package/dist/api/occt-kernel-bridge.d.ts +105 -27
  81. package/dist/api/occt-kernel-bridge.d.ts.map +1 -1
  82. package/dist/api/occt-kernel-bridge.js +255 -41
  83. package/dist/api/occt-kernel-bridge.js.map +1 -1
  84. package/dist/api/pattern.d.ts +32 -0
  85. package/dist/api/pattern.d.ts.map +1 -0
  86. package/dist/api/pattern.js +85 -0
  87. package/dist/api/pattern.js.map +1 -0
  88. package/dist/api/place.d.ts +35 -0
  89. package/dist/api/place.d.ts.map +1 -0
  90. package/dist/api/place.js +113 -0
  91. package/dist/api/place.js.map +1 -0
  92. package/dist/api/primitives.d.ts.map +1 -1
  93. package/dist/api/primitives.js +10 -3
  94. package/dist/api/primitives.js.map +1 -1
  95. package/dist/api/replicate.d.ts +145 -0
  96. package/dist/api/replicate.d.ts.map +1 -0
  97. package/dist/api/replicate.js +351 -0
  98. package/dist/api/replicate.js.map +1 -0
  99. package/dist/api/revolve.d.ts +36 -0
  100. package/dist/api/revolve.d.ts.map +1 -0
  101. package/dist/api/revolve.js +165 -0
  102. package/dist/api/revolve.js.map +1 -0
  103. package/dist/api/screw.d.ts.map +1 -1
  104. package/dist/api/screw.js +1 -0
  105. package/dist/api/screw.js.map +1 -1
  106. package/dist/api/sdf.d.ts.map +1 -1
  107. package/dist/api/sdf.js +1 -0
  108. package/dist/api/sdf.js.map +1 -1
  109. package/dist/api/sketch.d.ts.map +1 -1
  110. package/dist/api/sketch.js +1 -0
  111. package/dist/api/sketch.js.map +1 -1
  112. package/dist/api/split.d.ts +31 -0
  113. package/dist/api/split.d.ts.map +1 -0
  114. package/dist/api/split.js +96 -0
  115. package/dist/api/split.js.map +1 -0
  116. package/dist/api/surface/arg-spec.d.ts +17 -0
  117. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  118. package/dist/api/surface/arg-spec.js +86 -66
  119. package/dist/api/surface/arg-spec.js.map +1 -1
  120. package/dist/api/surface/projection-overrides.d.ts.map +1 -1
  121. package/dist/api/surface/projection-overrides.js +6 -0
  122. package/dist/api/surface/projection-overrides.js.map +1 -1
  123. package/dist/api/topo-resolve.d.ts.map +1 -1
  124. package/dist/api/topo-resolve.js +65 -3
  125. package/dist/api/topo-resolve.js.map +1 -1
  126. package/dist/api/transform.d.ts +4 -0
  127. package/dist/api/transform.d.ts.map +1 -1
  128. package/dist/api/transform.js +44 -12
  129. package/dist/api/transform.js.map +1 -1
  130. package/dist/boolean/deriveNormals.d.ts +5 -4
  131. package/dist/boolean/deriveNormals.d.ts.map +1 -1
  132. package/dist/boolean/deriveNormals.js +24 -7
  133. package/dist/boolean/deriveNormals.js.map +1 -1
  134. package/dist/brep/brep-ops.d.ts +34 -1
  135. package/dist/brep/brep-ops.d.ts.map +1 -1
  136. package/dist/brep/brep-ops.js +62 -22
  137. package/dist/brep/brep-ops.js.map +1 -1
  138. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  139. package/dist/brep/engine/adapters/brep-mock.js +66 -0
  140. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  141. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  142. package/dist/brep/engine/adapters/brepkit.js +44 -1
  143. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  144. package/dist/brep/engine/adapters/occt.d.ts +1 -5
  145. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  146. package/dist/brep/engine/adapters/occt.js +246 -9
  147. package/dist/brep/engine/adapters/occt.js.map +1 -1
  148. package/dist/brep/engine/primitives.d.ts +96 -0
  149. package/dist/brep/engine/primitives.d.ts.map +1 -1
  150. package/dist/brep/engine/primitives.js.map +1 -1
  151. package/dist/brep/engine/types.d.ts +66 -6
  152. package/dist/brep/engine/types.d.ts.map +1 -1
  153. package/dist/brep/engine/types.js.map +1 -1
  154. package/dist/brep/export/step.d.ts.map +1 -1
  155. package/dist/brep/export/step.js +6 -1
  156. package/dist/brep/export/step.js.map +1 -1
  157. package/dist/brep/face-evolution.d.ts +78 -8
  158. package/dist/brep/face-evolution.d.ts.map +1 -1
  159. package/dist/brep/face-evolution.js +130 -17
  160. package/dist/brep/face-evolution.js.map +1 -1
  161. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  162. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  163. package/dist/brepkit-kernel/brepkitKernel.js +108 -12
  164. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  165. package/dist/browser.d.ts +6 -28
  166. package/dist/browser.d.ts.map +1 -1
  167. package/dist/browser.js +6 -17
  168. package/dist/browser.js.map +1 -1
  169. package/dist/cad-runtime/admit-compat-lib.d.ts +13 -0
  170. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  171. package/dist/cad-runtime/admit-compat-lib.js +27 -0
  172. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  173. package/dist/cad-runtime/backend-dispatch.d.ts +46 -3
  174. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  175. package/dist/cad-runtime/backend-dispatch.js +48 -3
  176. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  177. package/dist/cad-runtime/browser-lib-loader.d.ts +4 -4
  178. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  179. package/dist/cad-runtime/browser-lib-loader.js +7 -4
  180. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  181. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  182. package/dist/cad-runtime/direct-executor.js +14 -4
  183. package/dist/cad-runtime/direct-executor.js.map +1 -1
  184. package/dist/cad-runtime/module-registry.d.ts +3 -1
  185. package/dist/cad-runtime/module-registry.d.ts.map +1 -1
  186. package/dist/cad-runtime/module-registry.js +13 -1
  187. package/dist/cad-runtime/module-registry.js.map +1 -1
  188. package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
  189. package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
  190. package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
  191. package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
  192. package/dist/cad-runtime/runtime.d.ts +52 -2
  193. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  194. package/dist/cad-runtime/runtime.js +180 -9
  195. package/dist/cad-runtime/runtime.js.map +1 -1
  196. package/dist/define-op.d.ts +22 -0
  197. package/dist/define-op.d.ts.map +1 -1
  198. package/dist/define-op.js +82 -12
  199. package/dist/define-op.js.map +1 -1
  200. package/dist/env-agnostic.d.ts +38 -0
  201. package/dist/env-agnostic.d.ts.map +1 -0
  202. package/dist/env-agnostic.js +29 -0
  203. package/dist/env-agnostic.js.map +1 -0
  204. package/dist/fcstd/attachment.d.ts +8 -1
  205. package/dist/fcstd/attachment.d.ts.map +1 -1
  206. package/dist/fcstd/attachment.js +7 -1
  207. package/dist/fcstd/attachment.js.map +1 -1
  208. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  209. package/dist/fcstd/build-fai-zip.js +12 -7
  210. package/dist/fcstd/build-fai-zip.js.map +1 -1
  211. package/dist/fcstd/codegen.d.ts +10 -1
  212. package/dist/fcstd/codegen.d.ts.map +1 -1
  213. package/dist/fcstd/codegen.js +158 -49
  214. package/dist/fcstd/codegen.js.map +1 -1
  215. package/dist/fcstd/contour.d.ts.map +1 -1
  216. package/dist/fcstd/contour.js +23 -24
  217. package/dist/fcstd/contour.js.map +1 -1
  218. package/dist/fcstd/convert.d.ts +2 -18
  219. package/dist/fcstd/convert.d.ts.map +1 -1
  220. package/dist/fcstd/convert.js +35 -53
  221. package/dist/fcstd/convert.js.map +1 -1
  222. package/dist/fcstd/expressions.d.ts +24 -0
  223. package/dist/fcstd/expressions.d.ts.map +1 -1
  224. package/dist/fcstd/expressions.js +91 -0
  225. package/dist/fcstd/expressions.js.map +1 -1
  226. package/dist/fcstd/external-geo.d.ts +12 -1
  227. package/dist/fcstd/external-geo.d.ts.map +1 -1
  228. package/dist/fcstd/external-geo.js +15 -1
  229. package/dist/fcstd/external-geo.js.map +1 -1
  230. package/dist/fcstd/feature-translate.d.ts +21 -1
  231. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  232. package/dist/fcstd/feature-translate.js +124 -8
  233. package/dist/fcstd/feature-translate.js.map +1 -1
  234. package/dist/fcstd/structural-types.d.ts +83 -0
  235. package/dist/fcstd/structural-types.d.ts.map +1 -0
  236. package/dist/fcstd/structural-types.js +121 -0
  237. package/dist/fcstd/structural-types.js.map +1 -0
  238. package/dist/index.d.ts +7 -23
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +10 -16
  241. package/dist/index.js.map +1 -1
  242. package/dist/lang/determinism-scanner.d.ts +71 -0
  243. package/dist/lang/determinism-scanner.d.ts.map +1 -0
  244. package/dist/lang/determinism-scanner.js +625 -0
  245. package/dist/lang/determinism-scanner.js.map +1 -0
  246. package/dist/lang/symbol-table.d.ts +31 -0
  247. package/dist/lang/symbol-table.d.ts.map +1 -1
  248. package/dist/lang/symbol-table.generated.d.ts +13 -19
  249. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  250. package/dist/lang/symbol-table.generated.js +13 -19
  251. package/dist/lang/symbol-table.generated.js.map +1 -1
  252. package/dist/lang/symbol-table.js +50 -1
  253. package/dist/lang/symbol-table.js.map +1 -1
  254. package/dist/mesh/creased-normals.d.ts +50 -0
  255. package/dist/mesh/creased-normals.d.ts.map +1 -0
  256. package/dist/mesh/creased-normals.js +114 -0
  257. package/dist/mesh/creased-normals.js.map +1 -0
  258. package/dist/mesh/decoration-provider.d.ts +53 -0
  259. package/dist/mesh/decoration-provider.d.ts.map +1 -0
  260. package/dist/mesh/decoration-provider.js +21 -0
  261. package/dist/mesh/decoration-provider.js.map +1 -0
  262. package/dist/mesh/engrave.d.ts +4 -0
  263. package/dist/mesh/engrave.d.ts.map +1 -1
  264. package/dist/mesh/engrave.js +22 -31
  265. package/dist/mesh/engrave.js.map +1 -1
  266. package/dist/mesh/index.d.ts +5 -14
  267. package/dist/mesh/index.d.ts.map +1 -1
  268. package/dist/mesh/index.js +7 -18
  269. package/dist/mesh/index.js.map +1 -1
  270. package/dist/mesh/io.d.ts +2 -1
  271. package/dist/mesh/io.d.ts.map +1 -1
  272. package/dist/mesh/io.js +5 -7
  273. package/dist/mesh/io.js.map +1 -1
  274. package/dist/mesh/primitives.d.ts +5 -18
  275. package/dist/mesh/primitives.d.ts.map +1 -1
  276. package/dist/mesh/primitives.js +4 -48
  277. package/dist/mesh/primitives.js.map +1 -1
  278. package/dist/mesh/stl-loader.d.ts +23 -0
  279. package/dist/mesh/stl-loader.d.ts.map +1 -0
  280. package/dist/mesh/stl-loader.js +139 -0
  281. package/dist/mesh/stl-loader.js.map +1 -0
  282. package/dist/module-resolver/parse-imports.d.ts +37 -0
  283. package/dist/module-resolver/parse-imports.d.ts.map +1 -0
  284. package/dist/module-resolver/parse-imports.js +39 -0
  285. package/dist/module-resolver/parse-imports.js.map +1 -0
  286. package/dist/module-resolver/resolver.d.ts +1 -1
  287. package/dist/module-resolver/resolver.js +2 -2
  288. package/dist/module-resolver/resolver.js.map +1 -1
  289. package/dist/node-host/cli.d.ts.map +1 -1
  290. package/dist/node-host/cli.js +37 -4
  291. package/dist/node-host/cli.js.map +1 -1
  292. package/dist/primitives/text/cjk-font.d.ts +42 -0
  293. package/dist/primitives/text/cjk-font.d.ts.map +1 -0
  294. package/dist/primitives/text/cjk-font.js +86 -0
  295. package/dist/primitives/text/cjk-font.js.map +1 -0
  296. package/dist/runtime-state.d.ts +18 -6
  297. package/dist/runtime-state.d.ts.map +1 -1
  298. package/dist/runtime-state.js +9 -1
  299. package/dist/runtime-state.js.map +1 -1
  300. package/dist/sdk.d.ts +2 -2
  301. package/dist/sdk.js +2 -2
  302. package/dist/sdk.js.map +1 -1
  303. package/dist/shape.d.ts +15 -0
  304. package/dist/shape.d.ts.map +1 -1
  305. package/dist/shape.js +26 -3
  306. package/dist/shape.js.map +1 -1
  307. package/dist/symbol-table.d.ts +15 -0
  308. package/dist/symbol-table.d.ts.map +1 -0
  309. package/dist/symbol-table.js +14 -0
  310. package/dist/symbol-table.js.map +1 -0
  311. package/dist/topology/naming/build-naming.d.ts +14 -30
  312. package/dist/topology/naming/build-naming.d.ts.map +1 -1
  313. package/dist/topology/naming/build-naming.js +21 -54
  314. package/dist/topology/naming/build-naming.js.map +1 -1
  315. package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
  316. package/dist/topology/naming/capture-topo-ref.js +5 -0
  317. package/dist/topology/naming/capture-topo-ref.js.map +1 -1
  318. package/dist/topology/naming/index.d.ts +3 -0
  319. package/dist/topology/naming/index.d.ts.map +1 -1
  320. package/dist/topology/naming/index.js +3 -0
  321. package/dist/topology/naming/index.js.map +1 -1
  322. package/dist/topology/naming/lineage-resolve.d.ts +80 -0
  323. package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
  324. package/dist/topology/naming/lineage-resolve.js +120 -0
  325. package/dist/topology/naming/lineage-resolve.js.map +1 -0
  326. package/dist/topology/naming/lineage.d.ts +349 -0
  327. package/dist/topology/naming/lineage.d.ts.map +1 -0
  328. package/dist/topology/naming/lineage.js +398 -0
  329. package/dist/topology/naming/lineage.js.map +1 -0
  330. package/dist/topology/naming/migrate.d.ts +41 -0
  331. package/dist/topology/naming/migrate.d.ts.map +1 -0
  332. package/dist/topology/naming/migrate.js +88 -0
  333. package/dist/topology/naming/migrate.js.map +1 -0
  334. package/dist/topology/naming/role-name.d.ts +176 -0
  335. package/dist/topology/naming/role-name.d.ts.map +1 -0
  336. package/dist/topology/naming/role-name.js +344 -0
  337. package/dist/topology/naming/role-name.js.map +1 -0
  338. package/dist/topology/naming/roles.d.ts +20 -22
  339. package/dist/topology/naming/roles.d.ts.map +1 -1
  340. package/dist/topology/naming/roles.js +51 -49
  341. package/dist/topology/naming/roles.js.map +1 -1
  342. package/dist/topology/naming/types.d.ts +65 -18
  343. package/dist/topology/naming/types.d.ts.map +1 -1
  344. package/dist/topology/naming/types.js.map +1 -1
  345. package/dist/vendored/brepjs/kernel/index.d.ts +5 -0
  346. package/dist/vendored/brepjs/kernel/index.d.ts.map +1 -1
  347. package/dist/vendored/brepjs/kernel/index.js +11 -0
  348. package/dist/vendored/brepjs/kernel/index.js.map +1 -1
  349. package/dist/weapp.d.ts +4 -4
  350. package/dist/weapp.d.ts.map +1 -1
  351. package/dist/weapp.js +7 -4
  352. package/dist/weapp.js.map +1 -1
  353. package/package.json +16 -14
  354. package/dist/api/compat/index.d.ts +0 -173
  355. package/dist/api/compat/index.d.ts.map +0 -1
  356. package/dist/api/compat/index.js +0 -222
  357. package/dist/api/compat/index.js.map +0 -1
  358. package/dist/api/compound.d.ts +0 -108
  359. package/dist/api/compound.d.ts.map +0 -1
  360. package/dist/api/compound.js +0 -162
  361. package/dist/api/compound.js.map +0 -1
  362. package/dist/api/copy.d.ts +0 -39
  363. package/dist/api/copy.d.ts.map +0 -1
  364. package/dist/api/copy.js +0 -81
  365. package/dist/api/copy.js.map +0 -1
  366. package/dist/api/fai_drill.d.ts +0 -46
  367. package/dist/api/fai_drill.d.ts.map +0 -1
  368. package/dist/api/fai_drill.js +0 -230
  369. package/dist/api/fai_drill.js.map +0 -1
  370. package/dist/api/fai_extrude.d.ts +0 -36
  371. package/dist/api/fai_extrude.d.ts.map +0 -1
  372. package/dist/api/fai_extrude.js +0 -78
  373. package/dist/api/fai_extrude.js.map +0 -1
  374. package/dist/api/fai_split.d.ts +0 -46
  375. package/dist/api/fai_split.d.ts.map +0 -1
  376. package/dist/api/fai_split.js +0 -253
  377. package/dist/api/fai_split.js.map +0 -1
  378. package/dist/api/load.d.ts +0 -39
  379. package/dist/api/load.d.ts.map +0 -1
  380. package/dist/api/load.js +0 -82
  381. package/dist/api/load.js.map +0 -1
  382. package/dist/api/svgExtrude.d.ts +0 -32
  383. package/dist/api/svgExtrude.d.ts.map +0 -1
  384. package/dist/api/svgExtrude.js +0 -73
  385. package/dist/api/svgExtrude.js.map +0 -1
  386. package/dist/api/text.d.ts +0 -34
  387. package/dist/api/text.d.ts.map +0 -1
  388. package/dist/api/text.js +0 -100
  389. package/dist/api/text.js.map +0 -1
  390. package/dist/brep/text/fontTestHelper.d.ts +0 -30
  391. package/dist/brep/text/fontTestHelper.d.ts.map +0 -1
  392. package/dist/brep/text/fontTestHelper.js +0 -57
  393. package/dist/brep/text/fontTestHelper.js.map +0 -1
  394. package/dist/cad-runtime/module-executor.d.ts +0 -271
  395. package/dist/cad-runtime/module-executor.d.ts.map +0 -1
  396. package/dist/cad-runtime/module-executor.js +0 -630
  397. package/dist/cad-runtime/module-executor.js.map +0 -1
  398. package/dist/cad-runtime/terminal-dag.d.ts +0 -65
  399. package/dist/cad-runtime/terminal-dag.d.ts.map +0 -1
  400. package/dist/cad-runtime/terminal-dag.js +0 -167
  401. package/dist/cad-runtime/terminal-dag.js.map +0 -1
  402. package/dist/faqts/browser.d.ts +0 -16
  403. package/dist/faqts/browser.d.ts.map +0 -1
  404. package/dist/faqts/browser.js +0 -13
  405. package/dist/faqts/browser.js.map +0 -1
  406. package/dist/faqts/exec-blob.d.ts +0 -14
  407. package/dist/faqts/exec-blob.d.ts.map +0 -1
  408. package/dist/faqts/exec-blob.js +0 -22
  409. package/dist/faqts/exec-blob.js.map +0 -1
  410. package/dist/faqts/exec-node.d.ts +0 -15
  411. package/dist/faqts/exec-node.d.ts.map +0 -1
  412. package/dist/faqts/exec-node.js +0 -29
  413. package/dist/faqts/exec-node.js.map +0 -1
  414. package/dist/faqts/imports.d.ts +0 -74
  415. package/dist/faqts/imports.d.ts.map +0 -1
  416. package/dist/faqts/imports.js +0 -95
  417. package/dist/faqts/imports.js.map +0 -1
  418. package/dist/faqts/index.d.ts +0 -22
  419. package/dist/faqts/index.d.ts.map +0 -1
  420. package/dist/faqts/index.js +0 -21
  421. package/dist/faqts/index.js.map +0 -1
  422. package/dist/faqts/node.d.ts +0 -23
  423. package/dist/faqts/node.d.ts.map +0 -1
  424. package/dist/faqts/node.js +0 -23
  425. package/dist/faqts/node.js.map +0 -1
  426. package/dist/faqts/run.d.ts +0 -62
  427. package/dist/faqts/run.d.ts.map +0 -1
  428. package/dist/faqts/run.js +0 -62
  429. package/dist/faqts/run.js.map +0 -1
  430. package/dist/faqts/transform.d.ts +0 -43
  431. package/dist/faqts/transform.d.ts.map +0 -1
  432. package/dist/faqts/transform.js +0 -35
  433. package/dist/faqts/transform.js.map +0 -1
  434. package/dist/lang/compile.d.ts +0 -50
  435. package/dist/lang/compile.d.ts.map +0 -1
  436. package/dist/lang/compile.js +0 -368
  437. package/dist/lang/compile.js.map +0 -1
  438. package/dist/lang/keep.d.ts +0 -109
  439. package/dist/lang/keep.d.ts.map +0 -1
  440. package/dist/lang/keep.js +0 -226
  441. package/dist/lang/keep.js.map +0 -1
  442. package/dist/lang/parser.d.ts +0 -91
  443. package/dist/lang/parser.d.ts.map +0 -1
  444. package/dist/lang/parser.js +0 -1594
  445. package/dist/lang/parser.js.map +0 -1
  446. package/dist/mesh/drill-hole/DrillHoleCore.d.ts +0 -90
  447. package/dist/mesh/drill-hole/DrillHoleCore.d.ts.map +0 -1
  448. package/dist/mesh/drill-hole/DrillHoleCore.js +0 -287
  449. package/dist/mesh/drill-hole/DrillHoleCore.js.map +0 -1
  450. package/dist/mesh/drill-hole/drill-types.d.ts +0 -34
  451. package/dist/mesh/drill-hole/drill-types.d.ts.map +0 -1
  452. package/dist/mesh/drill-hole/drill-types.js +0 -7
  453. package/dist/mesh/drill-hole/drill-types.js.map +0 -1
  454. package/dist/mesh/fai_drill.d.ts +0 -21
  455. package/dist/mesh/fai_drill.d.ts.map +0 -1
  456. package/dist/mesh/fai_drill.js +0 -92
  457. package/dist/mesh/fai_drill.js.map +0 -1
  458. package/dist/mesh/fai_extrude.d.ts +0 -24
  459. package/dist/mesh/fai_extrude.d.ts.map +0 -1
  460. package/dist/mesh/fai_extrude.js +0 -42
  461. package/dist/mesh/fai_extrude.js.map +0 -1
  462. package/dist/mesh/fai_split.d.ts +0 -164
  463. package/dist/mesh/fai_split.d.ts.map +0 -1
  464. package/dist/mesh/fai_split.js +0 -269
  465. package/dist/mesh/fai_split.js.map +0 -1
  466. package/dist/primitives/svg-extrude.d.ts +0 -43
  467. package/dist/primitives/svg-extrude.d.ts.map +0 -1
  468. package/dist/primitives/svg-extrude.js +0 -78
  469. package/dist/primitives/svg-extrude.js.map +0 -1
  470. package/dist/primitives/text/cjk.d.ts +0 -61
  471. package/dist/primitives/text/cjk.d.ts.map +0 -1
  472. package/dist/primitives/text/cjk.js +0 -215
  473. package/dist/primitives/text/cjk.js.map +0 -1
  474. package/dist/primitives/text-geometry.d.ts +0 -47
  475. package/dist/primitives/text-geometry.d.ts.map +0 -1
  476. package/dist/primitives/text-geometry.js +0 -127
  477. package/dist/primitives/text-geometry.js.map +0 -1
  478. package/dist/test-helpers.d.ts +0 -31
  479. package/dist/test-helpers.d.ts.map +0 -1
  480. package/dist/test-helpers.js +0 -55
  481. package/dist/test-helpers.js.map +0 -1
  482. package/dist/vendored/brepjs/core/kernelReentrancy.d.ts +0 -41
  483. package/dist/vendored/brepjs/core/kernelReentrancy.d.ts.map +0 -1
  484. package/dist/vendored/brepjs/core/kernelReentrancy.js +0 -68
  485. package/dist/vendored/brepjs/core/kernelReentrancy.js.map +0 -1
@@ -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 } 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 */\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 /** 当前引擎能力声明(宽松结构,零依赖)。能力路由读(§8.4)。 */\n brepCapabilities?: {\n evolution?: boolean\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}\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 /** 拓扑命名 RoleTable(§2.3 naming 槽:随 Shape 身份槽传播,不序列化)。 */\n roleTable?: unknown\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 }\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 getRuntimeState().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,原 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 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"]}
package/dist/sdk.d.ts CHANGED
@@ -2,11 +2,11 @@
2
2
  * sdk — 第三方库开发面(F3 / roadmap V2.2)
3
3
  *
4
4
  *
5
- * 第三方库模块(`import * as mech from 'gear-lib-demo'` 的目标)用它开发:
5
+ * 第三方库模块(`import * as gear from 'my-lib'` 的目标)用它开发:
6
6
  * ```ts
7
7
  * import { solid, fromBrep, isShape, keep, getBackends, CONTRACT_VERSION } from '@faicad/faijs/sdk'
8
8
  * export const contractVersion = CONTRACT_VERSION
9
- * export function makeHeadstock(params) { ... }
9
+ * export function makeSpurGear(params) { ... }
10
10
  * ```
11
11
  *
12
12
  * 本入口**零 heavy 运行时依赖**:只 re-export runtime-state(L0+ 零依赖锚点层)
package/dist/sdk.js CHANGED
@@ -2,11 +2,11 @@
2
2
  * sdk — 第三方库开发面(F3 / roadmap V2.2)
3
3
  *
4
4
  *
5
- * 第三方库模块(`import * as mech from 'gear-lib-demo'` 的目标)用它开发:
5
+ * 第三方库模块(`import * as gear from 'my-lib'` 的目标)用它开发:
6
6
  * ```ts
7
7
  * import { solid, fromBrep, isShape, keep, getBackends, CONTRACT_VERSION } from '@faicad/faijs/sdk'
8
8
  * export const contractVersion = CONTRACT_VERSION
9
- * export function makeHeadstock(params) { ... }
9
+ * export function makeSpurGear(params) { ... }
10
10
  * ```
11
11
  *
12
12
  * 本入口**零 heavy 运行时依赖**:只 re-export runtime-state(L0+ 零依赖锚点层)
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,MAAM,sBAAsB,CAAA;AAGxE,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 mech from 'gear-lib-demo'` 的目标)用它开发:\n * ```ts\n * import { solid, fromBrep, isShape, keep, getBackends, CONTRACT_VERSION } from '@faicad/faijs/sdk'\n * export const contractVersion = CONTRACT_VERSION\n * export function makeHeadstock(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, meshHandle, fromHandle } from './brep/handle-bridge'\nexport type { MeshHandleOptions } from './brep/handle-bridge'\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,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,MAAM,sBAAsB,CAAA;AAGxE,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, meshHandle, fromHandle } from './brep/handle-bridge'\nexport type { MeshHandleOptions } from './brep/handle-bridge'\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"]}
package/dist/shape.d.ts CHANGED
@@ -51,6 +51,10 @@ export declare function fromBrep(mesh: Shape, holder: BrepHolder): SolidShape;
51
51
  export interface BrepHolder {
52
52
  solid: unknown;
53
53
  faceEvolution?: Map<number, number[]>;
54
+ /**
55
+ * 1.10 前置③:产形 op 交付 role 表的唯一入口。fromBrep 把它**旁挂到血缘图**
56
+ * (语句键 + part 键);slot 侧的缓存存储已删(ShapeSlot 不再有该字段)。
57
+ */
54
58
  roleTable?: unknown;
55
59
  }
56
60
  /**
@@ -97,6 +101,17 @@ export declare function getSlot(shape: object): ShapeSlot | undefined;
97
101
  * @returns the shape's identity slot.
98
102
  */
99
103
  export declare function ensureSlot(shape: object): ShapeSlot;
104
+ /**
105
+ * 读输入 Shape 的 roleTable(op 实现读**输入**表的唯一读口,1.10 前置③)。
106
+ *
107
+ * 语义 = 旧 `getSlot(shape)?.roleTable`:权威落点在血缘图的 part 键旁挂
108
+ * (上一条语句 fromBrep 时记录),slot 缓存字段已删除。未记录 → undefined
109
+ * (mesh 产物 / 无命名)。
110
+ *
111
+ * @param shape - the input shape whose role table to read.
112
+ * @returns the role table (unknown — callers assert their table type), or undefined.
113
+ */
114
+ export declare function inputRoleTable(shape: object): unknown | undefined;
100
115
  /**
101
116
  * 该 Shape 是否在 BREP 链上(有 OCCT 句柄)。引擎分派与 UI 查询用。
102
117
  *
@@ -1 +1 @@
1
- {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAiD,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI/F,kDAAkD;AAClD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAA;AAElE,oDAAoD;AACpD,MAAM,WAAW,UAAW,SAAQ,KAAK;IACvC,IAAI,EAAE,OAAO,CAAA;CACd;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,KAAK,EAAE,CAAA;CAClB;AAED,4DAA4D;AAC5D,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,CAI7C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAWpE;AAED,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACrC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,aAAa,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,aAAa,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,aAAa,CAI7D;AAID,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAQnD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAEtD"}
1
+ {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAiE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAM/G,kDAAkD;AAClD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAA;AAElE,oDAAoD;AACpD,MAAM,WAAW,UAAW,SAAQ,KAAK;IACvC,IAAI,EAAE,OAAO,CAAA;CACd;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,KAAK,EAAE,CAAA;CAClB;AAED,4DAA4D;AAC5D,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,CAI7C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAuBpE;AAED,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,aAAa,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,aAAa,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,aAAa,CAI7D;AAID,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAGjE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAEtD"}
package/dist/shape.js CHANGED
@@ -9,7 +9,9 @@
9
9
  * 库函数不再手动登记(P2 落地)。
10
10
  * - 新增 hasBrep / brepOf:引擎侧判定"某 Shape 是否在 BREP 链上"。
11
11
  */
12
- import { getRuntimeState, registerFunctionBrep, nameOf } from './runtime-state.js';
12
+ import { getRuntimeState, registerFunctionBrep, nameOf, getCurrentStmt } from './runtime-state.js';
13
+ import { asStmtId } from './identity.js';
14
+ import { runtimeLineage } from './topology/naming/lineage.js';
13
15
  /**
14
16
  * 实体 Shape 构造器:mesh 产物必须经此创建。
15
17
  *
@@ -43,9 +45,16 @@ export function fromBrep(mesh, holder) {
43
45
  slot.solid = holder.solid;
44
46
  if (holder.faceEvolution)
45
47
  slot.faceEvolution = holder.faceEvolution;
46
- if (holder.roleTable)
47
- slot.roleTable = holder.roleTable;
48
+ // 1.10 前置③:roleTable **不再写 slot**(字段已删)——权威落点是下方血缘图
49
+ // 旁挂(语句键 + part 键),解析缓存 miss 由回走重算恢复。
48
50
  state.slots.set(s, slot);
51
+ // 1.10 前置③:roleTable 权威旁挂(**语句键**)在血缘图。part 键的记录在
52
+ // define-op.wrapped(impl 返回后 anchor.outputs 名字已定)——此处 shape 还未
53
+ // 被 executor 命名,nameOf(s) 为 undefined,不能在这里记 part 键。
54
+ const stmt = getCurrentStmt();
55
+ if (stmt && (holder.roleTable || holder.solid !== undefined)) {
56
+ runtimeLineage.recordOutput(asStmtId(stmt.id), holder.roleTable, holder.solid);
57
+ }
49
58
  // 函数 BREP 域(§5.6):函数体内 op 产生的新句柄登记到当前域,函数返回后统一释放
50
59
  registerFunctionBrep(holder.solid);
51
60
  return s;
@@ -115,6 +124,20 @@ export function ensureSlot(shape) {
115
124
  }
116
125
  return slot;
117
126
  }
127
+ /**
128
+ * 读输入 Shape 的 roleTable(op 实现读**输入**表的唯一读口,1.10 前置③)。
129
+ *
130
+ * 语义 = 旧 `getSlot(shape)?.roleTable`:权威落点在血缘图的 part 键旁挂
131
+ * (上一条语句 fromBrep 时记录),slot 缓存字段已删除。未记录 → undefined
132
+ * (mesh 产物 / 无命名)。
133
+ *
134
+ * @param shape - the input shape whose role table to read.
135
+ * @returns the role table (unknown — callers assert their table type), or undefined.
136
+ */
137
+ export function inputRoleTable(shape) {
138
+ const name = nameOf(shape);
139
+ return name ? runtimeLineage.tableOfPart(name) : undefined;
140
+ }
118
141
  /**
119
142
  * 该 Shape 是否在 BREP 链上(有 OCCT 句柄)。引擎分派与 UI 查询用。
120
143
  *
package/dist/shape.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib shape — 类型化构造器 + 身份槽\n *\n *\n * 变更要点:\n * - 身份表(created / slots / shapeToName)改读全局锚点 runtime-state,\n * 使\"两份 faijs 代码\"共享同一份状态(解决 Shape 身份孤岛)。\n * - 新增 fromBrep(mesh, holder):BREP 产物一次登记句柄与面演化,\n * 库函数不再手动登记(P2 落地)。\n * - 新增 hasBrep / brepOf:引擎侧判定\"某 Shape 是否在 BREP 链上\"。\n */\n\nimport type { Shape } from './mesh/types'\nimport { getRuntimeState, registerFunctionBrep, nameOf, type ShapeSlot } from './runtime-state'\n\n// ── Shape 构造器 ──\n\n/** Discriminator for the concrete shape kinds. */\nexport type ShapeKind = 'solid' | 'shape2d' | 'curve' | 'compound'\n\n/** A solid mesh shape produced by a constructor. */\nexport interface SolidShape extends Shape {\n kind: 'solid'\n}\n\n/** A structural compound grouping a list of child shapes. */\nexport interface CompoundShape {\n kind: 'compound'\n children: Shape[]\n}\n\n/** A shape that the stdlib exports as a finished result. */\nexport type StdShape = SolidShape | CompoundShape\n\n/**\n * 实体 Shape 构造器:mesh 产物必须经此创建。\n *\n * @param mesh - the mesh shape to wrap as a solid.\n * @returns the created solid shape.\n */\nexport function solid(mesh: Shape): SolidShape {\n const s: SolidShape = { ...mesh, kind: 'solid' }\n getRuntimeState().created.add(s)\n return s\n}\n\n/**\n * BREP 产物构造器:同时登记 mesh 与 OCCT 句柄(+ 可选面演化)。\n *\n * 库函数用它替代 `solid(mesh)` + 手动登记句柄两步行:\n * ```ts\n * return fromBrep(solidToShape(kernel, resultSolid), {\n * solid: resultSolid,\n * faceEvolution: identityEvolution(kernel, resultSolid),\n * })\n * ```\n *\n * @param mesh - the mesh shape to register.\n * @param holder - the BREP holder providing the OCCT handle and optional face evolution.\n * @returns the created solid shape with the BREP handle attached.\n */\nexport function fromBrep(mesh: Shape, holder: BrepHolder): SolidShape {\n const s = solid(mesh)\n const state = getRuntimeState()\n const slot = state.slots.get(s) ?? {}\n slot.solid = holder.solid\n if (holder.faceEvolution) slot.faceEvolution = holder.faceEvolution\n if (holder.roleTable) slot.roleTable = holder.roleTable\n state.slots.set(s, slot)\n // 函数 BREP 域(§5.6):函数体内 op 产生的新句柄登记到当前域,函数返回后统一释放\n registerFunctionBrep(holder.solid)\n return s\n}\n\n/** BREP 句柄 + 面演化 + 拓扑命名 RoleTable(对应 OCCT 的 ShapeHandle)。类型为 unknown 以保持零依赖。 */\nexport interface BrepHolder {\n solid: unknown\n faceEvolution?: Map<number, number[]>\n roleTable?: unknown\n}\n\n/**\n * compound Shape 构造器:结构(层级)而非新几何。\n *\n * @param children - the child shapes to group.\n * @returns the created compound shape.\n */\nexport function compound(children: Shape[]): CompoundShape {\n const c: CompoundShape = { kind: 'compound', children }\n getRuntimeState().created.add(c)\n return c\n}\n\n/**\n * 是否为构造器产物(终端判定与 compound 检测的依据)。\n *\n * @param v - the value to test.\n * @returns true if the value was created by a shape constructor.\n */\nexport function isShape(v: unknown): v is Shape {\n return !!v && typeof v === 'object' && getRuntimeState().created.has(v)\n}\n\n/**\n * Returns true if the value is a strict compound shape created by a constructor.\n *\n * @param v - the value to test.\n * @returns true if the value is a strict compound shape.\n */\nexport function isCompound(v: unknown): v is CompoundShape {\n return isShape(v) && (v as { kind?: string }).kind === 'compound'\n}\n\n/**\n * 结构判定:是否为 compound 形态(keep-syntax §5.3 D5,对任意库函数零要求)。\n * 引擎内部的终端/消费判定用结构判定;SDK 公开的 isShape/isCompound 保持 WeakSet 严格。\n *\n * @param v - the value to test.\n * @returns true if the value has compound shape structure.\n */\nexport function isCompoundLike(v: unknown): v is CompoundShape {\n return !!v && typeof v === 'object'\n && (v as { kind?: string }).kind === 'compound'\n && Array.isArray((v as { children?: unknown }).children)\n}\n\n// ── 身份槽 ──\n\nexport type { ShapeSlot }\n\n/**\n * 读取 Shape 的身份槽(无则 undefined)。\n *\n * @param shape - the shape whose slot to read.\n * @returns the identity slot, or undefined if none is registered.\n */\nexport function getSlot(shape: object): ShapeSlot | undefined {\n return getRuntimeState().slots.get(shape)\n}\n\n/**\n * 读取或创建 Shape 的身份槽。\n *\n * @param shape - the shape whose slot to read or create.\n * @returns the shape's identity slot.\n */\nexport function ensureSlot(shape: object): ShapeSlot {\n const state = getRuntimeState()\n let slot = state.slots.get(shape)\n if (!slot) {\n slot = {}\n state.slots.set(shape, slot)\n }\n return slot\n}\n\n/**\n * 该 Shape 是否在 BREP 链上(有 OCCT 句柄)。引擎分派与 UI 查询用。\n *\n * @param shape - the shape to test.\n * @returns true if the shape has an attached OCCT handle.\n */\nexport function hasBrep(shape: Shape): boolean {\n return getRuntimeState().slots.get(shape)?.solid !== undefined\n}\n\n/**\n * 读取该 Shape 的 OCCT 句柄(无则 undefined)。库函数用前必须判空。\n *\n * @param shape - the shape whose handle to read.\n * @returns the OCCT handle, or undefined if none.\n */\nexport function brepOf(shape: Shape): unknown | undefined {\n return getRuntimeState().slots.get(shape)?.solid\n}\n\n/**\n * nameOf 批量版:Shape[] → 成员名(装配 memberNames,P6 替代读 IR)。\n *\n * @param shapes - the shapes to name.\n * @returns the member names, one per shape (empty string when unnamed).\n */\nexport function nameOfShapes(shapes: Shape[]): string[] {\n return shapes.map((s) => String(nameOf(s) ?? ''))\n}\n"]}
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * stdlib shape — 类型化构造器 + 身份槽\n *\n *\n * 变更要点:\n * - 身份表(created / slots / shapeToName)改读全局锚点 runtime-state,\n * 使\"两份 faijs 代码\"共享同一份状态(解决 Shape 身份孤岛)。\n * - 新增 fromBrep(mesh, holder):BREP 产物一次登记句柄与面演化,\n * 库函数不再手动登记(P2 落地)。\n * - 新增 hasBrep / brepOf:引擎侧判定\"某 Shape 是否在 BREP 链上\"。\n */\n\nimport type { Shape } from './mesh/types'\nimport { getRuntimeState, registerFunctionBrep, nameOf, getCurrentStmt, type ShapeSlot } from './runtime-state'\nimport { asStmtId } from './identity'\nimport { runtimeLineage } from './topology/naming/lineage'\n\n// ── Shape 构造器 ──\n\n/** Discriminator for the concrete shape kinds. */\nexport type ShapeKind = 'solid' | 'shape2d' | 'curve' | 'compound'\n\n/** A solid mesh shape produced by a constructor. */\nexport interface SolidShape extends Shape {\n kind: 'solid'\n}\n\n/** A structural compound grouping a list of child shapes. */\nexport interface CompoundShape {\n kind: 'compound'\n children: Shape[]\n}\n\n/** A shape that the stdlib exports as a finished result. */\nexport type StdShape = SolidShape | CompoundShape\n\n/**\n * 实体 Shape 构造器:mesh 产物必须经此创建。\n *\n * @param mesh - the mesh shape to wrap as a solid.\n * @returns the created solid shape.\n */\nexport function solid(mesh: Shape): SolidShape {\n const s: SolidShape = { ...mesh, kind: 'solid' }\n getRuntimeState().created.add(s)\n return s\n}\n\n/**\n * BREP 产物构造器:同时登记 mesh 与 OCCT 句柄(+ 可选面演化)。\n *\n * 库函数用它替代 `solid(mesh)` + 手动登记句柄两步行:\n * ```ts\n * return fromBrep(solidToShape(kernel, resultSolid), {\n * solid: resultSolid,\n * faceEvolution: identityEvolution(kernel, resultSolid),\n * })\n * ```\n *\n * @param mesh - the mesh shape to register.\n * @param holder - the BREP holder providing the OCCT handle and optional face evolution.\n * @returns the created solid shape with the BREP handle attached.\n */\nexport function fromBrep(mesh: Shape, holder: BrepHolder): SolidShape {\n const s = solid(mesh)\n const state = getRuntimeState()\n const slot = state.slots.get(s) ?? {}\n slot.solid = holder.solid\n if (holder.faceEvolution) slot.faceEvolution = holder.faceEvolution\n // 1.10 前置③:roleTable **不再写 slot**(字段已删)——权威落点是下方血缘图\n // 旁挂(语句键 + part 键),解析缓存 miss 由回走重算恢复。\n state.slots.set(s, slot)\n // 1.10 前置③:roleTable 权威旁挂(**语句键**)在血缘图。part 键的记录在\n // define-op.wrapped(impl 返回后 anchor.outputs 名字已定)——此处 shape 还未\n // 被 executor 命名,nameOf(s) 为 undefined,不能在这里记 part 键。\n const stmt = getCurrentStmt()\n if (stmt && (holder.roleTable || holder.solid !== undefined)) {\n runtimeLineage.recordOutput(\n asStmtId(stmt.id),\n holder.roleTable as ReadonlyMap<string, ReadonlyMap<string, readonly number[]>> | undefined,\n holder.solid,\n )\n }\n // 函数 BREP 域(§5.6):函数体内 op 产生的新句柄登记到当前域,函数返回后统一释放\n registerFunctionBrep(holder.solid)\n return s\n}\n\n/** BREP 句柄 + 面演化 + 拓扑命名 RoleTable(对应 OCCT 的 ShapeHandle)。类型为 unknown 以保持零依赖。 */\nexport interface BrepHolder {\n solid: unknown\n faceEvolution?: Map<number, number[]>\n /**\n * 1.10 前置③:产形 op 交付 role 表的唯一入口。fromBrep 把它**旁挂到血缘图**\n * (语句键 + part 键);slot 侧的缓存存储已删(ShapeSlot 不再有该字段)。\n */\n roleTable?: unknown\n}\n\n/**\n * compound Shape 构造器:结构(层级)而非新几何。\n *\n * @param children - the child shapes to group.\n * @returns the created compound shape.\n */\nexport function compound(children: Shape[]): CompoundShape {\n const c: CompoundShape = { kind: 'compound', children }\n getRuntimeState().created.add(c)\n return c\n}\n\n/**\n * 是否为构造器产物(终端判定与 compound 检测的依据)。\n *\n * @param v - the value to test.\n * @returns true if the value was created by a shape constructor.\n */\nexport function isShape(v: unknown): v is Shape {\n return !!v && typeof v === 'object' && getRuntimeState().created.has(v)\n}\n\n/**\n * Returns true if the value is a strict compound shape created by a constructor.\n *\n * @param v - the value to test.\n * @returns true if the value is a strict compound shape.\n */\nexport function isCompound(v: unknown): v is CompoundShape {\n return isShape(v) && (v as { kind?: string }).kind === 'compound'\n}\n\n/**\n * 结构判定:是否为 compound 形态(keep-syntax §5.3 D5,对任意库函数零要求)。\n * 引擎内部的终端/消费判定用结构判定;SDK 公开的 isShape/isCompound 保持 WeakSet 严格。\n *\n * @param v - the value to test.\n * @returns true if the value has compound shape structure.\n */\nexport function isCompoundLike(v: unknown): v is CompoundShape {\n return !!v && typeof v === 'object'\n && (v as { kind?: string }).kind === 'compound'\n && Array.isArray((v as { children?: unknown }).children)\n}\n\n// ── 身份槽 ──\n\nexport type { ShapeSlot }\n\n/**\n * 读取 Shape 的身份槽(无则 undefined)。\n *\n * @param shape - the shape whose slot to read.\n * @returns the identity slot, or undefined if none is registered.\n */\nexport function getSlot(shape: object): ShapeSlot | undefined {\n return getRuntimeState().slots.get(shape)\n}\n\n/**\n * 读取或创建 Shape 的身份槽。\n *\n * @param shape - the shape whose slot to read or create.\n * @returns the shape's identity slot.\n */\nexport function ensureSlot(shape: object): ShapeSlot {\n const state = getRuntimeState()\n let slot = state.slots.get(shape)\n if (!slot) {\n slot = {}\n state.slots.set(shape, slot)\n }\n return slot\n}\n\n/**\n * 读输入 Shape 的 roleTable(op 实现读**输入**表的唯一读口,1.10 前置③)。\n *\n * 语义 = 旧 `getSlot(shape)?.roleTable`:权威落点在血缘图的 part 键旁挂\n * (上一条语句 fromBrep 时记录),slot 缓存字段已删除。未记录 → undefined\n * (mesh 产物 / 无命名)。\n *\n * @param shape - the input shape whose role table to read.\n * @returns the role table (unknown — callers assert their table type), or undefined.\n */\nexport function inputRoleTable(shape: object): unknown | undefined {\n const name = nameOf(shape)\n return name ? runtimeLineage.tableOfPart(name) : undefined\n}\n\n/**\n * 该 Shape 是否在 BREP 链上(有 OCCT 句柄)。引擎分派与 UI 查询用。\n *\n * @param shape - the shape to test.\n * @returns true if the shape has an attached OCCT handle.\n */\nexport function hasBrep(shape: Shape): boolean {\n return getRuntimeState().slots.get(shape)?.solid !== undefined\n}\n\n/**\n * 读取该 Shape 的 OCCT 句柄(无则 undefined)。库函数用前必须判空。\n *\n * @param shape - the shape whose handle to read.\n * @returns the OCCT handle, or undefined if none.\n */\nexport function brepOf(shape: Shape): unknown | undefined {\n return getRuntimeState().slots.get(shape)?.solid\n}\n\n/**\n * nameOf 批量版:Shape[] → 成员名(装配 memberNames,P6 替代读 IR)。\n *\n * @param shapes - the shapes to name.\n * @returns the member names, one per shape (empty string when unnamed).\n */\nexport function nameOfShapes(shapes: Shape[]): string[] {\n return shapes.map((s) => String(nameOf(s) ?? ''))\n}\n"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * symbol-table — public subpath for the standard-library symbol table.
3
+ *
4
+ * The table itself lives in `lang/symbol-table.ts` (generated file plus the P5
5
+ * host-extension registry). This root-level module exists so library authors can
6
+ * reach it environment-agnostically — `@faicad/faijs/symbol-table` has no
7
+ * three / occt / node dependency, so a browser or weapp host may import it
8
+ * without touching the node entry.
9
+ *
10
+ * Consumers: hosts that install a library namespace (`registerSymbolTableEntries`)
11
+ * and tooling that resolves `cad.<name>` statically.
12
+ */
13
+ export { SYMBOL_TABLE, getFunctionSymbol, registerSymbolTableEntries, unregisterSymbolTableEntries, symbolTableNames, } from './lang/symbol-table.js';
14
+ export type { SymbolTable, FunctionSymbol } from './lang/symbol-table.js';
15
+ //# sourceMappingURL=symbol-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-table.d.ts","sourceRoot":"","sources":["../src/symbol-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,YAAY,EAAE,iBAAiB,EAC/B,0BAA0B,EAAE,4BAA4B,EAAE,gBAAgB,GAC3E,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * symbol-table — public subpath for the standard-library symbol table.
3
+ *
4
+ * The table itself lives in `lang/symbol-table.ts` (generated file plus the P5
5
+ * host-extension registry). This root-level module exists so library authors can
6
+ * reach it environment-agnostically — `@faicad/faijs/symbol-table` has no
7
+ * three / occt / node dependency, so a browser or weapp host may import it
8
+ * without touching the node entry.
9
+ *
10
+ * Consumers: hosts that install a library namespace (`registerSymbolTableEntries`)
11
+ * and tooling that resolves `cad.<name>` statically.
12
+ */
13
+ export { SYMBOL_TABLE, getFunctionSymbol, registerSymbolTableEntries, unregisterSymbolTableEntries, symbolTableNames, } from './lang/symbol-table.js';
14
+ //# sourceMappingURL=symbol-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-table.js","sourceRoot":"","sources":["../src/symbol-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,YAAY,EAAE,iBAAiB,EAC/B,0BAA0B,EAAE,4BAA4B,EAAE,gBAAgB,GAC3E,MAAM,qBAAqB,CAAA","sourcesContent":["/**\n * symbol-table — public subpath for the standard-library symbol table.\n *\n * The table itself lives in `lang/symbol-table.ts` (generated file plus the P5\n * host-extension registry). This root-level module exists so library authors can\n * reach it environment-agnostically — `@faicad/faijs/symbol-table` has no\n * three / occt / node dependency, so a browser or weapp host may import it\n * without touching the node entry.\n *\n * Consumers: hosts that install a library namespace (`registerSymbolTableEntries`)\n * and tooling that resolves `cad.<name>` statically.\n */\nexport {\n SYMBOL_TABLE, getFunctionSymbol,\n registerSymbolTableEntries, unregisterSymbolTableEntries, symbolTableNames,\n} from './lang/symbol-table'\nexport type { SymbolTable, FunctionSymbol } from './lang/symbol-table'\n"]}
@@ -4,14 +4,12 @@
4
4
  * 从「part 的面行 + RoleTable」生成 FaceNaming/EdgeNaming 命名行,供宿主 O(1)
5
5
  * 反查(拾取序号 → 命名行 → captureTopoRef)。序号(1起) ↔ 数组下标。
6
6
  *
7
- * - BREP:roleTable + roleOfOrdinal 反查每个面的 {origin, role}(布尔合流后
8
- * 一张表可能含多个 origin,逐 origin 反查);hint 取自面行(与 BREP 现场
9
- * 同口径,见 geom-hint.ts)。
10
- * - primitive:role 由固定面序的语义命名器给出(M4 §5.2 接入;本函数留
11
- * primitiveRoles 参数,M4 填充)。
12
- * - mesh:只填 hint、role=''、origin=该 part(§5.3:只能几何兜底)。
7
+ * Phase 1.6/1.7 换型(§4.1/§4.2):
8
+ * - RoleTable 外层键与 naming 行的 origin 一律是 **StmtId**(不再 PartName)。
9
+ * - role 是 RoleName 的线格式串(无 'box:' 前缀)。
10
+ * - **无身份面显式 `role: null`**——`''` 静默兜底已删(G6);mesh 来源只填 hint。
13
11
  */
14
- import type { PartName } from '../../identity.js';
12
+ import type { StmtId, PartName } from '../../identity.js';
15
13
  import type { RoleTable, PartNaming } from './types.js';
16
14
  /** 面的源行数据(FaceRow 子集,够生成 hint + 反查)。axis 为宿主注入的轴快照(装配轴约束用)。 */
17
15
  export interface NamingFaceRow {
@@ -36,52 +34,38 @@ export interface NamingEdgeRow {
36
34
  /** 生成 PartNaming 的输入。 */
37
35
  export interface PartNamingInput {
38
36
  readonly source: 'brep' | 'primitive' | 'mesh';
39
- /** 该 part 变量名(mesh/primitive 的 origin 兜底;BREP 用 role 的 origin)。 */
37
+ /** 该 part 变量名(仅 UI 显示兜底用;身份一律走 roleTable 的 StmtId)。 */
40
38
  readonly partName: PartName;
41
39
  /** 面命名源行(序号 1 起 ↔ 数组下标 0 起)。 */
42
40
  readonly faces: readonly NamingFaceRow[];
43
41
  /** 边命名源行(序号 1 起 ↔ 数组下标 0 起)。 */
44
42
  readonly edges: readonly NamingEdgeRow[];
45
- /** BREP:RoleTable(可能多 origin);mesh/primitive 缺省。 */
43
+ /** BREP:RoleTable(可能多 origin,键=StmtId);mesh/primitive 缺省。 */
46
44
  readonly roleTable?: RoleTable;
47
45
  /** BREP:subShapeHashes(shape,'face'),序号 → hash 对照(roleOfOrdinal 用)。 */
48
46
  readonly ordinalToHash?: readonly number[];
49
- /** primitive:按固定面序的语义 role(M4 填充);缺省 → role=''。 */
50
- readonly primitiveRoles?: readonly string[];
51
47
  /** 每条边的两邻面序号(1 起;来自 manifest faceEdgeRows/edgeFaceRows)。mesh 无邻接 → undefined。 */
52
48
  readonly edgeFaceOrdinals?: ReadonlyArray<readonly [number, number] | null>;
53
49
  }
54
50
  /**
55
51
  * 逐 origin 反查一个面的 {origin, role}(布尔合流后 RoleTable 含多个 origin)。
56
52
  *
57
- * @param table - the RoleTable (may have several origins after a boolean merge).
53
+ * @param table - the RoleTable (may have several origins after a boolean merge; keys are StmtId strings).
58
54
  * @param ordinalToHash - ordinal → hash array (subShapeHashes).
59
55
  * @param ordinal - the face ordinal (1-based).
60
- * @returns the owning origin and role, or undefined when no origin tracks it.
56
+ * @returns the owning origin (StmtId) and role, or undefined when no origin tracks it.
61
57
  */
62
58
  export declare function findOriginRole(table: RoleTable, ordinalToHash: readonly number[], ordinal: number): {
63
- origin: PartName;
59
+ origin: StmtId;
64
60
  role: string;
65
61
  } | undefined;
66
- /**
67
- * 为 primitive 假拓扑按面行几何命名语义 role(§5.2,与 BREP §3.2 同一套命名器)。
68
- *
69
- * primitive 无 OCCT solid,用「固定面序 + 面行几何」直接命名:
70
- * - plane + 法向主轴 → box 语义名(box:top/bottom/front/back/left/right)
71
- * - cylinder/cone/sphere 曲面 → lateral/surface 语义名
72
- * - 其余/认不出 → 位置名 `${partName}:face_${i}`(保证每面必有 role)
73
- *
74
- * 与 BREP assignRoles 的对照:cube 固定面序(+X,-X,+Y,-Y,+Z,-Z)命名一致
75
- * (f0→box:right、f1→box:left、f2→box:back、f3→box:front、f4→box:top、f5→box:bottom)。
76
- *
77
- * @param faces - the primitive's face rows (fixed enumeration order).
78
- * @param partName - the part variable name (positional-role prefix).
79
- * @returns one semantic role per face (same length as faces).
80
- */
81
- export declare function assignPrimitiveFaceRoles(faces: readonly NamingFaceRow[], partName: PartName): string[];
82
62
  /**
83
63
  * 生成一个 part 的命名数据(§3.7 ExecutionResult.naming 元素)。
84
64
  *
65
+ * Phase 1.8(D6):mesh 伪拓扑已删——primitive/mesh 来源**不再派生 role**
66
+ * (拓扑身份是 BREP 专有能力,§3);primitive 分支与 mesh 一致只填 hint。
67
+ * G6:无身份面显式 `role: null`(`''` 兜底已删)。
68
+ *
85
69
  * @param input - the part naming input.
86
70
  * @returns the PartNaming rows.
87
71
  */
@@ -1 +1 @@
1
- {"version":3,"file":"build-naming.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/build-naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAA0B,UAAU,EAAE,MAAM,SAAS,CAAA;AAI5E,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACrH;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACrH;AAED,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAA;IAC9C,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAA;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,mDAAmD;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3C,iFAAiF;IACjF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;CAC5E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAMhD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,QAAQ,EAAE,QAAQ,GACjB,MAAM,EAAE,CAaV;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAqClE"}
1
+ {"version":3,"file":"build-naming.d.ts","sourceRoot":"","sources":["../../../src/topology/naming/build-naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAA0B,UAAU,EAAiB,MAAM,SAAS,CAAA;AAI3F,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACrH;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAA;CACrH;AAED,yBAAyB;AACzB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAA;IAC9C,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAA;IACxC,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAA;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C,iFAAiF;IACjF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAA;CAC5E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,OAAO,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAmClE"}
@@ -4,91 +4,56 @@
4
4
  * 从「part 的面行 + RoleTable」生成 FaceNaming/EdgeNaming 命名行,供宿主 O(1)
5
5
  * 反查(拾取序号 → 命名行 → captureTopoRef)。序号(1起) ↔ 数组下标。
6
6
  *
7
- * - BREP:roleTable + roleOfOrdinal 反查每个面的 {origin, role}(布尔合流后
8
- * 一张表可能含多个 origin,逐 origin 反查);hint 取自面行(与 BREP 现场
9
- * 同口径,见 geom-hint.ts)。
10
- * - primitive:role 由固定面序的语义命名器给出(M4 §5.2 接入;本函数留
11
- * primitiveRoles 参数,M4 填充)。
12
- * - mesh:只填 hint、role=''、origin=该 part(§5.3:只能几何兜底)。
7
+ * Phase 1.6/1.7 换型(§4.1/§4.2):
8
+ * - RoleTable 外层键与 naming 行的 origin 一律是 **StmtId**(不再 PartName)。
9
+ * - role 是 RoleName 的线格式串(无 'box:' 前缀)。
10
+ * - **无身份面显式 `role: null`**——`''` 静默兜底已删(G6);mesh 来源只填 hint。
13
11
  */
14
12
  import { faceRowToHint, edgeRowToHint } from './geom-hint.js';
15
- import { roleOfOrdinal, boxRoleFromNormal } from './roles.js';
13
+ import { roleOfOrdinal } from './roles.js';
16
14
  /**
17
15
  * 逐 origin 反查一个面的 {origin, role}(布尔合流后 RoleTable 含多个 origin)。
18
16
  *
19
- * @param table - the RoleTable (may have several origins after a boolean merge).
17
+ * @param table - the RoleTable (may have several origins after a boolean merge; keys are StmtId strings).
20
18
  * @param ordinalToHash - ordinal → hash array (subShapeHashes).
21
19
  * @param ordinal - the face ordinal (1-based).
22
- * @returns the owning origin and role, or undefined when no origin tracks it.
20
+ * @returns the owning origin (StmtId) and role, or undefined when no origin tracks it.
23
21
  */
24
22
  export function findOriginRole(table, ordinalToHash, ordinal) {
25
23
  for (const [origin, roles] of table) {
26
24
  const role = roleOfOrdinal(roles, ordinalToHash, ordinal);
27
25
  if (role !== undefined)
28
- return { origin, role };
26
+ return { origin: origin, role };
29
27
  }
30
28
  return undefined;
31
29
  }
32
- /**
33
- * 为 primitive 假拓扑按面行几何命名语义 role(§5.2,与 BREP §3.2 同一套命名器)。
34
- *
35
- * primitive 无 OCCT solid,用「固定面序 + 面行几何」直接命名:
36
- * - plane + 法向主轴 → box 语义名(box:top/bottom/front/back/left/right)
37
- * - cylinder/cone/sphere 曲面 → lateral/surface 语义名
38
- * - 其余/认不出 → 位置名 `${partName}:face_${i}`(保证每面必有 role)
39
- *
40
- * 与 BREP assignRoles 的对照:cube 固定面序(+X,-X,+Y,-Y,+Z,-Z)命名一致
41
- * (f0→box:right、f1→box:left、f2→box:back、f3→box:front、f4→box:top、f5→box:bottom)。
42
- *
43
- * @param faces - the primitive's face rows (fixed enumeration order).
44
- * @param partName - the part variable name (positional-role prefix).
45
- * @returns one semantic role per face (same length as faces).
46
- */
47
- export function assignPrimitiveFaceRoles(faces, partName) {
48
- return faces.map((row, i) => {
49
- const surfaceType = row.surfaceType;
50
- const normal = row.normal;
51
- if (surfaceType === 'cylinder')
52
- return 'cylinder:lateral';
53
- if (surfaceType === 'cone')
54
- return 'cone:lateral';
55
- if (surfaceType === 'sphere')
56
- return 'sphere:surface';
57
- if (surfaceType === 'plane' && normal && normal.length === 3) {
58
- const role = boxRoleFromNormal([normal[0], normal[1], normal[2]]);
59
- if (role)
60
- return role;
61
- }
62
- return `${partName}:face_${i}`;
63
- });
64
- }
65
30
  /**
66
31
  * 生成一个 part 的命名数据(§3.7 ExecutionResult.naming 元素)。
67
32
  *
33
+ * Phase 1.8(D6):mesh 伪拓扑已删——primitive/mesh 来源**不再派生 role**
34
+ * (拓扑身份是 BREP 专有能力,§3);primitive 分支与 mesh 一致只填 hint。
35
+ * G6:无身份面显式 `role: null`(`''` 兜底已删)。
36
+ *
68
37
  * @param input - the part naming input.
69
38
  * @returns the PartNaming rows.
70
39
  */
71
40
  export function buildPartNaming(input) {
72
- const { source, partName } = input;
41
+ const { source } = input;
73
42
  const faceNaming = [];
74
43
  input.faces.forEach((row, i) => {
75
- const ordinal = i + 1;
76
44
  const hint = faceRowToHint(row);
77
45
  if (source === 'brep' && input.roleTable && input.ordinalToHash) {
78
- const found = findOriginRole(input.roleTable, input.ordinalToHash, ordinal);
46
+ const found = findOriginRole(input.roleTable, input.ordinalToHash, i + 1);
79
47
  if (found) {
80
48
  faceNaming.push({ origin: found.origin, role: found.role, hint });
81
49
  return;
82
50
  }
83
- // BREP 链上面应都被追踪;未命中 → role=''(理论不发生,显式兜底)
84
- faceNaming.push({ origin: partName, role: '', hint });
85
- return;
86
- }
87
- if (source === 'primitive' && input.primitiveRoles) {
88
- faceNaming.push({ origin: partName, role: input.primitiveRoles[i] ?? '', hint });
51
+ // BREP 链上未追踪的面:显式无身份(G6——不再伪造 role='')
52
+ faceNaming.push({ origin: null, role: null, hint });
89
53
  return;
90
54
  }
91
- faceNaming.push({ origin: partName, role: '', hint });
55
+ // primitive / mesh:拓扑身份是 BREP 专有能力(§3/D6)——只填 hint,origin/role 显式 null
56
+ faceNaming.push({ origin: null, role: null, hint });
92
57
  });
93
58
  const edgeNaming = input.edges.map((row, i) => {
94
59
  const hint = edgeRowToHint(row);
@@ -97,7 +62,9 @@ export function buildPartNaming(input) {
97
62
  const a = findOriginRole(input.roleTable, input.ordinalToHash, pair[0]);
98
63
  const b = findOriginRole(input.roleTable, input.ordinalToHash, pair[1]);
99
64
  if (a && b) {
100
- return { faces: [{ origin: a.origin, role: a.role }, { origin: b.origin, role: b.role }], hint };
65
+ const qa = { origin: a.origin, role: a.role };
66
+ const qb = { origin: b.origin, role: b.role };
67
+ return { faces: [qa, qb], hint };
101
68
  }
102
69
  }
103
70
  return { faces: null, hint };