@faicad/faijs 0.13.1 → 0.14.1

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 (341) hide show
  1. package/dist/api/api-namespace.d.ts.map +1 -1
  2. package/dist/api/api-namespace.js +30 -4
  3. package/dist/api/api-namespace.js.map +1 -1
  4. package/dist/api/boolean.d.ts +19 -0
  5. package/dist/api/boolean.d.ts.map +1 -1
  6. package/dist/api/boolean.js +51 -10
  7. package/dist/api/boolean.js.map +1 -1
  8. package/dist/api/chamfer.d.ts.map +1 -1
  9. package/dist/api/chamfer.js +8 -7
  10. package/dist/api/chamfer.js.map +1 -1
  11. package/dist/api/compound-geom.d.ts +45 -0
  12. package/dist/api/compound-geom.d.ts.map +1 -0
  13. package/dist/api/compound-geom.js +85 -0
  14. package/dist/api/compound-geom.js.map +1 -0
  15. package/dist/api/compound.d.ts +2 -0
  16. package/dist/api/compound.d.ts.map +1 -1
  17. package/dist/api/compound.js +2 -0
  18. package/dist/api/compound.js.map +1 -1
  19. package/dist/api/copy.d.ts +1 -0
  20. package/dist/api/copy.d.ts.map +1 -1
  21. package/dist/api/copy.js +4 -2
  22. package/dist/api/copy.js.map +1 -1
  23. package/dist/api/edge-ref.d.ts +3 -2
  24. package/dist/api/edge-ref.d.ts.map +1 -1
  25. package/dist/api/edge-ref.js +10 -6
  26. package/dist/api/edge-ref.js.map +1 -1
  27. package/dist/api/engrave.d.ts.map +1 -1
  28. package/dist/api/engrave.js +1 -0
  29. package/dist/api/engrave.js.map +1 -1
  30. package/dist/api/extrude.d.ts.map +1 -1
  31. package/dist/api/extrude.js +131 -3
  32. package/dist/api/extrude.js.map +1 -1
  33. package/dist/api/face-ref.d.ts.map +1 -1
  34. package/dist/api/face-ref.js +7 -4
  35. package/dist/api/face-ref.js.map +1 -1
  36. package/dist/api/fai_drill.d.ts +1 -1
  37. package/dist/api/fai_drill.d.ts.map +1 -1
  38. package/dist/api/fai_drill.js +31 -18
  39. package/dist/api/fai_drill.js.map +1 -1
  40. package/dist/api/fai_extrude.d.ts +1 -1
  41. package/dist/api/fai_extrude.d.ts.map +1 -1
  42. package/dist/api/fai_extrude.js +2 -1
  43. package/dist/api/fai_extrude.js.map +1 -1
  44. package/dist/api/fai_split.d.ts +1 -1
  45. package/dist/api/fai_split.d.ts.map +1 -1
  46. package/dist/api/fai_split.js +2 -1
  47. package/dist/api/fai_split.js.map +1 -1
  48. package/dist/api/fillet.d.ts.map +1 -1
  49. package/dist/api/fillet.js +6 -5
  50. package/dist/api/fillet.js.map +1 -1
  51. package/dist/api/generated/operations.js +16 -16
  52. package/dist/api/generated/operations.js.map +1 -1
  53. package/dist/api/generated/script-face-manifest.d.ts.map +1 -1
  54. package/dist/api/generated/script-face-manifest.js +0 -1
  55. package/dist/api/generated/script-face-manifest.js.map +1 -1
  56. package/dist/api/generated/script-face.d.ts +1 -4
  57. package/dist/api/generated/script-face.d.ts.map +1 -1
  58. package/dist/api/generated/script-face.js +2 -3
  59. package/dist/api/generated/script-face.js.map +1 -1
  60. package/dist/api/generated/sketching.js +1 -1
  61. package/dist/api/generated/sketching.js.map +1 -1
  62. package/dist/api/generated/topology.d.ts +0 -48
  63. package/dist/api/generated/topology.d.ts.map +1 -1
  64. package/dist/api/generated/topology.js +20 -62
  65. package/dist/api/generated/topology.js.map +1 -1
  66. package/dist/api/import-brep.d.ts +36 -0
  67. package/dist/api/import-brep.d.ts.map +1 -0
  68. package/dist/api/import-brep.js +72 -0
  69. package/dist/api/import-brep.js.map +1 -0
  70. package/dist/api/import-step.d.ts +28 -0
  71. package/dist/api/import-step.d.ts.map +1 -0
  72. package/dist/api/import-step.js +57 -0
  73. package/dist/api/import-step.js.map +1 -0
  74. package/dist/api/index.d.ts +7 -2
  75. package/dist/api/index.d.ts.map +1 -1
  76. package/dist/api/index.js +19 -5
  77. package/dist/api/index.js.map +1 -1
  78. package/dist/api/internal/compat-op.d.ts +2 -0
  79. package/dist/api/internal/compat-op.d.ts.map +1 -1
  80. package/dist/api/internal/compat-op.js +10 -2
  81. package/dist/api/internal/compat-op.js.map +1 -1
  82. package/dist/api/knurl.d.ts.map +1 -1
  83. package/dist/api/knurl.js +1 -0
  84. package/dist/api/knurl.js.map +1 -1
  85. package/dist/api/load.d.ts +3 -1
  86. package/dist/api/load.d.ts.map +1 -1
  87. package/dist/api/load.js +3 -1
  88. package/dist/api/load.js.map +1 -1
  89. package/dist/api/pattern.d.ts +32 -0
  90. package/dist/api/pattern.d.ts.map +1 -0
  91. package/dist/api/pattern.js +121 -0
  92. package/dist/api/pattern.js.map +1 -0
  93. package/dist/api/place.d.ts +35 -0
  94. package/dist/api/place.d.ts.map +1 -0
  95. package/dist/api/place.js +113 -0
  96. package/dist/api/place.js.map +1 -0
  97. package/dist/api/primitives.d.ts.map +1 -1
  98. package/dist/api/primitives.js +10 -3
  99. package/dist/api/primitives.js.map +1 -1
  100. package/dist/api/screw.d.ts.map +1 -1
  101. package/dist/api/screw.js +1 -0
  102. package/dist/api/screw.js.map +1 -1
  103. package/dist/api/sdf.d.ts.map +1 -1
  104. package/dist/api/sdf.js +1 -0
  105. package/dist/api/sdf.js.map +1 -1
  106. package/dist/api/sketch.d.ts.map +1 -1
  107. package/dist/api/sketch.js +1 -0
  108. package/dist/api/sketch.js.map +1 -1
  109. package/dist/api/split.d.ts +31 -0
  110. package/dist/api/split.d.ts.map +1 -0
  111. package/dist/api/split.js +96 -0
  112. package/dist/api/split.js.map +1 -0
  113. package/dist/api/surface/arg-spec.d.ts +9 -0
  114. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  115. package/dist/api/surface/arg-spec.js +49 -30
  116. package/dist/api/surface/arg-spec.js.map +1 -1
  117. package/dist/api/svgExtrude.d.ts.map +1 -1
  118. package/dist/api/svgExtrude.js +1 -0
  119. package/dist/api/svgExtrude.js.map +1 -1
  120. package/dist/api/text.d.ts.map +1 -1
  121. package/dist/api/text.js +1 -0
  122. package/dist/api/text.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/brep/brep-ops.d.ts +34 -1
  131. package/dist/brep/brep-ops.d.ts.map +1 -1
  132. package/dist/brep/brep-ops.js +62 -22
  133. package/dist/brep/brep-ops.js.map +1 -1
  134. package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
  135. package/dist/brep/engine/adapters/brep-mock.js +8 -0
  136. package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
  137. package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
  138. package/dist/brep/engine/adapters/brepkit.js +6 -1
  139. package/dist/brep/engine/adapters/brepkit.js.map +1 -1
  140. package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
  141. package/dist/brep/engine/adapters/occt.js +24 -1
  142. package/dist/brep/engine/adapters/occt.js.map +1 -1
  143. package/dist/brep/engine/primitives.d.ts +17 -0
  144. package/dist/brep/engine/primitives.d.ts.map +1 -1
  145. package/dist/brep/engine/primitives.js.map +1 -1
  146. package/dist/brep/engine/types.d.ts +49 -6
  147. package/dist/brep/engine/types.d.ts.map +1 -1
  148. package/dist/brep/engine/types.js.map +1 -1
  149. package/dist/brep/export/step.d.ts.map +1 -1
  150. package/dist/brep/export/step.js +6 -1
  151. package/dist/brep/export/step.js.map +1 -1
  152. package/dist/brep/face-evolution.d.ts +78 -8
  153. package/dist/brep/face-evolution.d.ts.map +1 -1
  154. package/dist/brep/face-evolution.js +130 -17
  155. package/dist/brep/face-evolution.js.map +1 -1
  156. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  157. package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
  158. package/dist/brepkit-kernel/brepkitKernel.js +27 -1
  159. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  160. package/dist/browser.d.ts +0 -2
  161. package/dist/browser.d.ts.map +1 -1
  162. package/dist/browser.js +2 -2
  163. package/dist/browser.js.map +1 -1
  164. package/dist/cad-runtime/admit-compat-lib.d.ts +19 -1
  165. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  166. package/dist/cad-runtime/admit-compat-lib.js +21 -1
  167. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  168. package/dist/cad-runtime/backend-dispatch.d.ts +44 -3
  169. package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
  170. package/dist/cad-runtime/backend-dispatch.js +46 -3
  171. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  172. package/dist/cad-runtime/browser-lib-loader.d.ts +2 -0
  173. package/dist/cad-runtime/browser-lib-loader.d.ts.map +1 -1
  174. package/dist/cad-runtime/browser-lib-loader.js +9 -1
  175. package/dist/cad-runtime/browser-lib-loader.js.map +1 -1
  176. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  177. package/dist/cad-runtime/direct-executor.js +14 -4
  178. package/dist/cad-runtime/direct-executor.js.map +1 -1
  179. package/dist/cad-runtime/module-registry.d.ts +3 -1
  180. package/dist/cad-runtime/module-registry.d.ts.map +1 -1
  181. package/dist/cad-runtime/module-registry.js +13 -1
  182. package/dist/cad-runtime/module-registry.js.map +1 -1
  183. package/dist/cad-runtime/ports.d.ts +7 -0
  184. package/dist/cad-runtime/ports.d.ts.map +1 -1
  185. package/dist/cad-runtime/ports.js.map +1 -1
  186. package/dist/cad-runtime/runtime-concurrent-error.d.ts +38 -0
  187. package/dist/cad-runtime/runtime-concurrent-error.d.ts.map +1 -0
  188. package/dist/cad-runtime/runtime-concurrent-error.js +43 -0
  189. package/dist/cad-runtime/runtime-concurrent-error.js.map +1 -0
  190. package/dist/cad-runtime/runtime.d.ts +54 -2
  191. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  192. package/dist/cad-runtime/runtime.js +186 -10
  193. package/dist/cad-runtime/runtime.js.map +1 -1
  194. package/dist/define-op.d.ts +22 -0
  195. package/dist/define-op.d.ts.map +1 -1
  196. package/dist/define-op.js +82 -12
  197. package/dist/define-op.js.map +1 -1
  198. package/dist/fcstd/attachment.d.ts +72 -0
  199. package/dist/fcstd/attachment.d.ts.map +1 -0
  200. package/dist/fcstd/attachment.js +93 -0
  201. package/dist/fcstd/attachment.js.map +1 -0
  202. package/dist/fcstd/build-fai-zip.d.ts +11 -0
  203. package/dist/fcstd/build-fai-zip.d.ts.map +1 -1
  204. package/dist/fcstd/build-fai-zip.js +21 -8
  205. package/dist/fcstd/build-fai-zip.js.map +1 -1
  206. package/dist/fcstd/cli.d.ts +3 -0
  207. package/dist/fcstd/cli.d.ts.map +1 -0
  208. package/dist/fcstd/cli.js +37 -0
  209. package/dist/fcstd/cli.js.map +1 -0
  210. package/dist/fcstd/codegen.d.ts +23 -1
  211. package/dist/fcstd/codegen.d.ts.map +1 -1
  212. package/dist/fcstd/codegen.js +159 -48
  213. package/dist/fcstd/codegen.js.map +1 -1
  214. package/dist/fcstd/container.d.ts +16 -1
  215. package/dist/fcstd/container.d.ts.map +1 -1
  216. package/dist/fcstd/container.js +12 -1
  217. package/dist/fcstd/container.js.map +1 -1
  218. package/dist/fcstd/contour.d.ts +9 -1
  219. package/dist/fcstd/contour.d.ts.map +1 -1
  220. package/dist/fcstd/contour.js +28 -18
  221. package/dist/fcstd/contour.js.map +1 -1
  222. package/dist/fcstd/convert.d.ts +31 -2
  223. package/dist/fcstd/convert.d.ts.map +1 -1
  224. package/dist/fcstd/convert.js +73 -22
  225. package/dist/fcstd/convert.js.map +1 -1
  226. package/dist/fcstd/document.d.ts +8 -1
  227. package/dist/fcstd/document.d.ts.map +1 -1
  228. package/dist/fcstd/document.js +4 -1
  229. package/dist/fcstd/document.js.map +1 -1
  230. package/dist/fcstd/expressions.d.ts +14 -1
  231. package/dist/fcstd/expressions.d.ts.map +1 -1
  232. package/dist/fcstd/expressions.js +11 -1
  233. package/dist/fcstd/expressions.js.map +1 -1
  234. package/dist/fcstd/external-geo.d.ts +27 -2
  235. package/dist/fcstd/external-geo.d.ts.map +1 -1
  236. package/dist/fcstd/external-geo.js +23 -2
  237. package/dist/fcstd/external-geo.js.map +1 -1
  238. package/dist/fcstd/feature-translate.d.ts +85 -3
  239. package/dist/fcstd/feature-translate.d.ts.map +1 -1
  240. package/dist/fcstd/feature-translate.js +189 -9
  241. package/dist/fcstd/feature-translate.js.map +1 -1
  242. package/dist/fcstd/index.d.ts +23 -0
  243. package/dist/fcstd/index.d.ts.map +1 -0
  244. package/dist/fcstd/index.js +19 -0
  245. package/dist/fcstd/index.js.map +1 -0
  246. package/dist/fcstd/placement.d.ts +49 -6
  247. package/dist/fcstd/placement.d.ts.map +1 -1
  248. package/dist/fcstd/placement.js +46 -6
  249. package/dist/fcstd/placement.js.map +1 -1
  250. package/dist/fcstd/planegcs-backend.d.ts +16 -1
  251. package/dist/fcstd/planegcs-backend.d.ts.map +1 -1
  252. package/dist/fcstd/planegcs-backend.js +16 -1
  253. package/dist/fcstd/planegcs-backend.js.map +1 -1
  254. package/dist/fcstd/sketch-parse.d.ts +43 -0
  255. package/dist/fcstd/sketch-parse.d.ts.map +1 -1
  256. package/dist/fcstd/sketch-parse.js +26 -0
  257. package/dist/fcstd/sketch-parse.js.map +1 -1
  258. package/dist/fcstd/sketch-solver.d.ts +20 -2
  259. package/dist/fcstd/sketch-solver.d.ts.map +1 -1
  260. package/dist/fcstd/sketch-solver.js +6 -1
  261. package/dist/fcstd/sketch-solver.js.map +1 -1
  262. package/dist/fcstd/sketch-verify.d.ts +19 -1
  263. package/dist/fcstd/sketch-verify.d.ts.map +1 -1
  264. package/dist/fcstd/sketch-verify.js +14 -1
  265. package/dist/fcstd/sketch-verify.js.map +1 -1
  266. package/dist/fcstd/structural-types.d.ts +83 -0
  267. package/dist/fcstd/structural-types.d.ts.map +1 -0
  268. package/dist/fcstd/structural-types.js +116 -0
  269. package/dist/fcstd/structural-types.js.map +1 -0
  270. package/dist/fcstd/unpack.d.ts +21 -2
  271. package/dist/fcstd/unpack.d.ts.map +1 -1
  272. package/dist/fcstd/unpack.js +11 -2
  273. package/dist/fcstd/unpack.js.map +1 -1
  274. package/dist/fcstd-convert.d.ts +30 -0
  275. package/dist/fcstd-convert.d.ts.map +1 -0
  276. package/dist/fcstd-convert.js +27 -0
  277. package/dist/fcstd-convert.js.map +1 -0
  278. package/dist/index.d.ts +1 -0
  279. package/dist/index.d.ts.map +1 -1
  280. package/dist/index.js.map +1 -1
  281. package/dist/lang/determinism-scanner.d.ts +62 -0
  282. package/dist/lang/determinism-scanner.d.ts.map +1 -0
  283. package/dist/lang/determinism-scanner.js +619 -0
  284. package/dist/lang/determinism-scanner.js.map +1 -0
  285. package/dist/lang/symbol-table.generated.d.ts +7 -3
  286. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  287. package/dist/lang/symbol-table.generated.js +7 -3
  288. package/dist/lang/symbol-table.generated.js.map +1 -1
  289. package/dist/mesh/index.d.ts.map +1 -1
  290. package/dist/mesh/index.js +3 -2
  291. package/dist/mesh/index.js.map +1 -1
  292. package/dist/node-host/cli.d.ts.map +1 -1
  293. package/dist/node-host/cli.js +56 -2
  294. package/dist/node-host/cli.js.map +1 -1
  295. package/dist/runtime-state.d.ts +18 -6
  296. package/dist/runtime-state.d.ts.map +1 -1
  297. package/dist/runtime-state.js +9 -1
  298. package/dist/runtime-state.js.map +1 -1
  299. package/dist/shape.d.ts +15 -0
  300. package/dist/shape.d.ts.map +1 -1
  301. package/dist/shape.js +26 -3
  302. package/dist/shape.js.map +1 -1
  303. package/dist/topology/naming/build-naming.d.ts +14 -30
  304. package/dist/topology/naming/build-naming.d.ts.map +1 -1
  305. package/dist/topology/naming/build-naming.js +21 -54
  306. package/dist/topology/naming/build-naming.js.map +1 -1
  307. package/dist/topology/naming/capture-topo-ref.d.ts.map +1 -1
  308. package/dist/topology/naming/capture-topo-ref.js +5 -0
  309. package/dist/topology/naming/capture-topo-ref.js.map +1 -1
  310. package/dist/topology/naming/index.d.ts +3 -0
  311. package/dist/topology/naming/index.d.ts.map +1 -1
  312. package/dist/topology/naming/index.js +3 -0
  313. package/dist/topology/naming/index.js.map +1 -1
  314. package/dist/topology/naming/lineage-resolve.d.ts +80 -0
  315. package/dist/topology/naming/lineage-resolve.d.ts.map +1 -0
  316. package/dist/topology/naming/lineage-resolve.js +120 -0
  317. package/dist/topology/naming/lineage-resolve.js.map +1 -0
  318. package/dist/topology/naming/lineage.d.ts +349 -0
  319. package/dist/topology/naming/lineage.d.ts.map +1 -0
  320. package/dist/topology/naming/lineage.js +398 -0
  321. package/dist/topology/naming/lineage.js.map +1 -0
  322. package/dist/topology/naming/migrate.d.ts +41 -0
  323. package/dist/topology/naming/migrate.d.ts.map +1 -0
  324. package/dist/topology/naming/migrate.js +88 -0
  325. package/dist/topology/naming/migrate.js.map +1 -0
  326. package/dist/topology/naming/role-name.d.ts +176 -0
  327. package/dist/topology/naming/role-name.d.ts.map +1 -0
  328. package/dist/topology/naming/role-name.js +344 -0
  329. package/dist/topology/naming/role-name.js.map +1 -0
  330. package/dist/topology/naming/roles.d.ts +20 -22
  331. package/dist/topology/naming/roles.d.ts.map +1 -1
  332. package/dist/topology/naming/roles.js +51 -49
  333. package/dist/topology/naming/roles.js.map +1 -1
  334. package/dist/topology/naming/types.d.ts +65 -18
  335. package/dist/topology/naming/types.d.ts.map +1 -1
  336. package/dist/topology/naming/types.js.map +1 -1
  337. package/dist/weapp.d.ts +22 -0
  338. package/dist/weapp.d.ts.map +1 -0
  339. package/dist/weapp.js +23 -0
  340. package/dist/weapp.js.map +1 -0
  341. package/package.json +18 -5
@@ -1 +1 @@
1
- {"version":3,"file":"admit-compat-lib.js","sourceRoot":"","sources":["../../src/cad-runtime/admit-compat-lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAIpD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,EAA2B;IACxD,iBAAiB,CAAC,EAAE,CAAC,CAAA;IACrB,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,SAAQ;QAAC,CAAC;QACxD,IAAK,CAAwC,CAAC,YAAY,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,SAAQ;QAAC,CAAC;QACxF,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAiC,EAAE;YACtD,IAAI;YACJ,OAAO,EAAG,CAAoB,CAAC,OAAO,EAAE,iEAAiE;SAC1G,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["/**\n * admit-compat-lib — registerLib's admission-stage enhancement (B4 fix).\n *\n * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.3.3\n *\n * Hard ordering constraint: assertLibConforms runs BEFORE wrapping — DUAL_OP_META\n * hangs on the function object with enumerable:false (define-op.ts) and\n * assertLibConforms iterates values via Object.values to judge metadata; a\n * wrap-first admission would let bare functions silently skip the whole strict\n * validation pass (verified in practice, R8).\n *\n * Multi-output annotation: the only contract name is `fn.outputs` (the\n * `outputs` defineOp option); the legacy name is deleted repo-wide.\n *\n * @module\n */\n\nimport { assertLibConforms, DUAL_OP_META } from '../define-op'\nimport { compatOp } from '../api/internal/compat-op'\n\ntype OutputsCarrier = { outputs?: string[] }\n\n/**\n * Establish an admission-stage wrapper namespace for registerLib.\n *\n * Non-functions (contractVersion / resource objects) and native dual-ops\n * (already carrying DUAL_OP_META) pass through just as they are; any bare\n * function is lifted through compatOp so it cannot silently bypass the\n * statement-level boundary contract (B4).\n *\n * @param ns the library namespace object being registered.\n * @returns the admitted namespace (bare functions replaced by compatOp facades).\n */\nexport function admitCompatLib(ns: Record<string, unknown>): Record<string, unknown> {\n assertLibConforms(ns)\n const out: Record<string, unknown> = {}\n for (const [name, v] of Object.entries(ns)) {\n if (typeof v !== 'function') { out[name] = v; continue }\n if ((v as unknown as Record<string, unknown>)[DUAL_OP_META]) { out[name] = v; continue }\n out[name] = compatOp(v as (...a: unknown[]) => unknown, {\n name,\n outputs: (v as OutputsCarrier).outputs, // only fn.outputs; no other annotation name is recognized (§3.6)\n })\n }\n return out\n}"]}
1
+ {"version":3,"file":"admit-compat-lib.js","sourceRoot":"","sources":["../../src/cad-runtime/admit-compat-lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAmBpD;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,EAA2B,EAAE,OAA0B;IACpF,iBAAiB,CAAC,EAAE,CAAC,CAAA;IACrB,MAAM,GAAG,GAA4B,EAAE,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,SAAQ;QAAC,CAAC;QACxD,IAAK,CAAwC,CAAC,YAAY,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,SAAQ;QAAC,CAAC;QACxF,MAAM,QAAQ,GAAI,CAAmB,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,CAAA;QAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,mDAAmD;gBAChF,wFAAwF;gBACxF,2FAA2F;gBAC3F,6FAA6F,CAC9F,CAAA;QACH,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAiC,EAAE;YACtD,IAAI;YACJ,OAAO,EAAG,CAAoB,CAAC,OAAO,EAAE,iEAAiE;YACzG,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["/**\n * admit-compat-lib — registerLib's admission-stage enhancement (B4 fix).\n *\n * Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §4.3.3\n *\n * Hard ordering constraint: assertLibConforms runs BEFORE wrapping — DUAL_OP_META\n * hangs on the function object with enumerable:false (define-op.ts) and\n * assertLibConforms iterates values via Object.values to judge metadata; a\n * wrap-first admission would let bare functions silently skip the whole strict\n * validation pass (verified in practice, R8).\n *\n * Multi-output annotation: the only contract name is `fn.outputs` (the\n * `outputs` defineOp option); the legacy name is deleted repo-wide.\n *\n * @module\n */\n\nimport { assertLibConforms, DUAL_OP_META } from '../define-op'\nimport { compatOp } from '../api/internal/compat-op'\nimport type { Provenance } from '../topology/naming/lineage'\n\ntype OutputsCarrier = { outputs?: string[] }\n\n/**\n * Function-level naming annotation (Phase 2.11-①): the only contract name is\n * `fn.naming` (mirrors `fn.outputs`). A library author attaches a `Provenance`\n * to a bare exported function so the lifter records the op's true face-mapping\n * category instead of the blanket `unmodeled` default.\n */\ntype NamingCarrier = { naming?: Provenance }\n\n/** Library-level naming default (registerLib option; per-function `fn.naming` wins). */\nexport interface LibNamingOptions {\n /** Default provenance for bare functions that carry no `fn.naming`. */\n naming?: Provenance\n}\n\n/**\n * Phase 2.11-③(D11 裁决):blanket 默认已废除。裸函数既无 `fn.naming` 也无库级\n * `options.naming` 时**硬失败**——「能力缺口的正解是补能力或报错,不是加旁路开关」\n * (项目红线)。曾经这里硬编码一条 `unmodeled: 'bare function lift, provenance\n * not declared'` 兜底,正是 D11 否决的那个旁路;三库显式声明(2.11-②)落地后,\n * 它没有存在的理由。\n */\n\n/**\n * Establish an admission-stage wrapper namespace for registerLib.\n *\n * Non-functions (contractVersion / resource objects) and native dual-ops\n * (already carrying DUAL_OP_META) pass through just as they are; any bare\n * function is lifted through compatOp so it cannot silently bypass the\n * statement-level boundary contract (B4).\n *\n * Naming declaration precedence (Phase 2.11-①/③): `fn.naming` (function-level)\n * → `options.naming` (library-level default) → **hard fail** (no default value).\n *\n * @param ns the library namespace object being registered.\n * @param options admission options (library-level naming default).\n * @returns the admitted namespace (bare functions replaced by compatOp facades).\n * @throws Error when a bare function has neither `fn.naming` nor a library-level default.\n */\nexport function admitCompatLib(ns: Record<string, unknown>, options?: LibNamingOptions): Record<string, unknown> {\n assertLibConforms(ns)\n const out: Record<string, unknown> = {}\n for (const [name, v] of Object.entries(ns)) {\n if (typeof v !== 'function') { out[name] = v; continue }\n if ((v as unknown as Record<string, unknown>)[DUAL_OP_META]) { out[name] = v; continue }\n const declared = (v as NamingCarrier).naming ?? options?.naming\n if (!declared) {\n throw new Error(\n `[faijs] lib function '${name}' is a bare function with no naming declaration. ` +\n `Attach fn.naming (Provenance) to the function, or pass registerLib(..., { naming }) / ` +\n `declare \"faijs\": { \"naming\": { \"kind\": \"unmodeled\", \"reason\": \"...\" } } in package.json. ` +\n `Undeclared provenance is a hard error (Phase 2.11-③ / plan D11): no blanket default exists.`,\n )\n }\n out[name] = compatOp(v as (...a: unknown[]) => unknown, {\n name,\n outputs: (v as OutputsCarrier).outputs, // only fn.outputs; no other annotation name is recognized (§3.6)\n naming: declared,\n })\n }\n return out\n}"]}
@@ -13,11 +13,48 @@
13
13
  * 不依赖 cad-runtime 的任何其他模块,因此不构成循环。
14
14
  * P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。
15
15
  */
16
+ import type { BrepEvolutionKind } from '../brep/engine/types.js';
16
17
  import type { Shape } from '../mesh/types.js';
17
18
  /** 静态判定的两个可能结果:走 BREP 链或 mesh 链。 */
18
19
  export type BrepPath = 'brep' | 'mesh';
19
- /** 能力名(对应 §7.5 BrepCapabilities 的布尔字段;能力路由 §8.4 用)。 */
20
- export type BrepCapabilityName = 'evolution' | 'heal' | 'directEdit' | 'advSurface' | 'assembly' | 'meshLift';
20
+ /**
21
+ * 能力名:族级布尔位(`BrepCapabilities` 里类型为 boolean 的字段)**加上**逐核函数的
22
+ * 面演化名(`BrepEvolutionKind`,`evolution` 名单里的条目)。
23
+ *
24
+ * ⚠️ `'evolution'` 已从本联合中**移除**(2026-09-22 Phase 0.2):它曾是"面演化族"的
25
+ * 族级名,但族级声明会多报能力(内核可只提供部分 `*WithHistory`)→ 静态判定失效。
26
+ * op 现在必须声明**具体**要哪个核函数(如 `['cut']`),引擎声明**具体**提供哪些
27
+ * (`evolution: ['fuse','cut','fillet']`)。见 `brep/engine/types.ts` 的 `BrepEvolutionKind`。
28
+ */
29
+ export type BrepCapabilityName = 'heal' | 'directEdit' | 'advSurface' | 'assembly' | 'meshLift' | BrepEvolutionKind;
30
+ /**
31
+ * 引擎能力声明的宽松镜像(`runtime-state.Backends.config.brepCapabilities` 同构;
32
+ * 该模块须零依赖,故不复用 `BrepCapabilities`)。
33
+ */
34
+ export interface EngineCapabilitiesLike {
35
+ /** 本引擎实际提供的 `*WithHistory` 核函数名。 */
36
+ evolution?: readonly string[];
37
+ heal?: boolean;
38
+ directEdit?: boolean;
39
+ advSurface?: boolean;
40
+ assembly?: boolean;
41
+ meshLift?: boolean;
42
+ }
43
+ /**
44
+ * 引擎能力声明 → 受支持能力名集合(族级布尔位 + `evolution` 名单展开成逐个核函数名)。
45
+ * @param caps - 当前引擎的能力声明(缺省 = 空集,即什么都不支持)。
46
+ * @returns 该引擎声明支持的 `BrepCapabilityName` 集合。
47
+ */
48
+ export declare function engineCapabilitySet(caps: EngineCapabilitiesLike | undefined): ReadonlySet<string>;
49
+ /**
50
+ * 声明列表中第一个**当前引擎不具备**的能力名(全具备则 `undefined`)。
51
+ *
52
+ * 读的是运行时配置里的能力声明(与 `dispatchPath` 同一来源),因此调用点与分派点
53
+ * 对"缺哪个能力"的判断必然一致——不会出现"defineOp 认为缺 evolution、dispatch 认为具备"。
54
+ * @param declared - op 声明的能力名列表(来自 `DualOpMeta.capabilities`)。
55
+ * @returns 第一个缺失的能力名,或 undefined。
56
+ */
57
+ export declare function firstMissingCapability(declared: readonly BrepCapabilityName[] | undefined): BrepCapabilityName | undefined;
21
58
  /**
22
59
  * Decide whether this invocation takes the BREP or the mesh backend path.
23
60
  *
@@ -35,7 +72,11 @@ export type BrepCapabilityName = 'evolution' | 'heal' | 'directEdit' | 'advSurfa
35
72
  * Capability routing (requiredCapability): when the current engine (registry)
36
73
  * lacks a declared capability, brep mode throws a BrepUnsupportedError (an
37
74
  * explicit error, never a silent fallback) while auto mode statically degrades
38
- * to mesh (never fabricating a missing capability).
75
+ * to mesh (never fabricating a missing capability). The capability is matched
76
+ * against the engine's declaration as a set of concrete names: family booleans
77
+ * plus the engine's `evolution` list of `*WithHistory` kernel function names
78
+ * (Phase 0.2 — a family-level `evolution: true` would over-report, since a
79
+ * kernel may provide only a subset of the evolution family).
39
80
  *
40
81
  * Red line unchanged: static dispatch, no runtime try-catch fallback. The
41
82
  * decision happens before the implementation runs and is never revised after a
@@ -1 +1 @@
1
- {"version":3,"file":"backend-dispatch.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAE1C,oCAAoC;AACpC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;AAEtC,uDAAuD;AACvD,MAAM,MAAM,kBAAkB,GAC1B,WAAW,GACX,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,UAAU,CAAA;AAEd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACzC,kBAAkB,CAAC,EAAE,kBAAkB,GACtC,QAAQ,CA+CV"}
1
+ {"version":3,"file":"backend-dispatch.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAE1C,oCAAoC;AACpC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;AAEtC;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,iBAAiB,CAAA;AAEnH;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAUjG;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GAAG,SAAS,GAClD,kBAAkB,GAAG,SAAS,CAIhC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACzC,kBAAkB,CAAC,EAAE,kBAAkB,GACtC,QAAQ,CAiDV"}
@@ -15,6 +15,43 @@
15
15
  */
16
16
  import { getBackends, getCurrentStmt, BrepUnsupportedError, MeshUnsupportedError } from '../runtime-state.js';
17
17
  import { hasBrep } from '../shape.js';
18
+ /**
19
+ * 引擎能力声明 → 受支持能力名集合(族级布尔位 + `evolution` 名单展开成逐个核函数名)。
20
+ * @param caps - 当前引擎的能力声明(缺省 = 空集,即什么都不支持)。
21
+ * @returns 该引擎声明支持的 `BrepCapabilityName` 集合。
22
+ */
23
+ export function engineCapabilitySet(caps) {
24
+ const set = new Set();
25
+ if (!caps)
26
+ return set;
27
+ for (const kind of caps.evolution ?? [])
28
+ set.add(kind);
29
+ if (caps.heal)
30
+ set.add('heal');
31
+ if (caps.directEdit)
32
+ set.add('directEdit');
33
+ if (caps.advSurface)
34
+ set.add('advSurface');
35
+ if (caps.assembly)
36
+ set.add('assembly');
37
+ if (caps.meshLift)
38
+ set.add('meshLift');
39
+ return set;
40
+ }
41
+ /**
42
+ * 声明列表中第一个**当前引擎不具备**的能力名(全具备则 `undefined`)。
43
+ *
44
+ * 读的是运行时配置里的能力声明(与 `dispatchPath` 同一来源),因此调用点与分派点
45
+ * 对"缺哪个能力"的判断必然一致——不会出现"defineOp 认为缺 evolution、dispatch 认为具备"。
46
+ * @param declared - op 声明的能力名列表(来自 `DualOpMeta.capabilities`)。
47
+ * @returns 第一个缺失的能力名,或 undefined。
48
+ */
49
+ export function firstMissingCapability(declared) {
50
+ if (!declared?.length)
51
+ return undefined;
52
+ const supported = engineCapabilitySet(getBackends().config.brepCapabilities);
53
+ return declared.find((cap) => !supported.has(cap));
54
+ }
18
55
  /**
19
56
  * Decide whether this invocation takes the BREP or the mesh backend path.
20
57
  *
@@ -32,7 +69,11 @@ import { hasBrep } from '../shape.js';
32
69
  * Capability routing (requiredCapability): when the current engine (registry)
33
70
  * lacks a declared capability, brep mode throws a BrepUnsupportedError (an
34
71
  * explicit error, never a silent fallback) while auto mode statically degrades
35
- * to mesh (never fabricating a missing capability).
72
+ * to mesh (never fabricating a missing capability). The capability is matched
73
+ * against the engine's declaration as a set of concrete names: family booleans
74
+ * plus the engine's `evolution` list of `*WithHistory` kernel function names
75
+ * (Phase 0.2 — a family-level `evolution: true` would over-report, since a
76
+ * kernel may provide only a subset of the evolution family).
36
77
  *
37
78
  * Red line unchanged: static dispatch, no runtime try-catch fallback. The
38
79
  * decision happens before the implementation runs and is never revised after a
@@ -57,6 +98,8 @@ export function dispatchPath(inputs, impls, requiredCapability) {
57
98
  return 'mesh';
58
99
  }
59
100
  const currentStmt = getCurrentStmt();
101
+ // 引擎能力声明 → 具体能力名集合(族级布尔位 + evolution 名单逐核函数展开)。
102
+ const supported = engineCapabilitySet(config.brepCapabilities);
60
103
  if (config.mode === 'brep') {
61
104
  if (!impls.brep) {
62
105
  throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt);
@@ -65,13 +108,13 @@ export function dispatchPath(inputs, impls, requiredCapability) {
65
108
  throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt);
66
109
  }
67
110
  // 能力路由:brep 模式缺能力 → 明确报错,不静默回退
68
- if (requiredCapability && !config.brepCapabilities?.[requiredCapability]) {
111
+ if (requiredCapability && !supported.has(requiredCapability)) {
69
112
  throw new BrepUnsupportedError(`E_BREP_UNSUPPORTED: current engine lacks capability '${requiredCapability}' (brepEngineId=${config.brepEngineId ?? '<none>'})`, currentStmt);
70
113
  }
71
114
  return 'brep';
72
115
  }
73
116
  // auto 模式:能力路由(缺能力 → 静态降级走 mesh;brep-only 无 mesh 可降 → 明确报错)
74
- if (requiredCapability && !config.brepCapabilities?.[requiredCapability]) {
117
+ if (requiredCapability && !supported.has(requiredCapability)) {
75
118
  if (!impls.mesh) {
76
119
  throw new MeshUnsupportedError(`E_MESH_UNSUPPORTED: current engine lacks capability '${requiredCapability}' and function has no mesh implementation`, currentStmt);
77
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"backend-dispatch.js","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC1G,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAelC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAe,EACf,KAAyC,EACzC,kBAAuC;IAEvC,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IAEhC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,oBAAoB,CAAC,yDAAyD,EAAE,cAAc,EAAE,CAAC,CAAA;QAC7G,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,oBAAoB,CAAC,yDAAyD,EAAE,WAAW,CAAC,CAAA;QACxG,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,oBAAoB,CAAC,uCAAuC,EAAE,WAAW,CAAC,CAAA;QACtF,CAAC;QACD,+BAA+B;QAC/B,IAAI,kBAAkB,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,oBAAoB,CAC5B,wDAAwD,kBAAkB,mBAAmB,MAAM,CAAC,YAAY,IAAI,QAAQ,GAAG,EAC/H,WAAW,CACZ,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,4DAA4D;IAC5D,IAAI,kBAAkB,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,oBAAoB,CAC5B,wDAAwD,kBAAkB,2CAA2C,EACrH,WAAW,CACZ,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAA;IACtD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,IAAI,oBAAoB,CAC5B,+EAA+E,EAC/E,WAAW,CACZ,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["/**\n * backend-dispatch — BREP/mesh 路径静态判定(引擎侧)\n *\n *\n * 红线(AGENTS.md):BREP 链是否可用,由静态规则在执行前判定,\n * **禁止运行时 try-catch 回退**。BREP 路径抛异常 = 设计缺陷或 bug,必须直接报错暴露。\n *\n * 本文件从 src/stdlib/internal/resolve-path.ts 迁移而来:判定是引擎的职责,\n * 不该由每个库函数各自调用。\n *\n * ⚠️ 分层例外:本文件位于 cad-runtime/ 但被 stdlib/ import。\n * 这是安全的——它只依赖 runtime-state / stdlib/shape / mesh/types,\n * 不依赖 cad-runtime 的任何其他模块,因此不构成循环。\n * P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。\n */\n\nimport { getBackends, getCurrentStmt, BrepUnsupportedError, MeshUnsupportedError } from '../runtime-state'\nimport { hasBrep } from '../shape'\nimport type { Shape } from '../mesh/types'\n\n/** 静态判定的两个可能结果:走 BREP 链或 mesh 链。 */\nexport type BrepPath = 'brep' | 'mesh'\n\n/** 能力名(对应 §7.5 BrepCapabilities 的布尔字段;能力路由 §8.4 用)。 */\nexport type BrepCapabilityName =\n | 'evolution'\n | 'heal'\n | 'directEdit'\n | 'advSurface'\n | 'assembly'\n | 'meshLift'\n\n/**\n * Decide whether this invocation takes the BREP or the mesh backend path.\n *\n * Bidirectional dispatch (defineOp contract, D1/D1b/D2):\n * - `impls` carries mesh/brep implementation presence (function reference or\n * undefined, fixed at defineOp construction — static).\n * - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)\n * throws `MeshUnsupportedError`.\n * - `mode='brep'` → missing brep / input off chain / missing capability throws\n * `BrepUnsupportedError`.\n * - `mode='auto'` → brep when brep exists and all inputs are on the chain;\n * otherwise mesh when mesh exists; brep-only with a broken input chain (or\n * missing capability) throws `MeshUnsupportedError` — no mesh to fall back to.\n *\n * Capability routing (requiredCapability): when the current engine (registry)\n * lacks a declared capability, brep mode throws a BrepUnsupportedError (an\n * explicit error, never a silent fallback) while auto mode statically degrades\n * to mesh (never fabricating a missing capability).\n *\n * Red line unchanged: static dispatch, no runtime try-catch fallback. The\n * decision happens before the implementation runs and is never revised after a\n * failed execution.\n *\n * Third-party library authors never call this directly — `defineOp` (SDK)\n * invokes it inside its wrapper; authors only declare the implementation set.\n * @param inputs - the shapes feeding the operation, used to test whether all\n * lie on the BREP chain.\n * @param impls - the operation's implementation set: `mesh`/`brep` presence\n * (function reference or undefined; fixed at defineOp construction).\n * @param requiredCapability - an optional capability the operation declares;\n * a missing capability routes the dispatch.\n * @returns the selected backend path: 'brep' or 'mesh'.\n */\nexport function dispatchPath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown },\n requiredCapability?: BrepCapabilityName,\n): BrepPath {\n const { config } = getBackends()\n\n if (config.mode === 'mesh') {\n if (!impls.mesh) {\n throw new MeshUnsupportedError('E_MESH_UNSUPPORTED: function has no mesh implementation', getCurrentStmt())\n }\n return 'mesh'\n }\n const currentStmt = getCurrentStmt()\n\n if (config.mode === 'brep') {\n if (!impls.brep) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt)\n }\n if (!inputs.every(hasBrep)) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt)\n }\n // 能力路由:brep 模式缺能力 → 明确报错,不静默回退\n if (requiredCapability && !config.brepCapabilities?.[requiredCapability]) {\n throw new BrepUnsupportedError(\n `E_BREP_UNSUPPORTED: current engine lacks capability '${requiredCapability}' (brepEngineId=${config.brepEngineId ?? '<none>'})`,\n currentStmt,\n )\n }\n return 'brep'\n }\n\n // auto 模式:能力路由(缺能力 → 静态降级走 mesh;brep-only 无 mesh 可降 → 明确报错)\n if (requiredCapability && !config.brepCapabilities?.[requiredCapability]) {\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n `E_MESH_UNSUPPORTED: current engine lacks capability '${requiredCapability}' and function has no mesh implementation`,\n currentStmt,\n )\n }\n return 'mesh'\n }\n\n if (impls.brep && inputs.every(hasBrep)) return 'brep'\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n 'E_MESH_UNSUPPORTED: input is not BREP and function has no mesh implementation',\n currentStmt,\n )\n }\n return 'mesh'\n}\n"]}
1
+ {"version":3,"file":"backend-dispatch.js","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * backend-dispatch — BREP/mesh 路径静态判定(引擎侧)\n *\n *\n * 红线(AGENTS.md):BREP 链是否可用,由静态规则在执行前判定,\n * **禁止运行时 try-catch 回退**。BREP 路径抛异常 = 设计缺陷或 bug,必须直接报错暴露。\n *\n * 本文件从 src/stdlib/internal/resolve-path.ts 迁移而来:判定是引擎的职责,\n * 不该由每个库函数各自调用。\n *\n * ⚠️ 分层例外:本文件位于 cad-runtime/ 但被 stdlib/ import。\n * 这是安全的——它只依赖 runtime-state / stdlib/shape / mesh/types,\n * 不依赖 cad-runtime 的任何其他模块,因此不构成循环。\n * P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。\n */\n\nimport { getBackends, getCurrentStmt, BrepUnsupportedError, MeshUnsupportedError } from '../runtime-state'\nimport { hasBrep } from '../shape'\nimport type { BrepEvolutionKind } from '../brep/engine/types'\nimport type { Shape } from '../mesh/types'\n\n/** 静态判定的两个可能结果:走 BREP 链或 mesh 链。 */\nexport type BrepPath = 'brep' | 'mesh'\n\n/**\n * 能力名:族级布尔位(`BrepCapabilities` 里类型为 boolean 的字段)**加上**逐核函数的\n * 面演化名(`BrepEvolutionKind`,`evolution` 名单里的条目)。\n *\n * ⚠️ `'evolution'` 已从本联合中**移除**(2026-09-22 Phase 0.2):它曾是\"面演化族\"的\n * 族级名,但族级声明会多报能力(内核可只提供部分 `*WithHistory`)→ 静态判定失效。\n * op 现在必须声明**具体**要哪个核函数(如 `['cut']`),引擎声明**具体**提供哪些\n * (`evolution: ['fuse','cut','fillet']`)。见 `brep/engine/types.ts` 的 `BrepEvolutionKind`。\n */\nexport type BrepCapabilityName = 'heal' | 'directEdit' | 'advSurface' | 'assembly' | 'meshLift' | BrepEvolutionKind\n\n/**\n * 引擎能力声明的宽松镜像(`runtime-state.Backends.config.brepCapabilities` 同构;\n * 该模块须零依赖,故不复用 `BrepCapabilities`)。\n */\nexport interface EngineCapabilitiesLike {\n /** 本引擎实际提供的 `*WithHistory` 核函数名。 */\n evolution?: readonly string[]\n heal?: boolean\n directEdit?: boolean\n advSurface?: boolean\n assembly?: boolean\n meshLift?: boolean\n}\n\n/**\n * 引擎能力声明 → 受支持能力名集合(族级布尔位 + `evolution` 名单展开成逐个核函数名)。\n * @param caps - 当前引擎的能力声明(缺省 = 空集,即什么都不支持)。\n * @returns 该引擎声明支持的 `BrepCapabilityName` 集合。\n */\nexport function engineCapabilitySet(caps: EngineCapabilitiesLike | undefined): ReadonlySet<string> {\n const set = new Set<string>()\n if (!caps) return set\n for (const kind of caps.evolution ?? []) set.add(kind)\n if (caps.heal) set.add('heal')\n if (caps.directEdit) set.add('directEdit')\n if (caps.advSurface) set.add('advSurface')\n if (caps.assembly) set.add('assembly')\n if (caps.meshLift) set.add('meshLift')\n return set\n}\n\n/**\n * 声明列表中第一个**当前引擎不具备**的能力名(全具备则 `undefined`)。\n *\n * 读的是运行时配置里的能力声明(与 `dispatchPath` 同一来源),因此调用点与分派点\n * 对\"缺哪个能力\"的判断必然一致——不会出现\"defineOp 认为缺 evolution、dispatch 认为具备\"。\n * @param declared - op 声明的能力名列表(来自 `DualOpMeta.capabilities`)。\n * @returns 第一个缺失的能力名,或 undefined。\n */\nexport function firstMissingCapability(\n declared: readonly BrepCapabilityName[] | undefined,\n): BrepCapabilityName | undefined {\n if (!declared?.length) return undefined\n const supported = engineCapabilitySet(getBackends().config.brepCapabilities)\n return declared.find((cap) => !supported.has(cap))\n}\n\n/**\n * Decide whether this invocation takes the BREP or the mesh backend path.\n *\n * Bidirectional dispatch (defineOp contract, D1/D1b/D2):\n * - `impls` carries mesh/brep implementation presence (function reference or\n * undefined, fixed at defineOp construction — static).\n * - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)\n * throws `MeshUnsupportedError`.\n * - `mode='brep'` → missing brep / input off chain / missing capability throws\n * `BrepUnsupportedError`.\n * - `mode='auto'` → brep when brep exists and all inputs are on the chain;\n * otherwise mesh when mesh exists; brep-only with a broken input chain (or\n * missing capability) throws `MeshUnsupportedError` — no mesh to fall back to.\n *\n * Capability routing (requiredCapability): when the current engine (registry)\n * lacks a declared capability, brep mode throws a BrepUnsupportedError (an\n * explicit error, never a silent fallback) while auto mode statically degrades\n * to mesh (never fabricating a missing capability). The capability is matched\n * against the engine's declaration as a set of concrete names: family booleans\n * plus the engine's `evolution` list of `*WithHistory` kernel function names\n * (Phase 0.2 — a family-level `evolution: true` would over-report, since a\n * kernel may provide only a subset of the evolution family).\n *\n * Red line unchanged: static dispatch, no runtime try-catch fallback. The\n * decision happens before the implementation runs and is never revised after a\n * failed execution.\n *\n * Third-party library authors never call this directly — `defineOp` (SDK)\n * invokes it inside its wrapper; authors only declare the implementation set.\n * @param inputs - the shapes feeding the operation, used to test whether all\n * lie on the BREP chain.\n * @param impls - the operation's implementation set: `mesh`/`brep` presence\n * (function reference or undefined; fixed at defineOp construction).\n * @param requiredCapability - an optional capability the operation declares;\n * a missing capability routes the dispatch.\n * @returns the selected backend path: 'brep' or 'mesh'.\n */\nexport function dispatchPath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown },\n requiredCapability?: BrepCapabilityName,\n): BrepPath {\n const { config } = getBackends()\n\n if (config.mode === 'mesh') {\n if (!impls.mesh) {\n throw new MeshUnsupportedError('E_MESH_UNSUPPORTED: function has no mesh implementation', getCurrentStmt())\n }\n return 'mesh'\n }\n const currentStmt = getCurrentStmt()\n // 引擎能力声明 → 具体能力名集合(族级布尔位 + evolution 名单逐核函数展开)。\n const supported = engineCapabilitySet(config.brepCapabilities)\n\n if (config.mode === 'brep') {\n if (!impls.brep) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt)\n }\n if (!inputs.every(hasBrep)) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt)\n }\n // 能力路由:brep 模式缺能力 → 明确报错,不静默回退\n if (requiredCapability && !supported.has(requiredCapability)) {\n throw new BrepUnsupportedError(\n `E_BREP_UNSUPPORTED: current engine lacks capability '${requiredCapability}' (brepEngineId=${config.brepEngineId ?? '<none>'})`,\n currentStmt,\n )\n }\n return 'brep'\n }\n\n // auto 模式:能力路由(缺能力 → 静态降级走 mesh;brep-only 无 mesh 可降 → 明确报错)\n if (requiredCapability && !supported.has(requiredCapability)) {\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n `E_MESH_UNSUPPORTED: current engine lacks capability '${requiredCapability}' and function has no mesh implementation`,\n currentStmt,\n )\n }\n return 'mesh'\n }\n\n if (impls.brep && inputs.every(hasBrep)) return 'brep'\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n 'E_MESH_UNSUPPORTED: input is not BREP and function has no mesh implementation',\n currentStmt,\n )\n }\n return 'mesh'\n}\n"]}
@@ -32,6 +32,8 @@ export declare const DEFAULT_CDN_BASE = "https://cdn.jsdelivr.net/npm/";
32
32
  export interface BrowserLibMeta {
33
33
  /** `package.json` 的 `faijs.autoLift` 外置字段(D3-autoLift)。 */
34
34
  autoLift?: boolean;
35
+ /** Phase 2.11-②:`package.json` 的 `faijs.naming` 外置字段(库级 provenance 声明)。 */
36
+ naming?: import('../topology/naming/lineage.js').Provenance;
35
37
  }
36
38
  /** `createBrowserLibLoader` 的选项。 */
37
39
  export interface CreateBrowserLibLoaderOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"browser-lib-loader.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/browser-lib-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGxC,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,kCAAkC,CAAA;AAE/D,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,oCAAoC;AACpC,MAAM,WAAW,6BAA6B;IAC5C,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,uEAAuE;IACvE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD;;;;OAIG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B;AAOD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,6BAAkC,GAAG,gBAAgB,CA2EjG"}
1
+ {"version":3,"file":"browser-lib-loader.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/browser-lib-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGxC,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,kCAAkC,CAAA;AAE/D,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,4BAA4B,EAAE,UAAU,CAAA;CACzD;AAED,oCAAoC;AACpC,MAAM,WAAW,6BAA6B;IAC5C,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,uEAAuE;IACvE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD;;;;OAIG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B;AAOD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,6BAAkC,GAAG,gBAAgB,CAiFjG"}
@@ -85,6 +85,8 @@ export function createBrowserLibLoader(opts = {}) {
85
85
  ...(opts.autoLift === undefined ? {} : { autoLift: opts.autoLift }),
86
86
  // 逐库 autoLift 优先于全局:未声明 → undefined → 回落全局 / runtime 推断式。
87
87
  autoLiftFor: (name) => meta[pkgOf(name)]?.autoLift,
88
+ // Phase 2.11-②:逐库 naming(lib-meta.json 的 faijs.naming),未声明 → undefined → blanket 兜底。
89
+ namingFor: (name) => meta[pkgOf(name)]?.naming,
88
90
  },
89
91
  prefetchMeta: async () => {
90
92
  if (!fetchImpl)
@@ -100,8 +102,14 @@ export function createBrowserLibLoader(opts = {}) {
100
102
  return;
101
103
  const pj = (await res.json());
102
104
  const lifted = pj.faijs?.autoLift;
105
+ const naming = pj.faijs?.naming;
106
+ const entry = {};
103
107
  if (typeof lifted === 'boolean')
104
- meta[pkg] = { autoLift: lifted };
108
+ entry.autoLift = lifted;
109
+ if (naming && typeof naming === 'object' && typeof naming.kind === 'string')
110
+ entry.naming = naming;
111
+ if (entry.autoLift !== undefined || entry.naming !== undefined)
112
+ meta[pkg] = entry;
105
113
  }
106
114
  catch {
107
115
  // 网络不可达 / 非法 JSON → 保持未声明,交由 runtime 推断式。
@@ -1 +1 @@
1
- {"version":3,"file":"browser-lib-loader.js","sourceRoot":"","sources":["../../src/cad-runtime/browser-lib-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * browser-lib-loader — 浏览器通用 `LibLoader` 工厂(D3-Browser,§9.4)\n *\n * 与 node 侧 `cliPortsLibLoader`(`node-host/cli.ts`)对称:都实现 `LibLoader`\n * 契约(`loadLib` / `listLibs` / `options.autoLiftFor`),差别只在装载通道——\n * node 用 `import(pkg)` 从 `node_modules` 解析,浏览器用**动态 `import()`** 取 CDN。\n *\n * 两条通路(Q8 定稿的 a/b 混合,共用同一 `CDN_BASE`):\n * - **方案 a(importmap)**:不提供 `versions` 时,用**已解析的包名**做裸 specifier\n * 动态 `import(pkg)`,由页面 `<script type=\"importmap\">` 的 scope\n * (`\"@faicad/\": \"CDN_BASE/*@faicad/\"`)在后端按依赖图取版。零版本表,dev / playground 用。\n * - **方案 b(精确 pin)**:提供 `versions`(`versions.json`)时拼\n * `` `${cdnBase}${pkg}@${version}/+esm` `` 直链,版本精确 pin 到已发布版本,保证\n * 可复现与缓存命中;release 产物用。\n *\n * 别名归一:脚本 specifier 常是短名(demo 的 `.fai.js` 写 `gear-lib-demo` /\n * `sheetmetal`),而 CDN 上是 npm 全名(`@faicad/gear-lib-demo`)。`aliases` 把\n * specifier 映到包名后再装载,与 node 侧 `CLI_SHORT_NAMES` 归一同一职责。\n *\n * `autoLiftFor` 是**同步**回调(`runtime.ts` 在装载后立即取值),所以逐库\n * `faijs.autoLift` 必须**预先**可用:主机从构建期产物 `lib-meta.json`\n * (`scripts/gen-importmap.mjs` 生成)经 `meta` 传入;也可调 `prefetchMeta()`\n * 在网络可达时抓各库 `package.json` 预热(失败静默回落推断式)。\n *\n * 本工厂**不**被 `createBrowserPorts` 默认装配——demo 走源码 alias 的 HMR 路径\n * 必须保持零网络;CDN 装载仅服务「从 npm 消费已发布包」的场景,由主机显式注入。\n */\n\nimport type { LibLoader } from './ports'\nimport type { StdlibNamespace } from '../runtime-state'\n\n/** 默认 CDN base(Q8 定稿:jsDelivr npm 镜像;ESM 取 `+esm`)。 */\nexport const DEFAULT_CDN_BASE = 'https://cdn.jsdelivr.net/npm/'\n\n/** 逐库元数据(与 `lib-meta.json` 键形一致)。 */\nexport interface BrowserLibMeta {\n /** `package.json` 的 `faijs.autoLift` 外置字段(D3-autoLift)。 */\n autoLift?: boolean\n}\n\n/** `createBrowserLibLoader` 的选项。 */\nexport interface CreateBrowserLibLoaderOptions {\n /** CDN base,须以 `/` 结尾(缺省 `DEFAULT_CDN_BASE`)。 */\n cdnBase?: string\n /** 方案 b:精确 pin 的 `packageName → version`(`versions.json`);提供即走直链。 */\n versions?: Record<string, string>\n /** 别名表:脚本 import specifier → npm 包名(如 `gear-lib-demo` → `@faicad/gear-lib-demo`)。 */\n aliases?: Record<string, string>\n /** 允许装载的 **npm 包名**白名单;缺省不限制(生产建议显式给)。 */\n libs?: string[]\n /** 逐库元数据(`lib-meta.json`),喂 `options.autoLiftFor`。 */\n meta?: Record<string, BrowserLibMeta>\n /** 全局 autoLift 缺省(喂 `options.autoLift`);缺省交由 runtime 推断式决定。 */\n autoLift?: boolean\n /** 强制方案 a(即使提供了 `versions` 也用裸 specifier,依赖 importmap)。 */\n forceImportMap?: boolean\n /** 注入的动态 import 实现(测试用);缺省为原生动态 `import()`。 */\n importModule?: (url: string) => Promise<unknown>\n /** 注入的 fetch(`prefetchMeta` 用);缺省全局 `fetch`,无则 `prefetchMeta` 为空操作。 */\n fetchImpl?: typeof fetch\n}\n\n/** 浏览器 `LibLoader`(在契约上附加元数据预热)。 */\nexport interface BrowserLibLoader extends LibLoader {\n /**\n * 抓取已知各库的 `package.json`,把 `faijs.autoLift` 填进内部 meta 缓存。\n * 网络失败静默跳过(保持未声明 → 回落推断式)。在 `execute` 前 await 一次即可。\n * @returns promise resolving when all known libs have been probed.\n */\n prefetchMeta(): Promise<void>\n}\n\n/** 归一 CDN base:保证尾随 `/`,避免拼接出 `.../npm@1.0.0` 这类坏 URL。 */\nfunction withTrailingSlash(base: string): string {\n return base.endsWith('/') ? base : `${base}/`\n}\n\n/**\n * 创建浏览器通用 `LibLoader`。\n *\n * 装载顺序:`name` → `aliases` 归一为 npm 包名 → 白名单校验 → 方案 b 直链(有\n * `versions[pkg]` 且未 `forceImportMap`)或方案 a 裸 specifier → 动态 `import()`;\n * 同一包名并发/重复装载共享同一 in-flight promise(CDN 只取一次)。\n * @param opts - CDN base、版本表 / 别名 / 元数据,以及测试用注入点。\n * @returns 满足 `LibLoader` 契约、并附加 `prefetchMeta()` 的浏览器装载器。\n */\nexport function createBrowserLibLoader(opts: CreateBrowserLibLoaderOptions = {}): BrowserLibLoader {\n const cdnBase = withTrailingSlash(opts.cdnBase ?? DEFAULT_CDN_BASE)\n const aliases: Record<string, string> = { ...(opts.aliases ?? {}) }\n const versions = opts.versions\n const allow = opts.libs ? new Set(opts.libs) : undefined\n const meta: Record<string, BrowserLibMeta> = { ...(opts.meta ?? {}) }\n const importModule =\n opts.importModule ?? ((url: string): Promise<unknown> => import(/* @vite-ignore */ url))\n const fetchImpl = opts.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined)\n\n /** specifier → npm 包名。 */\n const pkgOf = (name: string): string => aliases[name] ?? name\n\n /** 已知 specifier 集合:别名键 ∪ 显式 libs ∪ 版本表键(后两者本身即合法 specifier)。 */\n const specifiers = new Set<string>([\n ...Object.keys(aliases),\n ...(opts.libs ?? []),\n ...Object.keys(versions ?? {}),\n ])\n\n /** 方案 b 的直链;返回 `undefined` 表示走方案 a。 */\n const urlOf = (pkg: string): string | undefined => {\n if (opts.forceImportMap) return undefined\n const v = versions?.[pkg]\n return v ? `${cdnBase}${pkg}@${v}/+esm` : undefined\n }\n\n const pending = new Map<string, Promise<StdlibNamespace>>()\n\n return {\n loadLib: (name: string): Promise<StdlibNamespace> => {\n const pkg = pkgOf(name)\n if (allow && !allow.has(pkg)) {\n return Promise.reject(\n new Error(`package \"${pkg}\" (from specifier \"${name}\") is not in the browser library whitelist`),\n )\n }\n const cached = pending.get(pkg)\n if (cached) return cached\n const url = urlOf(pkg)\n const job = importModule(url ?? pkg).then((mod) => mod as StdlibNamespace)\n pending.set(pkg, job)\n // 装载失败不留毒缓存:清掉后可重试(如网络恢复)。\n job.catch(() => pending.delete(pkg))\n return job\n },\n\n listLibs: () => [...specifiers],\n\n options: {\n ...(opts.autoLift === undefined ? {} : { autoLift: opts.autoLift }),\n // 逐库 autoLift 优先于全局:未声明 → undefined → 回落全局 / runtime 推断式。\n autoLiftFor: (name: string) => meta[pkgOf(name)]?.autoLift,\n },\n\n prefetchMeta: async (): Promise<void> => {\n if (!fetchImpl) return\n const pkgs = new Set<string>([...specifiers].map(pkgOf))\n await Promise.all(\n [...pkgs].map(async (pkg) => {\n if (meta[pkg]) return\n const v = versions?.[pkg]\n try {\n const res = await fetchImpl(`${cdnBase}${pkg}${v ? `@${v}` : ''}/package.json`)\n if (!res.ok) return\n const pj = (await res.json()) as { faijs?: { autoLift?: boolean } }\n const lifted = pj.faijs?.autoLift\n if (typeof lifted === 'boolean') meta[pkg] = { autoLift: lifted }\n } catch {\n // 网络不可达 / 非法 JSON → 保持未声明,交由 runtime 推断式。\n }\n }),\n )\n },\n }\n}\n"]}
1
+ {"version":3,"file":"browser-lib-loader.js","sourceRoot":"","sources":["../../src/cad-runtime/browser-lib-loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * browser-lib-loader — 浏览器通用 `LibLoader` 工厂(D3-Browser,§9.4)\n *\n * 与 node 侧 `cliPortsLibLoader`(`node-host/cli.ts`)对称:都实现 `LibLoader`\n * 契约(`loadLib` / `listLibs` / `options.autoLiftFor`),差别只在装载通道——\n * node 用 `import(pkg)` 从 `node_modules` 解析,浏览器用**动态 `import()`** 取 CDN。\n *\n * 两条通路(Q8 定稿的 a/b 混合,共用同一 `CDN_BASE`):\n * - **方案 a(importmap)**:不提供 `versions` 时,用**已解析的包名**做裸 specifier\n * 动态 `import(pkg)`,由页面 `<script type=\"importmap\">` 的 scope\n * (`\"@faicad/\": \"CDN_BASE/*@faicad/\"`)在后端按依赖图取版。零版本表,dev / playground 用。\n * - **方案 b(精确 pin)**:提供 `versions`(`versions.json`)时拼\n * `` `${cdnBase}${pkg}@${version}/+esm` `` 直链,版本精确 pin 到已发布版本,保证\n * 可复现与缓存命中;release 产物用。\n *\n * 别名归一:脚本 specifier 常是短名(demo 的 `.fai.js` 写 `gear-lib-demo` /\n * `sheetmetal`),而 CDN 上是 npm 全名(`@faicad/gear-lib-demo`)。`aliases` 把\n * specifier 映到包名后再装载,与 node 侧 `CLI_SHORT_NAMES` 归一同一职责。\n *\n * `autoLiftFor` 是**同步**回调(`runtime.ts` 在装载后立即取值),所以逐库\n * `faijs.autoLift` 必须**预先**可用:主机从构建期产物 `lib-meta.json`\n * (`scripts/gen-importmap.mjs` 生成)经 `meta` 传入;也可调 `prefetchMeta()`\n * 在网络可达时抓各库 `package.json` 预热(失败静默回落推断式)。\n *\n * 本工厂**不**被 `createBrowserPorts` 默认装配——demo 走源码 alias 的 HMR 路径\n * 必须保持零网络;CDN 装载仅服务「从 npm 消费已发布包」的场景,由主机显式注入。\n */\n\nimport type { LibLoader } from './ports'\nimport type { StdlibNamespace } from '../runtime-state'\n\n/** 默认 CDN base(Q8 定稿:jsDelivr npm 镜像;ESM 取 `+esm`)。 */\nexport const DEFAULT_CDN_BASE = 'https://cdn.jsdelivr.net/npm/'\n\n/** 逐库元数据(与 `lib-meta.json` 键形一致)。 */\nexport interface BrowserLibMeta {\n /** `package.json` 的 `faijs.autoLift` 外置字段(D3-autoLift)。 */\n autoLift?: boolean\n /** Phase 2.11-②:`package.json` 的 `faijs.naming` 外置字段(库级 provenance 声明)。 */\n naming?: import('../topology/naming/lineage').Provenance\n}\n\n/** `createBrowserLibLoader` 的选项。 */\nexport interface CreateBrowserLibLoaderOptions {\n /** CDN base,须以 `/` 结尾(缺省 `DEFAULT_CDN_BASE`)。 */\n cdnBase?: string\n /** 方案 b:精确 pin 的 `packageName → version`(`versions.json`);提供即走直链。 */\n versions?: Record<string, string>\n /** 别名表:脚本 import specifier → npm 包名(如 `gear-lib-demo` → `@faicad/gear-lib-demo`)。 */\n aliases?: Record<string, string>\n /** 允许装载的 **npm 包名**白名单;缺省不限制(生产建议显式给)。 */\n libs?: string[]\n /** 逐库元数据(`lib-meta.json`),喂 `options.autoLiftFor`。 */\n meta?: Record<string, BrowserLibMeta>\n /** 全局 autoLift 缺省(喂 `options.autoLift`);缺省交由 runtime 推断式决定。 */\n autoLift?: boolean\n /** 强制方案 a(即使提供了 `versions` 也用裸 specifier,依赖 importmap)。 */\n forceImportMap?: boolean\n /** 注入的动态 import 实现(测试用);缺省为原生动态 `import()`。 */\n importModule?: (url: string) => Promise<unknown>\n /** 注入的 fetch(`prefetchMeta` 用);缺省全局 `fetch`,无则 `prefetchMeta` 为空操作。 */\n fetchImpl?: typeof fetch\n}\n\n/** 浏览器 `LibLoader`(在契约上附加元数据预热)。 */\nexport interface BrowserLibLoader extends LibLoader {\n /**\n * 抓取已知各库的 `package.json`,把 `faijs.autoLift` 填进内部 meta 缓存。\n * 网络失败静默跳过(保持未声明 → 回落推断式)。在 `execute` 前 await 一次即可。\n * @returns promise resolving when all known libs have been probed.\n */\n prefetchMeta(): Promise<void>\n}\n\n/** 归一 CDN base:保证尾随 `/`,避免拼接出 `.../npm@1.0.0` 这类坏 URL。 */\nfunction withTrailingSlash(base: string): string {\n return base.endsWith('/') ? base : `${base}/`\n}\n\n/**\n * 创建浏览器通用 `LibLoader`。\n *\n * 装载顺序:`name` → `aliases` 归一为 npm 包名 → 白名单校验 → 方案 b 直链(有\n * `versions[pkg]` 且未 `forceImportMap`)或方案 a 裸 specifier → 动态 `import()`;\n * 同一包名并发/重复装载共享同一 in-flight promise(CDN 只取一次)。\n * @param opts - CDN base、版本表 / 别名 / 元数据,以及测试用注入点。\n * @returns 满足 `LibLoader` 契约、并附加 `prefetchMeta()` 的浏览器装载器。\n */\nexport function createBrowserLibLoader(opts: CreateBrowserLibLoaderOptions = {}): BrowserLibLoader {\n const cdnBase = withTrailingSlash(opts.cdnBase ?? DEFAULT_CDN_BASE)\n const aliases: Record<string, string> = { ...(opts.aliases ?? {}) }\n const versions = opts.versions\n const allow = opts.libs ? new Set(opts.libs) : undefined\n const meta: Record<string, BrowserLibMeta> = { ...(opts.meta ?? {}) }\n const importModule =\n opts.importModule ?? ((url: string): Promise<unknown> => import(/* @vite-ignore */ url))\n const fetchImpl = opts.fetchImpl ?? (typeof fetch !== 'undefined' ? fetch : undefined)\n\n /** specifier → npm 包名。 */\n const pkgOf = (name: string): string => aliases[name] ?? name\n\n /** 已知 specifier 集合:别名键 ∪ 显式 libs ∪ 版本表键(后两者本身即合法 specifier)。 */\n const specifiers = new Set<string>([\n ...Object.keys(aliases),\n ...(opts.libs ?? []),\n ...Object.keys(versions ?? {}),\n ])\n\n /** 方案 b 的直链;返回 `undefined` 表示走方案 a。 */\n const urlOf = (pkg: string): string | undefined => {\n if (opts.forceImportMap) return undefined\n const v = versions?.[pkg]\n return v ? `${cdnBase}${pkg}@${v}/+esm` : undefined\n }\n\n const pending = new Map<string, Promise<StdlibNamespace>>()\n\n return {\n loadLib: (name: string): Promise<StdlibNamespace> => {\n const pkg = pkgOf(name)\n if (allow && !allow.has(pkg)) {\n return Promise.reject(\n new Error(`package \"${pkg}\" (from specifier \"${name}\") is not in the browser library whitelist`),\n )\n }\n const cached = pending.get(pkg)\n if (cached) return cached\n const url = urlOf(pkg)\n const job = importModule(url ?? pkg).then((mod) => mod as StdlibNamespace)\n pending.set(pkg, job)\n // 装载失败不留毒缓存:清掉后可重试(如网络恢复)。\n job.catch(() => pending.delete(pkg))\n return job\n },\n\n listLibs: () => [...specifiers],\n\n options: {\n ...(opts.autoLift === undefined ? {} : { autoLift: opts.autoLift }),\n // 逐库 autoLift 优先于全局:未声明 → undefined → 回落全局 / runtime 推断式。\n autoLiftFor: (name: string) => meta[pkgOf(name)]?.autoLift,\n // Phase 2.11-②:逐库 naming(lib-meta.json 的 faijs.naming),未声明 → undefined → blanket 兜底。\n namingFor: (name: string) => meta[pkgOf(name)]?.naming,\n },\n\n prefetchMeta: async (): Promise<void> => {\n if (!fetchImpl) return\n const pkgs = new Set<string>([...specifiers].map(pkgOf))\n await Promise.all(\n [...pkgs].map(async (pkg) => {\n if (meta[pkg]) return\n const v = versions?.[pkg]\n try {\n const res = await fetchImpl(`${cdnBase}${pkg}${v ? `@${v}` : ''}/package.json`)\n if (!res.ok) return\n const pj = (await res.json()) as { faijs?: { autoLift?: boolean; naming?: import('../topology/naming/lineage').Provenance } }\n const lifted = pj.faijs?.autoLift\n const naming = pj.faijs?.naming\n const entry: BrowserLibMeta = {}\n if (typeof lifted === 'boolean') entry.autoLift = lifted\n if (naming && typeof naming === 'object' && typeof naming.kind === 'string') entry.naming = naming\n if (entry.autoLift !== undefined || entry.naming !== undefined) meta[pkg] = entry\n } catch {\n // 网络不可达 / 非法 JSON → 保持未声明,交由 runtime 推断式。\n }\n }),\n )\n },\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"direct-executor.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/direct-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"direct-executor.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/direct-executor.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ import { parse as acornParse } from 'acorn';
25
25
  import { asPartName } from '../identity.js';
26
26
  import { ParseError } from '../lang/parse-error.js';
27
27
  import { setCurrentStmt, setKeepSink, setName, nameOf, getBackends, takePendingAssemblyTransforms, takePendingAssemblyKinematics } from '../runtime-state.js';
28
+ import { runtimeLineage } from '../topology/naming/lineage.js';
28
29
  import { ExecutionLimitError } from './execution-limit-error.js';
29
30
  import { assertSecure } from '../lang/security-scanner.js';
30
31
  import { getSlot, ensureSlot, brepOf, isShape } from '../shape.js';
@@ -308,6 +309,11 @@ export class DirectExecutor {
308
309
  }
309
310
  // ── 主流程 ──
310
311
  async runCode(code, opts, preParsedUnits) {
312
+ // §1.4/1.5 lineage: a fresh program execution owns a fresh blood-line graph.
313
+ // Clearing here (not in execute/append/update individually) keeps every
314
+ // runCode — including append/update replays of the full code — self-contained,
315
+ // so N3 never misfires on an edited statement from a prior run.
316
+ runtimeLineage.clear();
311
317
  // import 预置(§4.5:顶层 import 行不执行,绑定值先入 ctx),随后参数预置可覆盖
312
318
  for (const [k, v] of Object.entries(opts?.imports ?? {}))
313
319
  this.ctx[k] = v;
@@ -373,8 +379,10 @@ export class DirectExecutor {
373
379
  this.setSolidHook?.(asPartName(key), bslot.solid);
374
380
  if (bslot?.faceEvolution)
375
381
  this.setFaceEvolutionHook?.(asPartName(key), bslot.faceEvolution);
376
- if (bslot?.roleTable)
377
- this.setRoleTableHook?.(asPartName(key), bslot.roleTable);
382
+ // 1.10 前置③:roleTable 权威落点在血缘图旁挂(part 键)。
383
+ const btable = runtimeLineage.tableOfPart(asPartName(key));
384
+ if (btable)
385
+ this.setRoleTableHook?.(asPartName(key), btable);
378
386
  }
379
387
  }
380
388
  }
@@ -393,8 +401,10 @@ export class DirectExecutor {
393
401
  this.setSolidHook?.(asPartName(w), slot.solid);
394
402
  if (slot?.faceEvolution)
395
403
  this.setFaceEvolutionHook?.(asPartName(w), slot.faceEvolution);
396
- if (slot?.roleTable)
397
- this.setRoleTableHook?.(asPartName(w), slot.roleTable);
404
+ // 1.10 前置③:roleTable 权威落点在血缘图旁挂(part 键),slot 字段已删。
405
+ const rtable = runtimeLineage.tableOfPart(asPartName(w));
406
+ if (rtable)
407
+ this.setRoleTableHook?.(asPartName(w), rtable);
398
408
  }
399
409
  }
400
410
  // T3/T4: Assembly transform propagation — same semantics as