@faicad/faijs 0.29.3 → 0.30.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. package/NOTICE +6 -5
  2. package/dist/api/api-namespace.d.ts +1 -1
  3. package/dist/api/api-namespace.d.ts.map +1 -1
  4. package/dist/api/api-namespace.js +53 -1
  5. package/dist/api/api-namespace.js.map +1 -1
  6. package/dist/api/appearance.d.ts +136 -0
  7. package/dist/api/appearance.d.ts.map +1 -0
  8. package/dist/api/appearance.js +228 -0
  9. package/dist/api/appearance.js.map +1 -0
  10. package/dist/api/assembly/entities.d.ts +1 -1
  11. package/dist/api/assembly/entities.js +1 -1
  12. package/dist/api/assembly/entities.js.map +1 -1
  13. package/dist/api/assembly/index.d.ts +1 -1
  14. package/dist/api/assembly/index.js +1 -1
  15. package/dist/api/assembly/index.js.map +1 -1
  16. package/dist/api/assembly/joints.d.ts +33 -15
  17. package/dist/api/assembly/joints.d.ts.map +1 -1
  18. package/dist/api/assembly/joints.js +31 -13
  19. package/dist/api/assembly/joints.js.map +1 -1
  20. package/dist/api/assembly/preview.d.ts +1 -1
  21. package/dist/api/assembly/preview.js +1 -1
  22. package/dist/api/assembly/preview.js.map +1 -1
  23. package/dist/api/assembly/solve.d.ts +1 -1
  24. package/dist/api/assembly/solve.js +1 -1
  25. package/dist/api/assembly/solve.js.map +1 -1
  26. package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
  27. package/dist/api/assembly/solvers/assembly-tree.js +1 -1
  28. package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
  29. package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
  30. package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
  31. package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
  32. package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
  33. package/dist/api/assembly/solvers/global-solver.js +3 -4
  34. package/dist/api/assembly/solvers/global-solver.js.map +1 -1
  35. package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
  36. package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
  37. package/dist/api/assembly/solvers/linalg.d.ts +2 -2
  38. package/dist/api/assembly/solvers/linalg.js +2 -2
  39. package/dist/api/assembly/solvers/linalg.js.map +1 -1
  40. package/dist/api/assembly/solvers/types.d.ts +2 -5
  41. package/dist/api/assembly/solvers/types.d.ts.map +1 -1
  42. package/dist/api/assembly/solvers/types.js +1 -4
  43. package/dist/api/assembly/solvers/types.js.map +1 -1
  44. package/dist/api/boolean.d.ts.map +1 -1
  45. package/dist/api/boolean.js +7 -6
  46. package/dist/api/boolean.js.map +1 -1
  47. package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
  48. package/dist/api/brep-mirror/booleanFns.js +5 -5
  49. package/dist/api/brep-mirror/booleanFns.js.map +1 -1
  50. package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
  51. package/dist/api/brep-mirror/compoundFns.js +4 -4
  52. package/dist/api/brep-mirror/compoundFns.js.map +1 -1
  53. package/dist/api/brep-mirror/healingFns.d.ts +4 -4
  54. package/dist/api/brep-mirror/healingFns.js +4 -4
  55. package/dist/api/brep-mirror/healingFns.js.map +1 -1
  56. package/dist/api/brep-mirror/hullFns.d.ts +2 -2
  57. package/dist/api/brep-mirror/hullFns.js +2 -2
  58. package/dist/api/brep-mirror/hullFns.js.map +1 -1
  59. package/dist/api/brep-mirror/patternFns.d.ts +5 -5
  60. package/dist/api/brep-mirror/patternFns.js +10 -10
  61. package/dist/api/brep-mirror/patternFns.js.map +1 -1
  62. package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
  63. package/dist/api/brep-mirror/primitiveFns.js +4 -4
  64. package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
  65. package/dist/api/brep-mirror/roofFns.d.ts +3 -3
  66. package/dist/api/brep-mirror/roofFns.js +7 -7
  67. package/dist/api/brep-mirror/roofFns.js.map +1 -1
  68. package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
  69. package/dist/api/brep-mirror/sweepFns.js +14 -14
  70. package/dist/api/brep-mirror/sweepFns.js.map +1 -1
  71. package/dist/api/brep-mirror/threadFns.d.ts +1 -1
  72. package/dist/api/brep-mirror/threadFns.js +1 -1
  73. package/dist/api/brep-mirror/threadFns.js.map +1 -1
  74. package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
  75. package/dist/api/brep-mirror/topologyFns.js +8 -8
  76. package/dist/api/brep-mirror/topologyFns.js.map +1 -1
  77. package/dist/api/brep-operations/booleanFns.d.ts +40 -0
  78. package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
  79. package/dist/api/brep-operations/booleanFns.js +104 -0
  80. package/dist/api/brep-operations/booleanFns.js.map +1 -0
  81. package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
  82. package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
  83. package/dist/api/brep-operations/brepHelpers.js +131 -0
  84. package/dist/api/brep-operations/brepHelpers.js.map +1 -0
  85. package/dist/api/brep-operations/compoundFns.d.ts +46 -0
  86. package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
  87. package/dist/api/brep-operations/compoundFns.js +299 -0
  88. package/dist/api/brep-operations/compoundFns.js.map +1 -0
  89. package/dist/api/brep-operations/healingFns.d.ts +78 -0
  90. package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
  91. package/dist/api/brep-operations/healingFns.js +294 -0
  92. package/dist/api/brep-operations/healingFns.js.map +1 -0
  93. package/dist/api/brep-operations/hullFns.d.ts +20 -0
  94. package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
  95. package/dist/api/brep-operations/hullFns.js +46 -0
  96. package/dist/api/brep-operations/hullFns.js.map +1 -0
  97. package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
  98. package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
  99. package/dist/api/brep-operations/joinery-brep.js +463 -0
  100. package/dist/api/brep-operations/joinery-brep.js.map +1 -0
  101. package/dist/api/brep-operations/patternFns.d.ts +43 -0
  102. package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
  103. package/dist/api/brep-operations/patternFns.js +178 -0
  104. package/dist/api/brep-operations/patternFns.js.map +1 -0
  105. package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
  106. package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
  107. package/dist/api/brep-operations/primitiveFns.js +104 -0
  108. package/dist/api/brep-operations/primitiveFns.js.map +1 -0
  109. package/dist/api/brep-operations/roofFns.d.ts +24 -0
  110. package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
  111. package/dist/api/brep-operations/roofFns.js +229 -0
  112. package/dist/api/brep-operations/roofFns.js.map +1 -0
  113. package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
  114. package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
  115. package/dist/api/brep-operations/straightSkeleton.js +431 -0
  116. package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
  117. package/dist/api/brep-operations/sweepFns.d.ts +60 -0
  118. package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
  119. package/dist/api/brep-operations/sweepFns.js +323 -0
  120. package/dist/api/brep-operations/sweepFns.js.map +1 -0
  121. package/dist/api/brep-operations/threadFns.d.ts +83 -0
  122. package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
  123. package/dist/api/brep-operations/threadFns.js +138 -0
  124. package/dist/api/brep-operations/threadFns.js.map +1 -0
  125. package/dist/api/brep-operations/topologyFns.d.ts +90 -0
  126. package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
  127. package/dist/api/brep-operations/topologyFns.js +276 -0
  128. package/dist/api/brep-operations/topologyFns.js.map +1 -0
  129. package/dist/api/brep-topology.d.ts +1 -1
  130. package/dist/api/brep-topology.d.ts.map +1 -1
  131. package/dist/api/brep-topology.js +1 -1
  132. package/dist/api/brep-topology.js.map +1 -1
  133. package/dist/api/brepjs-compat/index.d.ts +1 -1
  134. package/dist/api/brepjs-compat/index.js +3 -3
  135. package/dist/api/brepjs-compat/index.js.map +1 -1
  136. package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
  137. package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
  138. package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
  139. package/dist/api/curve-sketch/index.d.ts +235 -0
  140. package/dist/api/curve-sketch/index.d.ts.map +1 -0
  141. package/dist/api/curve-sketch/index.js +487 -0
  142. package/dist/api/curve-sketch/index.js.map +1 -0
  143. package/dist/api/engrave.d.ts.map +1 -1
  144. package/dist/api/engrave.js +3 -2
  145. package/dist/api/engrave.js.map +1 -1
  146. package/dist/api/export-brep.d.ts +41 -0
  147. package/dist/api/export-brep.d.ts.map +1 -0
  148. package/dist/api/export-brep.js +58 -0
  149. package/dist/api/export-brep.js.map +1 -0
  150. package/dist/api/export-stl.d.ts +50 -0
  151. package/dist/api/export-stl.d.ts.map +1 -0
  152. package/dist/api/export-stl.js +99 -0
  153. package/dist/api/export-stl.js.map +1 -0
  154. package/dist/api/extrude.d.ts +8 -11
  155. package/dist/api/extrude.d.ts.map +1 -1
  156. package/dist/api/extrude.js +11 -14
  157. package/dist/api/extrude.js.map +1 -1
  158. package/dist/api/fillet-variable.d.ts +2 -2
  159. package/dist/api/fillet-variable.js +2 -2
  160. package/dist/api/fillet-variable.js.map +1 -1
  161. package/dist/api/fillet.d.ts +2 -4
  162. package/dist/api/fillet.d.ts.map +1 -1
  163. package/dist/api/fillet.js +2 -4
  164. package/dist/api/fillet.js.map +1 -1
  165. package/dist/api/generated/2d.d.ts +4 -0
  166. package/dist/api/generated/2d.d.ts.map +1 -1
  167. package/dist/api/generated/2d.js +4 -0
  168. package/dist/api/generated/2d.js.map +1 -1
  169. package/dist/api/generated/core.d.ts +4 -0
  170. package/dist/api/generated/core.d.ts.map +1 -1
  171. package/dist/api/generated/core.js +4 -0
  172. package/dist/api/generated/core.js.map +1 -1
  173. package/dist/api/generated/gear.d.ts +4 -0
  174. package/dist/api/generated/gear.d.ts.map +1 -1
  175. package/dist/api/generated/gear.js +4 -0
  176. package/dist/api/generated/gear.js.map +1 -1
  177. package/dist/api/generated/io.d.ts +4 -0
  178. package/dist/api/generated/io.d.ts.map +1 -1
  179. package/dist/api/generated/io.js +4 -0
  180. package/dist/api/generated/io.js.map +1 -1
  181. package/dist/api/generated/kernel.d.ts +4 -0
  182. package/dist/api/generated/kernel.d.ts.map +1 -1
  183. package/dist/api/generated/kernel.js +4 -0
  184. package/dist/api/generated/kernel.js.map +1 -1
  185. package/dist/api/generated/measurement.d.ts +21 -21
  186. package/dist/api/generated/measurement.d.ts.map +1 -1
  187. package/dist/api/generated/measurement.js +25 -21
  188. package/dist/api/generated/measurement.js.map +1 -1
  189. package/dist/api/generated/ns.d.ts +4 -0
  190. package/dist/api/generated/ns.d.ts.map +1 -1
  191. package/dist/api/generated/ns.js +4 -0
  192. package/dist/api/generated/ns.js.map +1 -1
  193. package/dist/api/generated/operations.d.ts +32 -32
  194. package/dist/api/generated/operations.d.ts.map +1 -1
  195. package/dist/api/generated/operations.js +52 -48
  196. package/dist/api/generated/operations.js.map +1 -1
  197. package/dist/api/generated/projection.d.ts +4 -0
  198. package/dist/api/generated/projection.d.ts.map +1 -1
  199. package/dist/api/generated/projection.js +4 -0
  200. package/dist/api/generated/projection.js.map +1 -1
  201. package/dist/api/generated/query.d.ts +4 -0
  202. package/dist/api/generated/query.d.ts.map +1 -1
  203. package/dist/api/generated/query.js +4 -0
  204. package/dist/api/generated/query.js.map +1 -1
  205. package/dist/api/generated/sketching.d.ts +2 -2
  206. package/dist/api/generated/sketching.d.ts.map +1 -1
  207. package/dist/api/generated/sketching.js +7 -3
  208. package/dist/api/generated/sketching.js.map +1 -1
  209. package/dist/api/generated/text.d.ts +4 -0
  210. package/dist/api/generated/text.d.ts.map +1 -1
  211. package/dist/api/generated/text.js +4 -0
  212. package/dist/api/generated/text.js.map +1 -1
  213. package/dist/api/generated/topology.d.ts +45 -45
  214. package/dist/api/generated/topology.d.ts.map +1 -1
  215. package/dist/api/generated/topology.js +67 -63
  216. package/dist/api/generated/topology.js.map +1 -1
  217. package/dist/api/generated/view.d.ts +4 -0
  218. package/dist/api/generated/view.d.ts.map +1 -1
  219. package/dist/api/generated/view.js +4 -0
  220. package/dist/api/generated/view.js.map +1 -1
  221. package/dist/api/geom-types/constants.d.ts +11 -0
  222. package/dist/api/geom-types/constants.d.ts.map +1 -0
  223. package/dist/api/geom-types/constants.js +11 -0
  224. package/dist/api/geom-types/constants.js.map +1 -0
  225. package/dist/api/geom-types/index.d.ts +21 -0
  226. package/dist/api/geom-types/index.d.ts.map +1 -0
  227. package/dist/api/geom-types/index.js +22 -0
  228. package/dist/api/geom-types/index.js.map +1 -0
  229. package/dist/api/geom-types/planeOps.d.ts +98 -0
  230. package/dist/api/geom-types/planeOps.d.ts.map +1 -0
  231. package/dist/api/geom-types/planeOps.js +170 -0
  232. package/dist/api/geom-types/planeOps.js.map +1 -0
  233. package/dist/api/geom-types/planeTypes.d.ts +24 -0
  234. package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
  235. package/dist/api/geom-types/planeTypes.js +8 -0
  236. package/dist/api/geom-types/planeTypes.js.map +1 -0
  237. package/dist/api/geom-types/types.d.ts +64 -0
  238. package/dist/api/geom-types/types.d.ts.map +1 -0
  239. package/dist/api/geom-types/types.js +48 -0
  240. package/dist/api/geom-types/types.js.map +1 -0
  241. package/dist/api/geom-types/vecOps.d.ts +124 -0
  242. package/dist/api/geom-types/vecOps.d.ts.map +1 -0
  243. package/dist/api/geom-types/vecOps.js +202 -0
  244. package/dist/api/geom-types/vecOps.js.map +1 -0
  245. package/dist/api/geom.d.ts.map +1 -1
  246. package/dist/api/geom.js +6 -5
  247. package/dist/api/geom.js.map +1 -1
  248. package/dist/api/half-space.d.ts +56 -0
  249. package/dist/api/half-space.d.ts.map +1 -0
  250. package/dist/api/half-space.js +82 -0
  251. package/dist/api/half-space.js.map +1 -0
  252. package/dist/api/helix.d.ts +10 -1
  253. package/dist/api/helix.d.ts.map +1 -1
  254. package/dist/api/helix.js +19 -3
  255. package/dist/api/helix.js.map +1 -1
  256. package/dist/api/import-step.d.ts.map +1 -1
  257. package/dist/api/import-step.js +28 -0
  258. package/dist/api/import-step.js.map +1 -1
  259. package/dist/api/index.d.ts +19 -6
  260. package/dist/api/index.d.ts.map +1 -1
  261. package/dist/api/index.js +31 -8
  262. package/dist/api/index.js.map +1 -1
  263. package/dist/api/internal/compat-op.d.ts +4 -30
  264. package/dist/api/internal/compat-op.d.ts.map +1 -1
  265. package/dist/api/internal/compat-op.js +10 -42
  266. package/dist/api/internal/compat-op.js.map +1 -1
  267. package/dist/api/internal/compat-projection.d.ts +5 -5
  268. package/dist/api/internal/compat-projection.js +5 -5
  269. package/dist/api/internal/compat-projection.js.map +1 -1
  270. package/dist/api/internal/dual-form-args.d.ts +0 -2
  271. package/dist/api/internal/dual-form-args.d.ts.map +1 -1
  272. package/dist/api/internal/dual-form-args.js +1 -3
  273. package/dist/api/internal/dual-form-args.js.map +1 -1
  274. package/dist/api/internal/l3-bridge.d.ts +5 -37
  275. package/dist/api/internal/l3-bridge.d.ts.map +1 -1
  276. package/dist/api/internal/l3-bridge.js +7 -76
  277. package/dist/api/internal/l3-bridge.js.map +1 -1
  278. package/dist/api/internal/profile-wire.d.ts +1 -1
  279. package/dist/api/internal/profile-wire.js +1 -1
  280. package/dist/api/internal/profile-wire.js.map +1 -1
  281. package/dist/api/internal/result-unwrap.d.ts +4 -6
  282. package/dist/api/internal/result-unwrap.d.ts.map +1 -1
  283. package/dist/api/internal/result-unwrap.js +4 -6
  284. package/dist/api/internal/result-unwrap.js.map +1 -1
  285. package/dist/api/knurl.d.ts.map +1 -1
  286. package/dist/api/knurl.js +5 -3
  287. package/dist/api/knurl.js.map +1 -1
  288. package/dist/api/loft.d.ts +2 -2
  289. package/dist/api/loft.d.ts.map +1 -1
  290. package/dist/api/loft.js +2 -2
  291. package/dist/api/loft.js.map +1 -1
  292. package/dist/api/measurement/index.d.ts +3 -3
  293. package/dist/api/measurement/index.js +3 -3
  294. package/dist/api/measurement/index.js.map +1 -1
  295. package/dist/api/meta.d.ts +91 -0
  296. package/dist/api/meta.d.ts.map +1 -0
  297. package/dist/api/meta.js +97 -0
  298. package/dist/api/meta.js.map +1 -0
  299. package/dist/api/offset2d.d.ts +49 -0
  300. package/dist/api/offset2d.d.ts.map +1 -0
  301. package/dist/api/offset2d.js +86 -0
  302. package/dist/api/offset2d.js.map +1 -0
  303. package/dist/api/pattern.js +3 -3
  304. package/dist/api/pattern.js.map +1 -1
  305. package/dist/api/primitives.d.ts.map +1 -1
  306. package/dist/api/primitives.js +124 -8
  307. package/dist/api/primitives.js.map +1 -1
  308. package/dist/api/replicate.d.ts +2 -2
  309. package/dist/api/replicate.d.ts.map +1 -1
  310. package/dist/api/replicate.js +12 -12
  311. package/dist/api/replicate.js.map +1 -1
  312. package/dist/api/result.d.ts +1 -1
  313. package/dist/api/result.js +1 -1
  314. package/dist/api/result.js.map +1 -1
  315. package/dist/api/revolve.d.ts +2 -2
  316. package/dist/api/revolve.js +3 -3
  317. package/dist/api/revolve.js.map +1 -1
  318. package/dist/api/screw.d.ts +1 -1
  319. package/dist/api/screw.d.ts.map +1 -1
  320. package/dist/api/screw.js +5 -4
  321. package/dist/api/screw.js.map +1 -1
  322. package/dist/api/sdf.d.ts.map +1 -1
  323. package/dist/api/sdf.js +3 -2
  324. package/dist/api/sdf.js.map +1 -1
  325. package/dist/api/shape-type/index.d.ts +141 -0
  326. package/dist/api/shape-type/index.d.ts.map +1 -0
  327. package/dist/api/shape-type/index.js +182 -0
  328. package/dist/api/shape-type/index.js.map +1 -0
  329. package/dist/api/shell.d.ts +2 -2
  330. package/dist/api/shell.js +2 -2
  331. package/dist/api/shell.js.map +1 -1
  332. package/dist/api/solid-from-faces.d.ts +45 -0
  333. package/dist/api/solid-from-faces.d.ts.map +1 -0
  334. package/dist/api/solid-from-faces.js +72 -0
  335. package/dist/api/solid-from-faces.js.map +1 -0
  336. package/dist/api/solid-offset/index.d.ts +67 -0
  337. package/dist/api/solid-offset/index.d.ts.map +1 -0
  338. package/dist/api/solid-offset/index.js +132 -0
  339. package/dist/api/solid-offset/index.js.map +1 -0
  340. package/dist/api/surface/arg-spec.d.ts +35 -33
  341. package/dist/api/surface/arg-spec.d.ts.map +1 -1
  342. package/dist/api/surface/arg-spec.js +222 -224
  343. package/dist/api/surface/arg-spec.js.map +1 -1
  344. package/dist/api/surface-face/index.d.ts +104 -0
  345. package/dist/api/surface-face/index.d.ts.map +1 -0
  346. package/dist/api/surface-face/index.js +217 -0
  347. package/dist/api/surface-face/index.js.map +1 -0
  348. package/dist/api/surface.d.ts +44 -0
  349. package/dist/api/surface.d.ts.map +1 -0
  350. package/dist/api/surface.js +66 -0
  351. package/dist/api/surface.js.map +1 -0
  352. package/dist/api/sweep.d.ts +59 -9
  353. package/dist/api/sweep.d.ts.map +1 -1
  354. package/dist/api/sweep.js +11 -6
  355. package/dist/api/sweep.js.map +1 -1
  356. package/dist/api/thicken.d.ts +1 -1
  357. package/dist/api/thicken.js +1 -1
  358. package/dist/api/thicken.js.map +1 -1
  359. package/dist/api/transform.d.ts +5 -5
  360. package/dist/api/transform.d.ts.map +1 -1
  361. package/dist/api/transform.js +11 -10
  362. package/dist/api/transform.js.map +1 -1
  363. package/dist/api/view/cameraFns.d.ts +1 -1
  364. package/dist/api/view/cameraFns.d.ts.map +1 -1
  365. package/dist/api/view/cameraFns.js +1 -1
  366. package/dist/api/view/cameraFns.js.map +1 -1
  367. package/dist/api/view/index.d.ts +0 -2
  368. package/dist/api/view/index.d.ts.map +1 -1
  369. package/dist/api/view/index.js +0 -2
  370. package/dist/api/view/index.js.map +1 -1
  371. package/dist/api/view/projectionPlanes.d.ts +1 -1
  372. package/dist/api/view/projectionPlanes.d.ts.map +1 -1
  373. package/dist/api/view/projectionPlanes.js.map +1 -1
  374. package/dist/api/view/view-camera.d.ts +7 -9
  375. package/dist/api/view/view-camera.d.ts.map +1 -1
  376. package/dist/api/view/view-camera.js +4 -6
  377. package/dist/api/view/view-camera.js.map +1 -1
  378. package/dist/api/view/view-projection.d.ts +0 -2
  379. package/dist/api/view/view-projection.d.ts.map +1 -1
  380. package/dist/api/view/view-projection.js +0 -2
  381. package/dist/api/view/view-projection.js.map +1 -1
  382. package/dist/api/view/view-sheet.d.ts +0 -2
  383. package/dist/api/view/view-sheet.d.ts.map +1 -1
  384. package/dist/api/view/view-sheet.js +0 -2
  385. package/dist/api/view/view-sheet.js.map +1 -1
  386. package/dist/api/view-export/index.d.ts +97 -0
  387. package/dist/api/view-export/index.d.ts.map +1 -0
  388. package/dist/api/view-export/index.js +118 -0
  389. package/dist/api/view-export/index.js.map +1 -0
  390. package/dist/brep/brep-ops.d.ts +89 -1
  391. package/dist/brep/brep-ops.d.ts.map +1 -1
  392. package/dist/brep/brep-ops.js +204 -13
  393. package/dist/brep/brep-ops.js.map +1 -1
  394. package/dist/brep/brep-topology.d.ts +20 -0
  395. package/dist/brep/brep-topology.d.ts.map +1 -1
  396. package/dist/brep/brep-topology.js +46 -0
  397. package/dist/brep/brep-topology.js.map +1 -1
  398. package/dist/brep/engine/adapters/occt.d.ts +1 -1
  399. package/dist/brep/engine/adapters/occt.js +8 -8
  400. package/dist/brep/engine/adapters/occt.js.map +1 -1
  401. package/dist/brep/engine/primitives.d.ts +2 -3
  402. package/dist/brep/engine/primitives.d.ts.map +1 -1
  403. package/dist/brep/engine/primitives.js +1 -2
  404. package/dist/brep/engine/primitives.js.map +1 -1
  405. package/dist/brep/engine/registry.d.ts +1 -1
  406. package/dist/brep/engine/registry.js +1 -1
  407. package/dist/brep/engine/registry.js.map +1 -1
  408. package/dist/brep/engine/types.d.ts +2 -2
  409. package/dist/brep/engine/types.js.map +1 -1
  410. package/dist/brep/export/export-model.d.ts +40 -0
  411. package/dist/brep/export/export-model.d.ts.map +1 -1
  412. package/dist/brep/export/export-model.js +268 -25
  413. package/dist/brep/export/export-model.js.map +1 -1
  414. package/dist/brep/export/step-meta-header.d.ts +102 -0
  415. package/dist/brep/export/step-meta-header.d.ts.map +1 -0
  416. package/dist/brep/export/step-meta-header.js +225 -0
  417. package/dist/brep/export/step-meta-header.js.map +1 -0
  418. package/dist/brep/export/step.d.ts +5 -1
  419. package/dist/brep/export/step.d.ts.map +1 -1
  420. package/dist/brep/export/step.js +11 -2
  421. package/dist/brep/export/step.js.map +1 -1
  422. package/dist/brep/handle-bridge.d.ts +2 -2
  423. package/dist/brep/handle-bridge.js +2 -2
  424. package/dist/brep/handle-bridge.js.map +1 -1
  425. package/dist/brep/index.d.ts +6 -3
  426. package/dist/brep/index.d.ts.map +1 -1
  427. package/dist/brep/index.js +6 -3
  428. package/dist/brep/index.js.map +1 -1
  429. package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
  430. package/dist/brepkit-kernel/brepkitKernel.js +2 -2
  431. package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
  432. package/dist/browser.d.ts +2 -2
  433. package/dist/browser.d.ts.map +1 -1
  434. package/dist/browser.js +5 -4
  435. package/dist/browser.js.map +1 -1
  436. package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
  437. package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
  438. package/dist/cad-runtime/admit-compat-lib.js +3 -9
  439. package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
  440. package/dist/cad-runtime/backend-dispatch.js +12 -3
  441. package/dist/cad-runtime/backend-dispatch.js.map +1 -1
  442. package/dist/cad-runtime/direct-executor.d.ts +6 -3
  443. package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
  444. package/dist/cad-runtime/direct-executor.js +31 -9
  445. package/dist/cad-runtime/direct-executor.js.map +1 -1
  446. package/dist/cad-runtime/interp/env.d.ts +1 -1
  447. package/dist/cad-runtime/interp/env.js.map +1 -1
  448. package/dist/cad-runtime/lib-id.d.ts +0 -2
  449. package/dist/cad-runtime/lib-id.d.ts.map +1 -1
  450. package/dist/cad-runtime/lib-id.js +0 -2
  451. package/dist/cad-runtime/lib-id.js.map +1 -1
  452. package/dist/cad-runtime/live-shapes.d.ts +3 -5
  453. package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
  454. package/dist/cad-runtime/live-shapes.js +8 -10
  455. package/dist/cad-runtime/live-shapes.js.map +1 -1
  456. package/dist/cad-runtime/ports.d.ts +3 -3
  457. package/dist/cad-runtime/ports.js.map +1 -1
  458. package/dist/cad-runtime/runtime.d.ts +21 -7
  459. package/dist/cad-runtime/runtime.d.ts.map +1 -1
  460. package/dist/cad-runtime/runtime.js +45 -6
  461. package/dist/cad-runtime/runtime.js.map +1 -1
  462. package/dist/define-op.d.ts +4 -3
  463. package/dist/define-op.d.ts.map +1 -1
  464. package/dist/define-op.js +65 -3
  465. package/dist/define-op.js.map +1 -1
  466. package/dist/geometry2d/bridge/plane.d.ts +1 -1
  467. package/dist/geometry2d/bridge/plane.js +1 -1
  468. package/dist/geometry2d/bridge/plane.js.map +1 -1
  469. package/dist/geometry2d/curve2d.d.ts +1 -1
  470. package/dist/geometry2d/curve2d.js +1 -1
  471. package/dist/geometry2d/curve2d.js.map +1 -1
  472. package/dist/index.d.ts +1 -1
  473. package/dist/index.d.ts.map +1 -1
  474. package/dist/index.js +10 -4
  475. package/dist/index.js.map +1 -1
  476. package/dist/io/fai-zip/container-read.d.ts +16 -0
  477. package/dist/io/fai-zip/container-read.d.ts.map +1 -1
  478. package/dist/io/fai-zip/container-read.js +22 -0
  479. package/dist/io/fai-zip/container-read.js.map +1 -1
  480. package/dist/io/fai-zip/index.d.ts +1 -1
  481. package/dist/io/fai-zip/index.d.ts.map +1 -1
  482. package/dist/io/fai-zip/index.js +1 -1
  483. package/dist/io/fai-zip/index.js.map +1 -1
  484. package/dist/lang/code-to-args.d.ts.map +1 -1
  485. package/dist/lang/code-to-args.js +10 -1
  486. package/dist/lang/code-to-args.js.map +1 -1
  487. package/dist/lang/determinism-scanner.d.ts.map +1 -1
  488. package/dist/lang/determinism-scanner.js +22 -9
  489. package/dist/lang/determinism-scanner.js.map +1 -1
  490. package/dist/lang/metadata-extractor.d.ts +27 -6
  491. package/dist/lang/metadata-extractor.d.ts.map +1 -1
  492. package/dist/lang/metadata-extractor.js +90 -29
  493. package/dist/lang/metadata-extractor.js.map +1 -1
  494. package/dist/lang/parse-error.d.ts +4 -0
  495. package/dist/lang/parse-error.d.ts.map +1 -1
  496. package/dist/lang/parse-error.js.map +1 -1
  497. package/dist/lang/security-scanner.d.ts +27 -2
  498. package/dist/lang/security-scanner.d.ts.map +1 -1
  499. package/dist/lang/security-scanner.js +29 -2
  500. package/dist/lang/security-scanner.js.map +1 -1
  501. package/dist/lang/source-edit.d.ts +2 -2
  502. package/dist/lang/source-edit.js.map +1 -1
  503. package/dist/lang/symbol-table.generated.d.ts +36 -0
  504. package/dist/lang/symbol-table.generated.d.ts.map +1 -1
  505. package/dist/lang/symbol-table.generated.js +36 -0
  506. package/dist/lang/symbol-table.generated.js.map +1 -1
  507. package/dist/lang/types.d.ts +5 -6
  508. package/dist/lang/types.d.ts.map +1 -1
  509. package/dist/lang/types.js.map +1 -1
  510. package/dist/mesh/import-model.d.ts +94 -0
  511. package/dist/mesh/import-model.d.ts.map +1 -0
  512. package/dist/mesh/import-model.js +15 -0
  513. package/dist/mesh/import-model.js.map +1 -0
  514. package/dist/mesh/index.d.ts +19 -58
  515. package/dist/mesh/index.d.ts.map +1 -1
  516. package/dist/mesh/index.js +19 -70
  517. package/dist/mesh/index.js.map +1 -1
  518. package/dist/mesh/io.d.ts +39 -16
  519. package/dist/mesh/io.d.ts.map +1 -1
  520. package/dist/mesh/io.js +151 -22
  521. package/dist/mesh/io.js.map +1 -1
  522. package/dist/mesh/primitives.d.ts.map +1 -1
  523. package/dist/mesh/primitives.js +42 -7
  524. package/dist/mesh/primitives.js.map +1 -1
  525. package/dist/mesh/threemf-bambu.d.ts +12 -1
  526. package/dist/mesh/threemf-bambu.d.ts.map +1 -1
  527. package/dist/mesh/threemf-bambu.js +68 -16
  528. package/dist/mesh/threemf-bambu.js.map +1 -1
  529. package/dist/mesh/threemf-loader.d.ts +37 -1
  530. package/dist/mesh/threemf-loader.d.ts.map +1 -1
  531. package/dist/mesh/threemf-loader.js +205 -14
  532. package/dist/mesh/threemf-loader.js.map +1 -1
  533. package/dist/mesh/transform.d.ts +1 -1
  534. package/dist/mesh/transform.js +1 -1
  535. package/dist/mesh/transform.js.map +1 -1
  536. package/dist/mesh/types.d.ts +43 -5
  537. package/dist/mesh/types.d.ts.map +1 -1
  538. package/dist/mesh/types.js.map +1 -1
  539. package/dist/node-host/cli.d.ts +49 -1
  540. package/dist/node-host/cli.d.ts.map +1 -1
  541. package/dist/node-host/cli.js +125 -19
  542. package/dist/node-host/cli.js.map +1 -1
  543. package/dist/node-host/execute-script.d.ts +55 -0
  544. package/dist/node-host/execute-script.d.ts.map +1 -0
  545. package/dist/node-host/execute-script.js +46 -0
  546. package/dist/node-host/execute-script.js.map +1 -0
  547. package/dist/node.d.ts +2 -0
  548. package/dist/node.d.ts.map +1 -1
  549. package/dist/node.js +3 -0
  550. package/dist/node.js.map +1 -1
  551. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
  552. package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
  553. package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
  554. package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
  555. package/dist/occt-kernel/highLevelApi.d.ts +4 -1
  556. package/dist/occt-kernel/highLevelApi.d.ts.map +1 -1
  557. package/dist/occt-kernel/highLevelApi.js +4 -2
  558. package/dist/occt-kernel/highLevelApi.js.map +1 -1
  559. package/dist/occt-kernel/hullGeometry.d.ts +2 -2
  560. package/dist/occt-kernel/hullGeometry.js +2 -3
  561. package/dist/occt-kernel/hullGeometry.js.map +1 -1
  562. package/dist/occt-kernel/hullOps.d.ts +3 -3
  563. package/dist/occt-kernel/hullOps.js +4 -4
  564. package/dist/occt-kernel/hullOps.js.map +1 -1
  565. package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
  566. package/dist/occt-kernel/occt-primitives.js +32 -5
  567. package/dist/occt-kernel/occt-primitives.js.map +1 -1
  568. package/dist/occt-kernel/occtKernel.d.ts +1 -1
  569. package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
  570. package/dist/occt-kernel/occtKernel.js +19 -1
  571. package/dist/occt-kernel/occtKernel.js.map +1 -1
  572. package/dist/occt-kernel/stepMetaParser.d.ts +44 -0
  573. package/dist/occt-kernel/stepMetaParser.d.ts.map +1 -0
  574. package/dist/occt-kernel/stepMetaParser.js +166 -0
  575. package/dist/occt-kernel/stepMetaParser.js.map +1 -0
  576. package/dist/occt-scan/recognize.d.ts +58 -0
  577. package/dist/occt-scan/recognize.d.ts.map +1 -0
  578. package/dist/occt-scan/recognize.js +216 -0
  579. package/dist/occt-scan/recognize.js.map +1 -0
  580. package/dist/primitives/brep-primitives.js +7 -7
  581. package/dist/primitives/brep-primitives.js.map +1 -1
  582. package/dist/result/bug.d.ts +1 -1
  583. package/dist/result/bug.js +1 -1
  584. package/dist/result/bug.js.map +1 -1
  585. package/dist/result/errors.d.ts +2 -2
  586. package/dist/result/errors.d.ts.map +1 -1
  587. package/dist/result/errors.js +1 -1
  588. package/dist/result/errors.js.map +1 -1
  589. package/dist/result/vec3.d.ts +1 -1
  590. package/dist/result/vec3.js +1 -1
  591. package/dist/result/vec3.js.map +1 -1
  592. package/dist/runtime-state.d.ts +16 -0
  593. package/dist/runtime-state.d.ts.map +1 -1
  594. package/dist/runtime-state.js +27 -0
  595. package/dist/runtime-state.js.map +1 -1
  596. package/dist/script-globals.d.ts +24 -0
  597. package/dist/script-globals.d.ts.map +1 -0
  598. package/dist/script-globals.js +24 -0
  599. package/dist/script-globals.js.map +1 -0
  600. package/dist/shape.d.ts +35 -3
  601. package/dist/shape.d.ts.map +1 -1
  602. package/dist/shape.js +44 -2
  603. package/dist/shape.js.map +1 -1
  604. package/dist/step/stepMetaParser.d.ts +55 -0
  605. package/dist/step/stepMetaParser.d.ts.map +1 -0
  606. package/dist/step/stepMetaParser.js +177 -0
  607. package/dist/step/stepMetaParser.js.map +1 -0
  608. package/dist/topology/naming/lineage.d.ts +3 -2
  609. package/dist/topology/naming/lineage.d.ts.map +1 -1
  610. package/dist/topology/naming/lineage.js.map +1 -1
  611. package/dist/weapp.d.ts +1 -1
  612. package/dist/weapp.js +1 -1
  613. package/dist/weapp.js.map +1 -1
  614. package/package.json +9 -11
@@ -23,6 +23,10 @@ export type ParseErrorCode =
23
23
  | 'E_ARG'
24
24
  /** 安全门禁违规(SecurityScanner 命中:危险标识符 / 危险语法 / 自由标识符等) */
25
25
  | 'E_SECURITY'
26
+ /** 免 import 安全全局(S4_SAFE_GLOBALS)被某判定点漏放行——应放行却误判为未知(A3)。
27
+ * 与 E_REFERENCE 区分:真未知标识符仍是 E_REFERENCE;此码说明「这是 faijs 判定点缺陷,
28
+ * 不是你的代码问题」,把错误引向正确方向(见统一入口 S4_SAFE_GLOBALS / 计划 A1)。 */
29
+ | 'E_GLOBAL_NOT_ADMITTED'
26
30
  /** P6/D8: 有量纲位收到裸数字字面量(dimension pass) */
27
31
  | 'E_DIM_BARE_NUMBER'
28
32
  /** P6/D8: 可判定量纲的两侧量纲不一致(dimension pass) */
@@ -1 +1 @@
1
- {"version":3,"file":"parse-error.d.ts","sourceRoot":"","sources":["../../src/lang/parse-error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,4DAA4D;AAC5D,MAAM,MAAM,cAAc;AACxB,qBAAqB;AACnB,UAAU;AACZ,wFAAwF;GACtF,gBAAgB;AAClB,uCAAuC;GACrC,aAAa;AACf,oCAAoC;GAClC,SAAS;AACX,2BAA2B;GACzB,UAAU;AACZ,gCAAgC;GAC9B,aAAa;AACf,iDAAiD;GAC/C,OAAO;AACT,uDAAuD;GACrD,YAAY;AACd,0CAA0C;GACxC,mBAAmB;AACrB,2CAA2C;GACzC,gBAAgB;AAClB,0CAA0C;GACxC,oBAAoB,CAAA;AAExB;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,IAAI,EAAE,cAAc,CAAA;IACpB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAA;gBAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,cAA2B,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM;CAU/G"}
1
+ {"version":3,"file":"parse-error.d.ts","sourceRoot":"","sources":["../../src/lang/parse-error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,4DAA4D;AAC5D,MAAM,MAAM,cAAc;AACxB,qBAAqB;AACnB,UAAU;AACZ,wFAAwF;GACtF,gBAAgB;AAClB,uCAAuC;GACrC,aAAa;AACf,oCAAoC;GAClC,SAAS;AACX,2BAA2B;GACzB,UAAU;AACZ,gCAAgC;GAC9B,aAAa;AACf,iDAAiD;GAC/C,OAAO;AACT,uDAAuD;GACrD,YAAY;AACd;;0DAE0D;GACxD,uBAAuB;AACzB,0CAA0C;GACxC,mBAAmB;AACrB,2CAA2C;GACzC,gBAAgB;AAClB,0CAA0C;GACxC,oBAAoB,CAAA;AAExB;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,IAAI,EAAE,cAAc,CAAA;IACpB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAA;gBAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,cAA2B,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM;CAU/G"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse-error.js","sourceRoot":"","sources":["../../src/lang/parse-error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2BH;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,iEAAiE;IACjE,IAAI,CAAQ;IACZ,6DAA6D;IAC7D,IAAI,CAAgB;IACpB,8FAA8F;IAC9F,MAAM,CAAS;IAEf,YAAY,OAAe,EAAE,IAAY,EAAE,OAAuB,UAAU,EAAE,KAAe,EAAE,MAAe;QAC5G,KAAK,CACH,iBAAiB,IAAI,KAAK,OAAO,EAAE,EACnC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,KAAK,EAA8B,CACzE,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IAChD,CAAC;CACF","sourcesContent":["/**\n * parse-error — 文本层解析错误的唯一归属(L0 零依赖)\n *\n * 无 IR 双通道方案(2026-09-06)后语义层删除,MetadataExtractor /\n * SyntaxGate 复用同一 ParseError(宿主面 analyzeCode/codeToArgs 抛错契约不变:\n * 含 line 与 code 字段)。本文件是 ParseError 的唯一家。\n */\n\n/** 解析诊断码(宿主 CadRuntime.check 透传给 CheckError,AI 可据此精确修正)。 */\nexport type ParseErrorCode =\n /** 语法错误(acorn 闸门) */\n | 'E_SYNTAX'\n /** 控制流语句(if/for/while/do/switch/try/throw/break/continue/labeled/with + 动态 import()) */\n | 'E_CONTROL_FLOW'\n /** 不支持的语句形态(函数/类/export/new/eval 等) */\n | 'E_STATEMENT'\n /** 参数值表达式不合法(无法静态折叠 / 不支持的表达式节点) */\n | 'E_VALUE'\n /** import 声明位置/形态违规(F2) */\n | 'E_IMPORT'\n /** 引用错误(未知变量 / 未声明 receiver) */\n | 'E_REFERENCE'\n /** 本机函数调用 ABI 违规(§3.6:位置实参超位 / args 对象键不在形参表) */\n | 'E_ARG'\n /** 安全门禁违规(SecurityScanner 命中:危险标识符 / 危险语法 / 自由标识符等) */\n | 'E_SECURITY'\n /** P6/D8: 有量纲位收到裸数字字面量(dimension pass) */\n | 'E_DIM_BARE_NUMBER'\n /** P6/D8: 可判定量纲的两侧量纲不一致(dimension pass) */\n | 'E_DIM_MISMATCH'\n /** P6/D8: 单位常量名不在表中(dimension pass 兖底) */\n | 'E_DIM_UNKNOWN_UNIT'\n\n/**\n * An error raised while parsing faijs source, carrying the offending line\n * number and a diagnostic code the host can forward for precise feedback.\n */\nexport class ParseError extends Error {\n /** The 1-based source line at which the parse error occurred. */\n line: number\n /** 诊断码(缺省 E_SYNTAX)。宿主 check() 透传;3d_editor 可据此给 AI 精确反馈。 */\n code: ParseErrorCode\n /** SecurityScanner 规则 ID(仅 code='E_SECURITY' 时有值;见 security-scanner.ts SecurityRuleId 枚举)。 */\n ruleId?: string\n\n constructor(message: string, line: number, code: ParseErrorCode = 'E_SYNTAX', cause?: unknown, ruleId?: string) {\n super(\n `[parser] line ${line}: ${message}`,\n cause === undefined ? undefined : ({ cause } as unknown as ErrorOptions),\n )\n this.name = 'ParseError'\n this.line = line\n this.code = code\n if (ruleId !== undefined) this.ruleId = ruleId\n }\n}\n"]}
1
+ {"version":3,"file":"parse-error.js","sourceRoot":"","sources":["../../src/lang/parse-error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+BH;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,iEAAiE;IACjE,IAAI,CAAQ;IACZ,6DAA6D;IAC7D,IAAI,CAAgB;IACpB,8FAA8F;IAC9F,MAAM,CAAS;IAEf,YAAY,OAAe,EAAE,IAAY,EAAE,OAAuB,UAAU,EAAE,KAAe,EAAE,MAAe;QAC5G,KAAK,CACH,iBAAiB,IAAI,KAAK,OAAO,EAAE,EACnC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,KAAK,EAA8B,CACzE,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IAChD,CAAC;CACF","sourcesContent":["/**\n * parse-error — 文本层解析错误的唯一归属(L0 零依赖)\n *\n * 无 IR 双通道方案(2026-09-06)后语义层删除,MetadataExtractor /\n * SyntaxGate 复用同一 ParseError(宿主面 analyzeCode/codeToArgs 抛错契约不变:\n * 含 line 与 code 字段)。本文件是 ParseError 的唯一家。\n */\n\n/** 解析诊断码(宿主 CadRuntime.check 透传给 CheckError,AI 可据此精确修正)。 */\nexport type ParseErrorCode =\n /** 语法错误(acorn 闸门) */\n | 'E_SYNTAX'\n /** 控制流语句(if/for/while/do/switch/try/throw/break/continue/labeled/with + 动态 import()) */\n | 'E_CONTROL_FLOW'\n /** 不支持的语句形态(函数/类/export/new/eval 等) */\n | 'E_STATEMENT'\n /** 参数值表达式不合法(无法静态折叠 / 不支持的表达式节点) */\n | 'E_VALUE'\n /** import 声明位置/形态违规(F2) */\n | 'E_IMPORT'\n /** 引用错误(未知变量 / 未声明 receiver) */\n | 'E_REFERENCE'\n /** 本机函数调用 ABI 违规(§3.6:位置实参超位 / args 对象键不在形参表) */\n | 'E_ARG'\n /** 安全门禁违规(SecurityScanner 命中:危险标识符 / 危险语法 / 自由标识符等) */\n | 'E_SECURITY'\n /** 免 import 安全全局(S4_SAFE_GLOBALS)被某判定点漏放行——应放行却误判为未知(A3)。\n * 与 E_REFERENCE 区分:真未知标识符仍是 E_REFERENCE;此码说明「这是 faijs 判定点缺陷,\n * 不是你的代码问题」,把错误引向正确方向(见统一入口 S4_SAFE_GLOBALS / 计划 A1)。 */\n | 'E_GLOBAL_NOT_ADMITTED'\n /** P6/D8: 有量纲位收到裸数字字面量(dimension pass) */\n | 'E_DIM_BARE_NUMBER'\n /** P6/D8: 可判定量纲的两侧量纲不一致(dimension pass) */\n | 'E_DIM_MISMATCH'\n /** P6/D8: 单位常量名不在表中(dimension pass 兖底) */\n | 'E_DIM_UNKNOWN_UNIT'\n\n/**\n * An error raised while parsing faijs source, carrying the offending line\n * number and a diagnostic code the host can forward for precise feedback.\n */\nexport class ParseError extends Error {\n /** The 1-based source line at which the parse error occurred. */\n line: number\n /** 诊断码(缺省 E_SYNTAX)。宿主 check() 透传;3d_editor 可据此给 AI 精确反馈。 */\n code: ParseErrorCode\n /** SecurityScanner 规则 ID(仅 code='E_SECURITY' 时有值;见 security-scanner.ts SecurityRuleId 枚举)。 */\n ruleId?: string\n\n constructor(message: string, line: number, code: ParseErrorCode = 'E_SYNTAX', cause?: unknown, ruleId?: string) {\n super(\n `[parser] line ${line}: ${message}`,\n cause === undefined ? undefined : ({ cause } as unknown as ErrorOptions),\n )\n this.name = 'ParseError'\n this.line = line\n this.code = code\n if (ruleId !== undefined) this.ruleId = ruleId\n }\n}\n"]}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * security-scanner — .fai.js 静态安全门禁(纵深防御第一层)
3
3
  *
4
- * 方案:docs/plans/2026-09-08-faijs-security-gate.md(§5)
5
- *
6
4
  * 定位:在 MetadataExtractor(UI 通道)与 DirectExecutor(执行通道)之前
7
5
  * 对源码做 **AST 全量递归遍历**,覆盖函数体、控制流块、嵌套函数——消除
8
6
  * 当前"只扫顶层"的盲区。规则表与功能代码解耦(R6):新增 op / 新增语法
@@ -67,8 +65,35 @@ export interface SecurityScanResult {
67
65
  * S4 安全全局白名单(固定清单,strict 与 balanced 相同)。
68
66
  * 不在此名单且不在已声明/knownNames 中的标识符 → SEC_FREE_IDENT 拒绝。
69
67
  * 导出供解释器后端(cad-runtime/interp/env.ts)做同序解析。
68
+ *
69
+ * A4(2026-10-06)口径指认:本清单回答「这个裸标识符是否被**安全门禁**允许
70
+ * (免 import)」。它不是 `lang/determinism-scanner.ts` 里 SAFE_CONTAINERS /
71
+ * SAFE_FUNCTIONS 的超集或子集——那边回答的是另一个问题(成员调用是否传播
72
+ * 污点,含 Intl / Reflect / encodeURI 等本名单不放行的名字)。禁止用对方的
73
+ * 名字反推本清单语义;扩边(放行 Intl / Reflect / URI 编解码)属安全面策略
74
+ * 决定,须先拍板再改。
70
75
  */
71
76
  export declare const S4_SAFE_GLOBALS: Set<string>;
77
+ /**
78
+ * 裸标识符是否命中「免 import 的安全全局」——`Math` / `JSON` / `Number` /
79
+ * `console` / `Infinity` / `NaN` / `undefined` / `parseInt` / … 以及单位常量
80
+ * `MM` / `INCH` / `DEGREE` / …(单位常量是 S4_SAFE_GLOBALS 的子集)。
81
+ *
82
+ * ⚠️ 这是**唯一**判定入口。该知识历史上散落在六处,其中四处只内联了单位常量表
83
+ * (`SCRIPT_UNIT_NAMES`)而漏掉 `S4_SAFE_GLOBALS`,于是同一份代码在安全门禁放行、
84
+ * 在提取层却抛 `E_REFERENCE`(2026-10-06 修复 `cad.box(Math.max(x, 20), 1, 1)`
85
+ * 整脚本不可执行):
86
+ * - `lang/security-scanner.ts`(S4 门禁) → 完整
87
+ * - `cad-runtime/interp/env.ts`(解释器后端) → 完整
88
+ * - `lang/metadata-extractor.ts`(提取/校验 ×3 处) → 漏 → 已改调本函数
89
+ * - `cad-runtime/direct-executor.ts`(前缀校验/发射) → 漏 → 已改调本函数
90
+ * - `lang/code-to-args.ts`(单行提取哨兵) → 漏 → 已改调本函数
91
+ *
92
+ * 新增判定点请一律调用本函数,**不要**再复制名单。
93
+ * @param name 待判定的裸标识符名。
94
+ * @returns 是免 import 安全全局 → true。
95
+ */
96
+ export declare function isSafeGlobalIdent(name: string): boolean;
72
97
  /**
73
98
  * P6/D7: Reserved unit constant names — cannot be used as declaration names
74
99
  * (let/const/var/param/function) or assignment targets.
@@ -1 +1 @@
1
- {"version":3,"file":"security-scanner.d.ts","sourceRoot":"","sources":["../../src/lang/security-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAKpC,4DAA4D;AAC5D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAA;AAE1D,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,gBAAgB,GAChB,WAAW,GACX,eAAe,GACf,qBAAqB,CAAA;AAEzB,YAAY;AACZ,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,MAAM,EAAE,cAAc,CAAA;IACtB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAA;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,YAAY;AACZ,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,MAAM,EAAE,cAAc,CAAA;IACtB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,YAAY;AACZ,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,EAAE,EAAE,OAAO,CAAA;IACX,yBAAyB;IACzB,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,0BAA0B;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AA2DD;;;;GAIG;AACH,eAAO,MAAM,eAAe,aAc1B,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,aAG9B,CAAA;AAUF,4CAA4C;AAC5C,eAAO,MAAM,YAAY,KAAK,CAAA;AAC9B,4CAA4C;AAC5C,eAAO,MAAM,cAAc,KAAK,CAAA;AA2ChC;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CA+BtF;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CAqmBnF;AAOD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAY1E"}
1
+ {"version":3,"file":"security-scanner.d.ts","sourceRoot":"","sources":["../../src/lang/security-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAKpC,4DAA4D;AAC5D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAA;AAE1D,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,gBAAgB,GAChB,WAAW,GACX,eAAe,GACf,qBAAqB,CAAA;AAEzB,YAAY;AACZ,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,MAAM,EAAE,cAAc,CAAA;IACtB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAA;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,YAAY;AACZ,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,MAAM,EAAE,cAAc,CAAA;IACtB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,YAAY;AACZ,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,EAAE,EAAE,OAAO,CAAA;IACX,yBAAyB;IACzB,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,0BAA0B;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AA2DD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,aAc1B,CAAA;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,aAG9B,CAAA;AAUF,4CAA4C;AAC5C,eAAO,MAAM,YAAY,KAAK,CAAA;AAC9B,4CAA4C;AAC5C,eAAO,MAAM,cAAc,KAAK,CAAA;AA2ChC;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CA+BtF;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,CAqmBnF;AAOD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAY1E"}
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * security-scanner — .fai.js 静态安全门禁(纵深防御第一层)
3
3
  *
4
- * 方案:docs/plans/2026-09-08-faijs-security-gate.md(§5)
5
- *
6
4
  * 定位:在 MetadataExtractor(UI 通道)与 DirectExecutor(执行通道)之前
7
5
  * 对源码做 **AST 全量递归遍历**,覆盖函数体、控制流块、嵌套函数——消除
8
6
  * 当前"只扫顶层"的盲区。规则表与功能代码解耦(R6):新增 op / 新增语法
@@ -73,6 +71,13 @@ const S3_MEMBERS = new Set([
73
71
  * S4 安全全局白名单(固定清单,strict 与 balanced 相同)。
74
72
  * 不在此名单且不在已声明/knownNames 中的标识符 → SEC_FREE_IDENT 拒绝。
75
73
  * 导出供解释器后端(cad-runtime/interp/env.ts)做同序解析。
74
+ *
75
+ * A4(2026-10-06)口径指认:本清单回答「这个裸标识符是否被**安全门禁**允许
76
+ * (免 import)」。它不是 `lang/determinism-scanner.ts` 里 SAFE_CONTAINERS /
77
+ * SAFE_FUNCTIONS 的超集或子集——那边回答的是另一个问题(成员调用是否传播
78
+ * 污点,含 Intl / Reflect / encodeURI 等本名单不放行的名字)。禁止用对方的
79
+ * 名字反推本清单语义;扩边(放行 Intl / Reflect / URI 编解码)属安全面策略
80
+ * 决定,须先拍板再改。
76
81
  */
77
82
  export const S4_SAFE_GLOBALS = new Set([
78
83
  'Math', 'Number', 'String', 'Boolean', 'Array', 'Object', 'JSON', 'Date',
@@ -89,6 +94,28 @@ export const S4_SAFE_GLOBALS = new Set([
89
94
  'MM', 'CM', 'METER', 'MICRON', 'INCH', 'FOOT', 'YARD',
90
95
  'DEGREE', 'RADIAN', 'GRAM', 'KILOGRAM', 'SECOND',
91
96
  ]);
97
+ /**
98
+ * 裸标识符是否命中「免 import 的安全全局」——`Math` / `JSON` / `Number` /
99
+ * `console` / `Infinity` / `NaN` / `undefined` / `parseInt` / … 以及单位常量
100
+ * `MM` / `INCH` / `DEGREE` / …(单位常量是 S4_SAFE_GLOBALS 的子集)。
101
+ *
102
+ * ⚠️ 这是**唯一**判定入口。该知识历史上散落在六处,其中四处只内联了单位常量表
103
+ * (`SCRIPT_UNIT_NAMES`)而漏掉 `S4_SAFE_GLOBALS`,于是同一份代码在安全门禁放行、
104
+ * 在提取层却抛 `E_REFERENCE`(2026-10-06 修复 `cad.box(Math.max(x, 20), 1, 1)`
105
+ * 整脚本不可执行):
106
+ * - `lang/security-scanner.ts`(S4 门禁) → 完整
107
+ * - `cad-runtime/interp/env.ts`(解释器后端) → 完整
108
+ * - `lang/metadata-extractor.ts`(提取/校验 ×3 处) → 漏 → 已改调本函数
109
+ * - `cad-runtime/direct-executor.ts`(前缀校验/发射) → 漏 → 已改调本函数
110
+ * - `lang/code-to-args.ts`(单行提取哨兵) → 漏 → 已改调本函数
111
+ *
112
+ * 新增判定点请一律调用本函数,**不要**再复制名单。
113
+ * @param name 待判定的裸标识符名。
114
+ * @returns 是免 import 安全全局 → true。
115
+ */
116
+ export function isSafeGlobalIdent(name) {
117
+ return S4_SAFE_GLOBALS.has(name);
118
+ }
92
119
  /**
93
120
  * P6/D7: Reserved unit constant names — cannot be used as declaration names
94
121
  * (let/const/var/param/function) or assignment targets.
@@ -1 +1 @@
1
- {"version":3,"file":"security-scanner.js","sourceRoot":"","sources":["../../src/lang/security-scanner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * security-scanner — .fai.js 静态安全门禁(纵深防御第一层)\n *\n * 方案:docs/plans/2026-09-08-faijs-security-gate.md(§5)\n *\n * 定位:在 MetadataExtractor(UI 通道)与 DirectExecutor(执行通道)之前\n * 对源码做 **AST 全量递归遍历**,覆盖函数体、控制流块、嵌套函数——消除\n * 当前\"只扫顶层\"的盲区。规则表与功能代码解耦(R6):新增 op / 新增语法\n * 形态不需要改扫描器,只有\"新增被禁能力\"才改规则表(数据)。\n *\n * 判定模型 = 能力黑名单(S1)+ 危险语法(S2)+ 危险成员名(S3)+\n * 自由标识符白名单(S4)+ 结构上限(S5)+ 命名空间保护(S7)。\n *\n * 诚实边界(D9):静态门禁 ≠ 沙箱。无法拦截拼接属性名 `g['ev'+'al']`、\n * 字符串内代码、已获引用二次调用。本方案通过切断能力来源(S4)使残留\n * 失去立足点,但不宣称等价隔离。\n */\n\nimport { parse as acornParse } from 'acorn'\nimport type { Program } from 'acorn'\nimport { ParseError } from './parse-error'\n\n// ── 类型 ──\n\n/** 安全策略档位。strict = 默认(全规则);balanced = 本机 CLI;off = 受控调试。 */\nexport type SecurityPolicy = 'strict' | 'balanced' | 'off'\n\n/** SecurityScanner 规则 ID(封闭集合,禁止自造;测试按此断言)。 */\nexport type SecurityRuleId =\n | 'SEC_IDENT'\n | 'SEC_SYNTAX'\n | 'SEC_MEMBER'\n | 'SEC_FREE_IDENT'\n | 'SEC_LIMIT'\n | 'SEC_NS_ASSIGN'\n | 'SEC_RESERVED_ASSIGN'\n\n/** 违规条目。 */\nexport interface SecurityViolation {\n /** 规则 ID(见 SecurityRuleId 枚举) */\n ruleId: SecurityRuleId\n /** 1-based 行号,相对传入的原始源码文本(Scanner 不做任何包裹/偏移) */\n lineNo: number\n /** 命中的标识符名 / 属性名 / 节点类型(无则省略) */\n name?: string\n /** 人类可读消息(AI 自纠用) */\n message: string\n}\n\n/** 扫描选项。 */\nexport interface SecurityScanOptions {\n /**\n * 策略档位。**必填**——不允许缺省,调用方必须显式声明(防止无意间关闭门禁)。\n */\n policy: SecurityPolicy\n /**\n * 额外合法名字(S4 判定用:不在 knownNames 也不在 S4_SAFE_GLOBALS → SEC_FREE_IDENT)。\n * 调用方可不传——Scanner 始终自动收集:\n * ① 源码内全部 `ImportDeclaration` 的本地绑定名(named / namespace / default);\n * ② `opts.defaultNs ?? 'cad'`。\n * 本字段只用于补充\"源码里看不到的名字\"。\n */\n knownNames?: string[]\n /**\n * 命名空间保护名(S7 判定用:对此列表中的名字做赋值 → SEC_NS_ASSIGN)。\n * 缺省 = knownNames(即所有 knownNames 都受 S7 保护)。\n * 调用方在 append 场景中可传一个更小的集合(仅命名空间名,不含 ctx 普通变量)。\n */\n nsNames?: string[]\n /** 默认命名空间名,缺省 'cad'(自动进入 knownNames) */\n defaultNs?: string\n}\n\n/** 扫描结果。 */\nexport interface SecurityScanResult {\n /** true 当且仅当 violations 为空 */\n ok: boolean\n /** 命中即拒的条目;非空 → 调用方拒绝 */\n violations: SecurityViolation[]\n /** 只告警不拒(目前只有 S5 无界循环) */\n warnings: SecurityViolation[]\n}\n\n// ── 规则表(数据驱动,新增规则不改遍历器) ──\n\n/**\n * S1 危险标识符黑名单(引用即拒,不区分读写、不区分声明位置)。\n * S1 优先于一切:即使用户用这些名字声明了自己的变量,也照样拒绝。\n */\nconst S1_IDENTS = new Set<string>([\n // 执行任意代码\n 'eval', 'Function', 'AsyncFunction', 'GeneratorFunction', 'AsyncGeneratorFunction',\n // 全局逃逸\n 'globalThis', 'window', 'self', 'top', 'parent', 'frames',\n // Node 宿主\n 'process', 'require', 'module', 'exports', '__dirname', '__filename',\n // 网络\n 'fetch', 'XMLHttpRequest', 'WebSocket', 'EventSource', 'navigator', 'sendBeacon',\n // 浏览器存储/DOM\n 'localStorage', 'sessionStorage', 'indexedDB', 'caches', 'document', 'location', 'cookie',\n // 动态装载\n 'importScripts', 'Worker', 'SharedWorker', 'WebAssembly',\n // 定时器/微任务(混淆与延时外发)——仅 strict\n 'setTimeout', 'setInterval', 'setImmediate', 'queueMicrotask', 'requestAnimationFrame',\n // 元编程(原型污染族)——仅 strict\n 'Reflect', 'Proxy', 'crypto',\n])\n\n/** S1 中仅在 strict 档生效的标识符集合。 */\nconst S1_STRICT_ONLY = new Set<string>([\n 'setTimeout', 'setInterval', 'setImmediate', 'queueMicrotask', 'requestAnimationFrame',\n 'Reflect', 'Proxy', 'crypto',\n])\n\n/**\n * S2 危险语法节点黑名单。\n * key = AST node type;value = true 表示仅 strict 档生效。\n */\nconst S2_SYNTAX: Record<string, boolean> = {\n ImportExpression: false, // 动态 import() — strict + balanced\n WithStatement: false, // with — strict + balanced\n DebuggerStatement: false, // debugger — strict + balanced\n TaggedTemplateExpression: true, // 标签模板 — 仅 strict\n MetaProperty: false, // import.meta / new.target — strict + balanced\n}\n\n/**\n * S3 危险成员属性名黑名单(MemberExpression.property 的名字命中即拒)。\n */\nconst S3_MEMBERS = new Set<string>([\n // 原型污染\n '__proto__', 'constructor', 'prototype',\n // getter/setter 注入\n '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__',\n // 对象元编程\n 'setPrototypeOf', 'defineProperty', 'defineGetter', 'defineSetter',\n // 求值(x.eval 形式)\n 'eval',\n])\n\n/**\n * S4 安全全局白名单(固定清单,strict 与 balanced 相同)。\n * 不在此名单且不在已声明/knownNames 中的标识符 → SEC_FREE_IDENT 拒绝。\n * 导出供解释器后端(cad-runtime/interp/env.ts)做同序解析。\n */\nexport const S4_SAFE_GLOBALS = new Set<string>([\n 'Math', 'Number', 'String', 'Boolean', 'Array', 'Object', 'JSON', 'Date',\n 'Map', 'Set', 'Promise', 'Symbol', 'RegExp', 'Error',\n 'Infinity', 'NaN', 'undefined',\n 'parseInt', 'parseFloat', 'isNaN', 'isFinite',\n 'console',\n // P6/D7: script-side unit constants (MM, INCH, DEGREE, …) are read-only globals.\n // Values registered on globalThis by the runtime; SEC_RESERVED_ASSIGN (P6) prevents\n // shadowing. The name set lives in units.ts (SCRIPT_UNIT_NAMES) but the literal\n // list is duplicated here because lang/ must not create a runtime dependency on\n // units.ts (type-only import is fine, but S4_SAFE_GLOBALS is a runtime Set).\n // Names are UPPERCASE to avoid collisions with user variable names.\n 'MM', 'CM', 'METER', 'MICRON', 'INCH', 'FOOT', 'YARD',\n 'DEGREE', 'RADIAN', 'GRAM', 'KILOGRAM', 'SECOND',\n])\n\n/**\n * P6/D7: Reserved unit constant names — cannot be used as declaration names\n * (let/const/var/param/function) or assignment targets.\n * This is a subset of S4_SAFE_GLOBALS (the unit constants only, not Math/Number/etc).\n * SEC_RESERVED_ASSIGN prevents scripts from shadowing unit constants like\n * `INCH = 999` or `let MM = 3`, which would silently corrupt geometry.\n */\nexport const RESERVED_UNIT_NAMES = new Set<string>([\n 'MM', 'CM', 'METER', 'MICRON', 'INCH', 'FOOT', 'YARD',\n 'DEGREE', 'RADIAN', 'GRAM', 'KILOGRAM', 'SECOND',\n])\n\n// S5 结构上限\nconst S5_MAX_SOURCE_LEN = 1 * 1024 * 1024 // 1 MiB\nconst S5_MAX_TOP_STATEMENTS = 5000\nconst S5_MAX_NODES = 200_000\nconst S5_MAX_DEPTH = 100\n\n// S6 子模块装载上限\n\n/** S6 子模块装载深度上限(A3:ModuleRegistry 静态守卫)。 */\nexport const S6_MAX_DEPTH = 16\n/** S6 子模块装载总数上限(A3:ModuleRegistry 静态守卫)。 */\nexport const S6_MAX_MODULES = 64\n\n// ── 作用域管理 ──\n\ninterface Scope {\n /** 本层已声明的名字(var/let/const、函数参数、函数名、解构名、catch 参数、循环绑定) */\n names: Set<string>\n /** 子作用域 */\n parent: Scope | null\n}\n\nfunction createScope(parent: Scope | null): Scope {\n return { names: new Set<string>(), parent }\n}\n\nfunction scopeHas(scope: Scope | null, name: string): boolean {\n let s: Scope | null = scope\n while (s) {\n if (s.names.has(name)) return true\n s = s.parent\n }\n return false\n}\n\n// ── 收集 import 绑定名 ──\n\n/** 从 Program.body 收集全部 ImportDeclaration 的本地绑定名。 */\nfunction collectImportBindings(ast: Program): string[] {\n const out: string[] = []\n const body = (ast as unknown as { body: unknown[] }).body\n for (const node of body) {\n const n = node as { type?: string; specifiers?: unknown[] }\n if (n.type !== 'ImportDeclaration') continue\n for (const spec of n.specifiers ?? []) {\n const s = spec as { local?: { name?: string } }\n if (s.local?.name) out.push(s.local.name)\n }\n }\n return out\n}\n\n// ── 主扫描器 ──\n\n/**\n * 全量扫描源码文本(返回全部违规)。\n * policy==='off' 时直接返回 `{ ok:true, violations:[], warnings:[] }`。\n * 解析失败时(acorn SyntaxError)不包装不抛——交给调用方的主 acornParse 路径\n * 包装为 E_SYNTAX(Scanner 不重复定义语法错误)。\n *\n * @param code - the .fai.js source text (raw, un-wrapped).\n * @param opts - scan options (policy is required).\n * @returns the full scan result (violations + warnings).\n */\nexport function scanSource(code: string, opts: SecurityScanOptions): SecurityScanResult {\n if (opts.policy === 'off') {\n return { ok: true, violations: [], warnings: [] }\n }\n\n // S5: source length check (before parsing)\n if (code.length > S5_MAX_SOURCE_LEN) {\n return {\n ok: false,\n violations: [{\n ruleId: 'SEC_LIMIT',\n lineNo: 1,\n message: `source too long (${code.length} > ${S5_MAX_SOURCE_LEN} bytes)`,\n }],\n warnings: [],\n }\n }\n\n let ast: Program\n try {\n ast = acornParse(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n locations: true,\n }) as unknown as Program\n } catch {\n // acorn SyntaxError → 交给调用方的主 acornParse 路径包装为 E_SYNTAX。\n // Scanner 返回 ok=true(无安全违规),让语法错误路径正常处理。\n return { ok: true, violations: [], warnings: [] }\n }\n return scanAst(ast, opts)\n}\n\n/**\n * 复用已解析的 AST 进行扫描(避免二次解析)。语义与 scanSource 完全一致。\n *\n * @param ast - the pre-parsed Program AST (with locations enabled).\n * @param opts - scan options (policy is required).\n * @returns the full scan result (violations + warnings).\n */\nexport function scanAst(ast: Program, opts: SecurityScanOptions): SecurityScanResult {\n if (opts.policy === 'off') {\n return { ok: true, violations: [], warnings: [] }\n }\n\n const policy = opts.policy\n const defaultNs = opts.defaultNs ?? 'cad'\n const violations: SecurityViolation[] = []\n const warnings: SecurityViolation[] = []\n\n // 自动收集 import 绑定名 + defaultNs\n const importNames = collectImportBindings(ast)\n const knownNames = new Set<string>([defaultNs, ...importNames])\n for (const n of opts.knownNames ?? []) knownNames.add(n)\n\n // S7 命名空间保护名:缺省 = knownNames(即所有 knownNames 都受 S7 保护);\n // 调用方可通过 nsNames 指定更小的集合(仅命名空间名,不含 ctx 普通变量)。\n const s7Names = opts.nsNames ? new Set(opts.nsNames) : knownNames\n\n // S5 结构上限 —— 判定在遍历前\n const body = (ast as unknown as { body: unknown[] }).body\n if (body.length > S5_MAX_TOP_STATEMENTS) {\n violations.push({\n ruleId: 'SEC_LIMIT',\n lineNo: 1,\n message: `too many top-level statements (${body.length} > ${S5_MAX_TOP_STATEMENTS})`,\n })\n }\n\n // 准备 strict-only 集合\n const s1Idents = new Set<string>()\n for (const id of S1_IDENTS) {\n if (S1_STRICT_ONLY.has(id) && policy !== 'strict') continue\n s1Idents.add(id)\n }\n\n const s2Syntax: Record<string, boolean> = {}\n for (const [k, strictOnly] of Object.entries(S2_SYNTAX)) {\n if (strictOnly && policy !== 'strict') continue\n s2Syntax[k] = strictOnly\n }\n\n let nodeCount = 0\n\n // 顶层作用域:收集 import 绑定名(已在 knownNames),以及 body 级声明\n const globalScope = createScope(null)\n for (const n of importNames) globalScope.names.add(n)\n\n // 遍历 AST\n walkNode(ast as unknown as ASTNode, null, 0)\n\n if (nodeCount > S5_MAX_NODES) {\n violations.push({\n ruleId: 'SEC_LIMIT',\n lineNo: 1,\n message: `too many AST nodes (${nodeCount} > ${S5_MAX_NODES})`,\n })\n }\n\n return {\n ok: violations.length === 0,\n violations,\n warnings,\n }\n\n // ── 递归 walker ──\n\n function lineOf(node: ASTNode): number {\n return node?.loc?.start?.line ?? 1\n }\n\n function addViolation(ruleId: SecurityRuleId, lineNo: number, name: string, message: string): void {\n violations.push({ ruleId, lineNo, name, message })\n }\n\n /**\n * 收集函数参数中的声明名(含默认参数、解构)。\n */\n function collectParamNames(params: ASTNode[], scope: Scope): void {\n for (const p of params ?? []) {\n collectPatternNames(p, scope)\n }\n }\n\n /**\n * 从解构/标识符模式收集名字(用于作用域登记)。\n * P6: If a pattern name is a reserved unit constant, emits SEC_RESERVED_ASSIGN.\n */\n function collectPatternNames(pattern: ASTNode, scope: Scope): void {\n if (!pattern) return\n switch (pattern.type) {\n case 'Identifier':\n // P6/SEC_RESERVED_ASSIGN: reserved unit names cannot be declared\n if (RESERVED_UNIT_NAMES.has(pattern.name)) {\n addViolation('SEC_RESERVED_ASSIGN', lineOf(pattern), pattern.name,\n `[security] SEC_RESERVED_ASSIGN line ${lineOf(pattern)}: cannot declare reserved unit name \"${pattern.name}\"`)\n }\n scope.names.add(pattern.name)\n return\n case 'ObjectPattern':\n for (const prop of pattern.properties ?? []) {\n if (prop?.type === 'Property') collectPatternNames(prop.value, scope)\n else if (prop?.type === 'RestElement') collectPatternNames(prop.argument, scope)\n }\n return\n case 'ArrayPattern':\n for (const el of pattern.elements ?? []) {\n if (el) collectPatternNames(el, scope)\n }\n return\n case 'AssignmentPattern':\n collectPatternNames(pattern.left, scope)\n return\n case 'RestElement':\n collectPatternNames(pattern.argument, scope)\n return\n default:\n return\n }\n }\n\n /**\n * 收集一个节点体内全部声明名(VariableDeclarator + FunctionDeclaration 等)。\n * 用于函数体 / 块体遍历前先登记声明(提升语义)。\n */\n function collectDeclarations(body: ASTNode[], scope: Scope): void {\n for (const node of body ?? []) {\n if (!node) continue\n switch (node.type) {\n case 'VariableDeclaration':\n for (const decl of node.declarations ?? []) {\n collectPatternNames(decl?.id, scope)\n }\n break\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n if (node.id?.type === 'Identifier') {\n // P6/SEC_RESERVED_ASSIGN: reserved unit names cannot be function/class names\n if (RESERVED_UNIT_NAMES.has(node.id.name)) {\n addViolation('SEC_RESERVED_ASSIGN', lineOf(node), node.id.name,\n `[security] SEC_RESERVED_ASSIGN line ${lineOf(node)}: cannot declare reserved unit name \"${node.id.name}\"`)\n }\n scope.names.add(node.id.name)\n }\n break\n default:\n break\n }\n }\n }\n\n function walkNode(node: ASTNode, scope: Scope | null, depth: number): void {\n if (!node || typeof node !== 'object') return\n\n nodeCount++\n if (depth > S5_MAX_DEPTH) {\n addViolation('SEC_LIMIT', lineOf(node), node.type ?? 'unknown', `AST nesting depth exceeds ${S5_MAX_DEPTH}`)\n return\n }\n\n // ── S2 危险语法节点 ──\n if (s2Syntax[node.type] !== undefined) {\n addViolation('SEC_SYNTAX', lineOf(node), node.type, `[security] dangerous syntax: ${node.type}`)\n // 继续遍历子节点(可能内部有更多违规),但不中断\n }\n\n // 按节点类型处理\n switch (node.type) {\n // ── Program ──\n case 'Program': {\n const programBody = node.body as ASTNode[]\n collectDeclarations(programBody, scope ?? globalScope)\n for (const child of programBody) walkNode(child, scope ?? globalScope, depth + 1)\n return\n }\n\n // ── Import 声明:不遍历(绑定已自动收集) ──\n case 'ImportDeclaration':\n return\n\n // ── Export 声明 ──\n case 'ExportDefaultDeclaration':\n walkNode(node.declaration, scope, depth + 1)\n return\n case 'ExportNamedDeclaration':\n if (node.declaration) walkNode(node.declaration, scope, depth + 1)\n return\n\n // ── 函数声明 ──\n case 'FunctionDeclaration':\n case 'FunctionExpression':\n case 'ArrowFunctionExpression': {\n // 函数名在父作用域(FunctionDeclaration 提升到父层)\n if (node.type === 'FunctionDeclaration' && node.id?.name && scope) {\n // P6/SEC_RESERVED_ASSIGN: reserved unit names cannot be function names\n if (RESERVED_UNIT_NAMES.has(node.id.name)) {\n addViolation('SEC_RESERVED_ASSIGN', lineOf(node), node.id.name,\n `[security] SEC_RESERVED_ASSIGN line ${lineOf(node)}: cannot declare reserved unit name \"${node.id.name}\"`)\n }\n scope.names.add(node.id.name)\n }\n const fnScope = createScope(scope)\n collectParamNames(node.params ?? [], fnScope)\n // 函数体提升:先收集体内全部声明\n if (node.body?.type === 'BlockStatement') {\n collectDeclarations(node.body.body ?? [], fnScope)\n }\n // 遍历参数(含默认值)\n for (const p of node.params ?? []) walkNode(p, fnScope, depth + 1)\n // 遍历函数体\n if (node.body) walkNode(node.body, fnScope, depth + 1)\n return\n }\n\n // ── 变量声明 ──\n case 'VariableDeclaration': {\n for (const decl of node.declarations ?? []) {\n // 声明名登记(pattern 里的名字入当前 scope)\n if (scope) collectPatternNames(decl?.id, scope)\n // 遍历初始化表达式\n if (decl?.init) walkNode(decl.init, scope, depth + 1)\n // 遍历 pattern 本身(解构默认值等)\n walkPattern(decl?.id, scope, depth + 1)\n }\n return\n }\n\n // ── 块语句 ──\n case 'BlockStatement': {\n const blockScope = createScope(scope)\n collectDeclarations(node.body ?? [], blockScope)\n for (const child of node.body ?? []) walkNode(child, blockScope, depth + 1)\n return\n }\n\n // ── 控制流 ──\n case 'IfStatement':\n walkNode(node.test, scope, depth + 1)\n walkNode(node.consequent, scope, depth + 1)\n if (node.alternate) walkNode(node.alternate, scope, depth + 1)\n return\n\n case 'ForStatement': {\n const forScope = createScope(scope)\n if (node.init) {\n // for(let i=...) 的 i 入 forScope\n if (node.init.type === 'VariableDeclaration') {\n for (const decl of node.init.declarations ?? []) {\n collectPatternNames(decl?.id, forScope)\n walkNode(decl, forScope, depth + 1)\n }\n } else {\n walkNode(node.init, forScope, depth + 1)\n }\n }\n if (node.test) walkNode(node.test, forScope, depth + 1)\n if (node.update) walkNode(node.update, forScope, depth + 1)\n // S5: 无界循环告警\n if (node.test === null || node.test === undefined) {\n warnings.push({\n ruleId: 'SEC_LIMIT',\n lineNo: lineOf(node),\n name: 'for(;;)',\n message: 'unbounded for loop (no test condition) — may hang',\n })\n }\n if (node.body) walkNode(node.body, forScope, depth + 1)\n return\n }\n\n case 'ForInStatement':\n case 'ForOfStatement': {\n const forScope = createScope(scope)\n if (node.left?.type === 'VariableDeclaration') {\n for (const decl of node.left.declarations ?? []) {\n collectPatternNames(decl?.id, forScope)\n walkNode(decl, forScope, depth + 1)\n }\n } else if (node.left?.type === 'Identifier') {\n forScope.names.add(node.left.name)\n }\n if (node.right) walkNode(node.right, forScope, depth + 1)\n if (node.body) walkNode(node.body, forScope, depth + 1)\n return\n }\n\n case 'WhileStatement':\n walkNode(node.test, scope, depth + 1)\n // S5: while(true) 告警\n if (node.test?.type === 'Literal' && node.test.value === true) {\n warnings.push({\n ruleId: 'SEC_LIMIT',\n lineNo: lineOf(node),\n name: 'while(true)',\n message: 'unbounded while(true) loop — may hang',\n })\n }\n if (node.body) walkNode(node.body, scope, depth + 1)\n return\n\n case 'DoWhileStatement':\n if (node.body) walkNode(node.body, scope, depth + 1)\n walkNode(node.test, scope, depth + 1)\n if (node.test?.type === 'Literal' && node.test.value === true) {\n warnings.push({\n ruleId: 'SEC_LIMIT',\n lineNo: lineOf(node),\n name: 'do...while(true)',\n message: 'unbounded do...while(true) loop — may hang',\n })\n }\n return\n\n case 'SwitchStatement': {\n const swScope = createScope(scope)\n walkNode(node.discriminant, scope, depth + 1)\n for (const c of node.cases ?? []) {\n if (c.test) walkNode(c.test, swScope, depth + 1)\n for (const stmt of c.consequent ?? []) walkNode(stmt, swScope, depth + 1)\n }\n return\n }\n\n case 'TryStatement': {\n walkNode(node.block, scope, depth + 1)\n if (node.handler) {\n const handlerScope = createScope(scope)\n if (node.handler.param) collectPatternNames(node.handler.param, handlerScope)\n if (node.handler.param) walkNode(node.handler.param, handlerScope, depth + 1)\n walkNode(node.handler.body, handlerScope, depth + 1)\n }\n if (node.finalizer) walkNode(node.finalizer, scope, depth + 1)\n return\n }\n\n case 'CatchClause': {\n const catchScope = createScope(scope)\n if (node.param) {\n collectPatternNames(node.param, catchScope)\n walkNode(node.param, catchScope, depth + 1)\n }\n collectDeclarations(node.body?.body ?? [], catchScope)\n if (node.body) walkNode(node.body, catchScope, depth + 1)\n return\n }\n\n // ── LabeledStatement ──\n case 'LabeledStatement':\n if (node.body) walkNode(node.body, scope, depth + 1)\n return\n\n // ── Return / Throw ──\n case 'ReturnStatement':\n case 'ThrowStatement':\n if (node.argument) walkNode(node.argument, scope, depth + 1)\n return\n\n // ── ExpressionStatement ──\n case 'ExpressionStatement':\n walkNode(node.expression, scope, depth + 1)\n return\n\n // ── 表达式 ──\n case 'Identifier': {\n const name = node.name\n // S1 危险标识符黑名单\n if (s1Idents.has(name)) {\n addViolation('SEC_IDENT', lineOf(node), name, `[security] SEC_IDENT line ${lineOf(node)}: \"${name}\" is not allowed`)\n return\n }\n // S4 自由标识符白名单判定\n if (scopeHas(scope, name) || knownNames.has(name) || S4_SAFE_GLOBALS.has(name)) {\n return\n }\n // 未声明的自由标识符\n addViolation('SEC_FREE_IDENT', lineOf(node), name, `[security] SEC_FREE_IDENT line ${lineOf(node)}: unknown identifier \"${name}\" (not declared, not a known namespace)`)\n return\n }\n\n case 'MemberExpression': {\n // S1 优先于一切:先遍历 object(让 Identifier 先命中 S1/S4),\n // 再检查 S3 危险成员名。这样 globalThis.eval 先命中 SEC_IDENT(globalThis)。\n walkNode(node.object, scope, depth + 1)\n if (node.computed && node.property?.type !== 'Literal') {\n walkNode(node.property, scope, depth + 1)\n }\n // S3 危险成员名(在 object 遍历后检查,确保 S1 优先级)\n const propName = node.property?.type === 'Identifier' ? node.property.name\n : node.property?.type === 'Literal' ? String(node.property.value)\n : null\n if (propName && S3_MEMBERS.has(propName)) {\n addViolation('SEC_MEMBER', lineOf(node), propName, `[security] SEC_MEMBER line ${lineOf(node)}: dangerous member \"${propName}\"`)\n }\n return\n }\n\n case 'CallExpression':\n walkNode(node.callee, scope, depth + 1)\n for (const arg of node.arguments ?? []) walkNode(arg, scope, depth + 1)\n return\n\n case 'NewExpression':\n walkNode(node.callee, scope, depth + 1)\n for (const arg of node.arguments ?? []) walkNode(arg, scope, depth + 1)\n return\n\n case 'AssignmentExpression': {\n // S7 命名空间保护:禁止对 s7Names 中的名字做赋值\n const target = node.left\n if (target?.type === 'Identifier' && s7Names.has(target.name)) {\n addViolation('SEC_NS_ASSIGN', lineOf(node), target.name, `[security] SEC_NS_ASSIGN line ${lineOf(node)}: cannot assign to namespace \"${target.name}\"`)\n }\n // P6: SEC_RESERVED_ASSIGN — cannot assign to reserved unit constant names\n if (target?.type === 'Identifier' && RESERVED_UNIT_NAMES.has(target.name)) {\n addViolation('SEC_RESERVED_ASSIGN', lineOf(node), target.name, `[security] SEC_RESERVED_ASSIGN line ${lineOf(node)}: cannot assign to reserved unit name \"${target.name}\"`)\n }\n // MemberExpression 赋值:cad.box = ...\n if (target?.type === 'MemberExpression' && target.object?.type === 'Identifier' && s7Names.has(target.object.name)) {\n addViolation('SEC_NS_ASSIGN', lineOf(node), target.object.name, `[security] SEC_NS_ASSIGN line ${lineOf(node)}: cannot assign to member of namespace \"${target.object.name}\"`)\n }\n walkNode(node.left, scope, depth + 1)\n walkNode(node.right, scope, depth + 1)\n return\n }\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n walkNode(node.left, scope, depth + 1)\n walkNode(node.right, scope, depth + 1)\n return\n\n case 'UnaryExpression':\n case 'UpdateExpression':\n walkNode(node.argument, scope, depth + 1)\n return\n\n case 'ConditionalExpression':\n walkNode(node.test, scope, depth + 1)\n walkNode(node.consequent, scope, depth + 1)\n walkNode(node.alternate, scope, depth + 1)\n return\n\n case 'ArrayExpression':\n for (const el of node.elements ?? []) {\n if (el) walkNode(el, scope, depth + 1)\n }\n return\n\n case 'ObjectExpression':\n for (const prop of node.properties ?? []) {\n if (prop?.type === 'Property') {\n // key 是标识符且非 computed → 不需要检查(对象字面量 key 不是标识符引用)\n if (prop.computed && prop.key) walkNode(prop.key, scope, depth + 1)\n if (prop.value) walkNode(prop.value, scope, depth + 1)\n } else {\n // SpreadElement 等\n walkNode(prop, scope, depth + 1)\n }\n }\n return\n\n case 'TemplateLiteral':\n for (const expr of node.expressions ?? []) walkNode(expr, scope, depth + 1)\n return\n\n case 'TaggedTemplateExpression':\n // S2 已在上方判定;仍遍历 tag 与 quasi\n walkNode(node.tag, scope, depth + 1)\n if (node.quasi) walkNode(node.quasi, scope, depth + 1)\n return\n\n case 'AwaitExpression':\n if (node.argument) walkNode(node.argument, scope, depth + 1)\n return\n\n case 'YieldExpression':\n if (node.argument) walkNode(node.argument, scope, depth + 1)\n return\n\n case 'SpreadElement':\n if (node.argument) walkNode(node.argument, scope, depth + 1)\n return\n\n case 'SequenceExpression':\n for (const expr of node.expressions ?? []) walkNode(expr, scope, depth + 1)\n return\n\n case 'ParenthesizedExpression':\n if (node.expression) walkNode(node.expression, scope, depth + 1)\n return\n\n case 'ChainExpression':\n if (node.expression) walkNode(node.expression, scope, depth + 1)\n return\n\n case 'MetaProperty':\n // S2 已在上方判定(import.meta / new.target)\n return\n\n case 'ImportExpression':\n // S2 已在上方判定(动态 import())\n for (const arg of node.arguments ?? []) walkNode(arg, scope, depth + 1)\n return\n\n case 'ClassDeclaration':\n case 'ClassExpression': {\n if (node.id?.name && scope) scope.names.add(node.id.name)\n const clsScope = createScope(scope)\n if (node.superClass) walkNode(node.superClass, clsScope, depth + 1)\n if (node.body) walkNode(node.body, clsScope, depth + 1)\n return\n }\n\n case 'ClassBody':\n for (const method of node.body ?? []) {\n walkNode(method, scope, depth + 1)\n }\n return\n\n case 'MethodDefinition':\n case 'PropertyDefinition':\n if (node.key && node.computed) walkNode(node.key, scope, depth + 1)\n if (node.value) walkNode(node.value, scope, depth + 1)\n return\n\n case 'WithStatement':\n // S2 已判定\n walkNode(node.object, scope, depth + 1)\n if (node.body) walkNode(node.body, scope, depth + 1)\n return\n\n case 'DebuggerStatement':\n // S2 已判定\n return\n\n case 'ContinueStatement':\n case 'BreakStatement':\n return\n\n case 'EmptyStatement':\n return\n\n case 'Literal':\n return\n\n case 'Super':\n return\n\n case 'ThisExpression':\n return\n\n case 'ImportSpecifier':\n case 'ImportDefaultSpecifier':\n case 'ImportNamespaceSpecifier':\n return\n\n case 'ExportSpecifier':\n return\n\n default:\n // 未知节点:递归遍历其子属性\n walkChildren(node, scope, depth)\n return\n }\n }\n\n function walkPattern(pattern: ASTNode, scope: Scope | null, depth: number): void {\n if (!pattern) return\n switch (pattern.type) {\n case 'Identifier':\n return // 已在 collectPatternNames 中登记\n case 'ObjectPattern':\n for (const prop of pattern.properties ?? []) {\n if (prop?.type === 'Property') {\n if (prop.computed && prop.key) walkNode(prop.key, scope, depth + 1)\n if (prop.value) walkPattern(prop.value, scope, depth + 1)\n } else if (prop?.type === 'RestElement') {\n walkPattern(prop.argument, scope, depth + 1)\n }\n }\n return\n case 'ArrayPattern':\n for (const el of pattern.elements ?? []) {\n if (el) walkPattern(el, scope, depth + 1)\n }\n return\n case 'AssignmentPattern':\n if (pattern.right) walkNode(pattern.right, scope, depth + 1)\n walkPattern(pattern.left, scope, depth + 1)\n return\n case 'RestElement':\n walkPattern(pattern.argument, scope, depth + 1)\n return\n default:\n return\n }\n }\n\n function walkChildren(node: ASTNode, scope: Scope | null, depth: number): void {\n for (const key of Object.keys(node)) {\n if (key === 'loc' || key === 'start' || key === 'end' || key === 'range' || key === 'parent' || key === 'type') continue\n const v = (node as Record<string, unknown>)[key]\n if (Array.isArray(v)) {\n for (const item of v) {\n if (item && typeof item === 'object' && 'type' in item) {\n walkNode(item as ASTNode, scope, depth + 1)\n }\n }\n } else if (v && typeof v === 'object' && 'type' in v) {\n walkNode(v as ASTNode, scope, depth + 1)\n }\n }\n }\n}\n\n// ── 类型别名 ──\ntype ASTNode = any\n\n// ── 门禁断言 ──\n\n/**\n * 门禁断言:violations 非空则抛 ParseError(code='E_SECURITY',ruleId 挂 ParseError.ruleId)。\n * 三处接入点(A1/A2/A3)统一用它。\n *\n * @param code - the .fai.js source text (raw, un-wrapped).\n * @param opts - scan options (policy is required).\n * @throws ParseError — when violations are non-empty (code='E_SECURITY').\n */\nexport function assertSecure(code: string, opts: SecurityScanOptions): void {\n const result = scanSource(code, opts)\n if (result.violations.length > 0) {\n const v = result.violations[0]\n throw new ParseError(\n v.message,\n v.lineNo,\n 'E_SECURITY',\n undefined,\n v.ruleId,\n )\n }\n}\n"]}
1
+ {"version":3,"file":"security-scanner.js","sourceRoot":"","sources":["../../src/lang/security-scanner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * security-scanner — .fai.js 静态安全门禁(纵深防御第一层)\n *\n * 定位:在 MetadataExtractor(UI 通道)与 DirectExecutor(执行通道)之前\n * 对源码做 **AST 全量递归遍历**,覆盖函数体、控制流块、嵌套函数——消除\n * 当前\"只扫顶层\"的盲区。规则表与功能代码解耦(R6):新增 op / 新增语法\n * 形态不需要改扫描器,只有\"新增被禁能力\"才改规则表(数据)。\n *\n * 判定模型 = 能力黑名单(S1)+ 危险语法(S2)+ 危险成员名(S3)+\n * 自由标识符白名单(S4)+ 结构上限(S5)+ 命名空间保护(S7)。\n *\n * 诚实边界(D9):静态门禁 ≠ 沙箱。无法拦截拼接属性名 `g['ev'+'al']`、\n * 字符串内代码、已获引用二次调用。本方案通过切断能力来源(S4)使残留\n * 失去立足点,但不宣称等价隔离。\n */\n\nimport { parse as acornParse } from 'acorn'\nimport type { Program } from 'acorn'\nimport { ParseError } from './parse-error'\n\n// ── 类型 ──\n\n/** 安全策略档位。strict = 默认(全规则);balanced = 本机 CLI;off = 受控调试。 */\nexport type SecurityPolicy = 'strict' | 'balanced' | 'off'\n\n/** SecurityScanner 规则 ID(封闭集合,禁止自造;测试按此断言)。 */\nexport type SecurityRuleId =\n | 'SEC_IDENT'\n | 'SEC_SYNTAX'\n | 'SEC_MEMBER'\n | 'SEC_FREE_IDENT'\n | 'SEC_LIMIT'\n | 'SEC_NS_ASSIGN'\n | 'SEC_RESERVED_ASSIGN'\n\n/** 违规条目。 */\nexport interface SecurityViolation {\n /** 规则 ID(见 SecurityRuleId 枚举) */\n ruleId: SecurityRuleId\n /** 1-based 行号,相对传入的原始源码文本(Scanner 不做任何包裹/偏移) */\n lineNo: number\n /** 命中的标识符名 / 属性名 / 节点类型(无则省略) */\n name?: string\n /** 人类可读消息(AI 自纠用) */\n message: string\n}\n\n/** 扫描选项。 */\nexport interface SecurityScanOptions {\n /**\n * 策略档位。**必填**——不允许缺省,调用方必须显式声明(防止无意间关闭门禁)。\n */\n policy: SecurityPolicy\n /**\n * 额外合法名字(S4 判定用:不在 knownNames 也不在 S4_SAFE_GLOBALS → SEC_FREE_IDENT)。\n * 调用方可不传——Scanner 始终自动收集:\n * ① 源码内全部 `ImportDeclaration` 的本地绑定名(named / namespace / default);\n * ② `opts.defaultNs ?? 'cad'`。\n * 本字段只用于补充\"源码里看不到的名字\"。\n */\n knownNames?: string[]\n /**\n * 命名空间保护名(S7 判定用:对此列表中的名字做赋值 → SEC_NS_ASSIGN)。\n * 缺省 = knownNames(即所有 knownNames 都受 S7 保护)。\n * 调用方在 append 场景中可传一个更小的集合(仅命名空间名,不含 ctx 普通变量)。\n */\n nsNames?: string[]\n /** 默认命名空间名,缺省 'cad'(自动进入 knownNames) */\n defaultNs?: string\n}\n\n/** 扫描结果。 */\nexport interface SecurityScanResult {\n /** true 当且仅当 violations 为空 */\n ok: boolean\n /** 命中即拒的条目;非空 → 调用方拒绝 */\n violations: SecurityViolation[]\n /** 只告警不拒(目前只有 S5 无界循环) */\n warnings: SecurityViolation[]\n}\n\n// ── 规则表(数据驱动,新增规则不改遍历器) ──\n\n/**\n * S1 危险标识符黑名单(引用即拒,不区分读写、不区分声明位置)。\n * S1 优先于一切:即使用户用这些名字声明了自己的变量,也照样拒绝。\n */\nconst S1_IDENTS = new Set<string>([\n // 执行任意代码\n 'eval', 'Function', 'AsyncFunction', 'GeneratorFunction', 'AsyncGeneratorFunction',\n // 全局逃逸\n 'globalThis', 'window', 'self', 'top', 'parent', 'frames',\n // Node 宿主\n 'process', 'require', 'module', 'exports', '__dirname', '__filename',\n // 网络\n 'fetch', 'XMLHttpRequest', 'WebSocket', 'EventSource', 'navigator', 'sendBeacon',\n // 浏览器存储/DOM\n 'localStorage', 'sessionStorage', 'indexedDB', 'caches', 'document', 'location', 'cookie',\n // 动态装载\n 'importScripts', 'Worker', 'SharedWorker', 'WebAssembly',\n // 定时器/微任务(混淆与延时外发)——仅 strict\n 'setTimeout', 'setInterval', 'setImmediate', 'queueMicrotask', 'requestAnimationFrame',\n // 元编程(原型污染族)——仅 strict\n 'Reflect', 'Proxy', 'crypto',\n])\n\n/** S1 中仅在 strict 档生效的标识符集合。 */\nconst S1_STRICT_ONLY = new Set<string>([\n 'setTimeout', 'setInterval', 'setImmediate', 'queueMicrotask', 'requestAnimationFrame',\n 'Reflect', 'Proxy', 'crypto',\n])\n\n/**\n * S2 危险语法节点黑名单。\n * key = AST node type;value = true 表示仅 strict 档生效。\n */\nconst S2_SYNTAX: Record<string, boolean> = {\n ImportExpression: false, // 动态 import() — strict + balanced\n WithStatement: false, // with — strict + balanced\n DebuggerStatement: false, // debugger — strict + balanced\n TaggedTemplateExpression: true, // 标签模板 — 仅 strict\n MetaProperty: false, // import.meta / new.target — strict + balanced\n}\n\n/**\n * S3 危险成员属性名黑名单(MemberExpression.property 的名字命中即拒)。\n */\nconst S3_MEMBERS = new Set<string>([\n // 原型污染\n '__proto__', 'constructor', 'prototype',\n // getter/setter 注入\n '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__',\n // 对象元编程\n 'setPrototypeOf', 'defineProperty', 'defineGetter', 'defineSetter',\n // 求值(x.eval 形式)\n 'eval',\n])\n\n/**\n * S4 安全全局白名单(固定清单,strict 与 balanced 相同)。\n * 不在此名单且不在已声明/knownNames 中的标识符 → SEC_FREE_IDENT 拒绝。\n * 导出供解释器后端(cad-runtime/interp/env.ts)做同序解析。\n *\n * A4(2026-10-06)口径指认:本清单回答「这个裸标识符是否被**安全门禁**允许\n * (免 import)」。它不是 `lang/determinism-scanner.ts` 里 SAFE_CONTAINERS /\n * SAFE_FUNCTIONS 的超集或子集——那边回答的是另一个问题(成员调用是否传播\n * 污点,含 Intl / Reflect / encodeURI 等本名单不放行的名字)。禁止用对方的\n * 名字反推本清单语义;扩边(放行 Intl / Reflect / URI 编解码)属安全面策略\n * 决定,须先拍板再改。\n */\nexport const S4_SAFE_GLOBALS = new Set<string>([\n 'Math', 'Number', 'String', 'Boolean', 'Array', 'Object', 'JSON', 'Date',\n 'Map', 'Set', 'Promise', 'Symbol', 'RegExp', 'Error',\n 'Infinity', 'NaN', 'undefined',\n 'parseInt', 'parseFloat', 'isNaN', 'isFinite',\n 'console',\n // P6/D7: script-side unit constants (MM, INCH, DEGREE, …) are read-only globals.\n // Values registered on globalThis by the runtime; SEC_RESERVED_ASSIGN (P6) prevents\n // shadowing. The name set lives in units.ts (SCRIPT_UNIT_NAMES) but the literal\n // list is duplicated here because lang/ must not create a runtime dependency on\n // units.ts (type-only import is fine, but S4_SAFE_GLOBALS is a runtime Set).\n // Names are UPPERCASE to avoid collisions with user variable names.\n 'MM', 'CM', 'METER', 'MICRON', 'INCH', 'FOOT', 'YARD',\n 'DEGREE', 'RADIAN', 'GRAM', 'KILOGRAM', 'SECOND',\n])\n\n/**\n * 裸标识符是否命中「免 import 的安全全局」——`Math` / `JSON` / `Number` /\n * `console` / `Infinity` / `NaN` / `undefined` / `parseInt` / … 以及单位常量\n * `MM` / `INCH` / `DEGREE` / …(单位常量是 S4_SAFE_GLOBALS 的子集)。\n *\n * ⚠️ 这是**唯一**判定入口。该知识历史上散落在六处,其中四处只内联了单位常量表\n * (`SCRIPT_UNIT_NAMES`)而漏掉 `S4_SAFE_GLOBALS`,于是同一份代码在安全门禁放行、\n * 在提取层却抛 `E_REFERENCE`(2026-10-06 修复 `cad.box(Math.max(x, 20), 1, 1)`\n * 整脚本不可执行):\n * - `lang/security-scanner.ts`(S4 门禁) → 完整\n * - `cad-runtime/interp/env.ts`(解释器后端) → 完整\n * - `lang/metadata-extractor.ts`(提取/校验 ×3 处) → 漏 → 已改调本函数\n * - `cad-runtime/direct-executor.ts`(前缀校验/发射) → 漏 → 已改调本函数\n * - `lang/code-to-args.ts`(单行提取哨兵) → 漏 → 已改调本函数\n *\n * 新增判定点请一律调用本函数,**不要**再复制名单。\n * @param name 待判定的裸标识符名。\n * @returns 是免 import 安全全局 → true。\n */\nexport function isSafeGlobalIdent(name: string): boolean {\n return S4_SAFE_GLOBALS.has(name)\n}\n\n/**\n * P6/D7: Reserved unit constant names — cannot be used as declaration names\n * (let/const/var/param/function) or assignment targets.\n * This is a subset of S4_SAFE_GLOBALS (the unit constants only, not Math/Number/etc).\n * SEC_RESERVED_ASSIGN prevents scripts from shadowing unit constants like\n * `INCH = 999` or `let MM = 3`, which would silently corrupt geometry.\n */\nexport const RESERVED_UNIT_NAMES = new Set<string>([\n 'MM', 'CM', 'METER', 'MICRON', 'INCH', 'FOOT', 'YARD',\n 'DEGREE', 'RADIAN', 'GRAM', 'KILOGRAM', 'SECOND',\n])\n\n// S5 结构上限\nconst S5_MAX_SOURCE_LEN = 1 * 1024 * 1024 // 1 MiB\nconst S5_MAX_TOP_STATEMENTS = 5000\nconst S5_MAX_NODES = 200_000\nconst S5_MAX_DEPTH = 100\n\n// S6 子模块装载上限\n\n/** S6 子模块装载深度上限(A3:ModuleRegistry 静态守卫)。 */\nexport const S6_MAX_DEPTH = 16\n/** S6 子模块装载总数上限(A3:ModuleRegistry 静态守卫)。 */\nexport const S6_MAX_MODULES = 64\n\n// ── 作用域管理 ──\n\ninterface Scope {\n /** 本层已声明的名字(var/let/const、函数参数、函数名、解构名、catch 参数、循环绑定) */\n names: Set<string>\n /** 子作用域 */\n parent: Scope | null\n}\n\nfunction createScope(parent: Scope | null): Scope {\n return { names: new Set<string>(), parent }\n}\n\nfunction scopeHas(scope: Scope | null, name: string): boolean {\n let s: Scope | null = scope\n while (s) {\n if (s.names.has(name)) return true\n s = s.parent\n }\n return false\n}\n\n// ── 收集 import 绑定名 ──\n\n/** 从 Program.body 收集全部 ImportDeclaration 的本地绑定名。 */\nfunction collectImportBindings(ast: Program): string[] {\n const out: string[] = []\n const body = (ast as unknown as { body: unknown[] }).body\n for (const node of body) {\n const n = node as { type?: string; specifiers?: unknown[] }\n if (n.type !== 'ImportDeclaration') continue\n for (const spec of n.specifiers ?? []) {\n const s = spec as { local?: { name?: string } }\n if (s.local?.name) out.push(s.local.name)\n }\n }\n return out\n}\n\n// ── 主扫描器 ──\n\n/**\n * 全量扫描源码文本(返回全部违规)。\n * policy==='off' 时直接返回 `{ ok:true, violations:[], warnings:[] }`。\n * 解析失败时(acorn SyntaxError)不包装不抛——交给调用方的主 acornParse 路径\n * 包装为 E_SYNTAX(Scanner 不重复定义语法错误)。\n *\n * @param code - the .fai.js source text (raw, un-wrapped).\n * @param opts - scan options (policy is required).\n * @returns the full scan result (violations + warnings).\n */\nexport function scanSource(code: string, opts: SecurityScanOptions): SecurityScanResult {\n if (opts.policy === 'off') {\n return { ok: true, violations: [], warnings: [] }\n }\n\n // S5: source length check (before parsing)\n if (code.length > S5_MAX_SOURCE_LEN) {\n return {\n ok: false,\n violations: [{\n ruleId: 'SEC_LIMIT',\n lineNo: 1,\n message: `source too long (${code.length} > ${S5_MAX_SOURCE_LEN} bytes)`,\n }],\n warnings: [],\n }\n }\n\n let ast: Program\n try {\n ast = acornParse(code, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n locations: true,\n }) as unknown as Program\n } catch {\n // acorn SyntaxError → 交给调用方的主 acornParse 路径包装为 E_SYNTAX。\n // Scanner 返回 ok=true(无安全违规),让语法错误路径正常处理。\n return { ok: true, violations: [], warnings: [] }\n }\n return scanAst(ast, opts)\n}\n\n/**\n * 复用已解析的 AST 进行扫描(避免二次解析)。语义与 scanSource 完全一致。\n *\n * @param ast - the pre-parsed Program AST (with locations enabled).\n * @param opts - scan options (policy is required).\n * @returns the full scan result (violations + warnings).\n */\nexport function scanAst(ast: Program, opts: SecurityScanOptions): SecurityScanResult {\n if (opts.policy === 'off') {\n return { ok: true, violations: [], warnings: [] }\n }\n\n const policy = opts.policy\n const defaultNs = opts.defaultNs ?? 'cad'\n const violations: SecurityViolation[] = []\n const warnings: SecurityViolation[] = []\n\n // 自动收集 import 绑定名 + defaultNs\n const importNames = collectImportBindings(ast)\n const knownNames = new Set<string>([defaultNs, ...importNames])\n for (const n of opts.knownNames ?? []) knownNames.add(n)\n\n // S7 命名空间保护名:缺省 = knownNames(即所有 knownNames 都受 S7 保护);\n // 调用方可通过 nsNames 指定更小的集合(仅命名空间名,不含 ctx 普通变量)。\n const s7Names = opts.nsNames ? new Set(opts.nsNames) : knownNames\n\n // S5 结构上限 —— 判定在遍历前\n const body = (ast as unknown as { body: unknown[] }).body\n if (body.length > S5_MAX_TOP_STATEMENTS) {\n violations.push({\n ruleId: 'SEC_LIMIT',\n lineNo: 1,\n message: `too many top-level statements (${body.length} > ${S5_MAX_TOP_STATEMENTS})`,\n })\n }\n\n // 准备 strict-only 集合\n const s1Idents = new Set<string>()\n for (const id of S1_IDENTS) {\n if (S1_STRICT_ONLY.has(id) && policy !== 'strict') continue\n s1Idents.add(id)\n }\n\n const s2Syntax: Record<string, boolean> = {}\n for (const [k, strictOnly] of Object.entries(S2_SYNTAX)) {\n if (strictOnly && policy !== 'strict') continue\n s2Syntax[k] = strictOnly\n }\n\n let nodeCount = 0\n\n // 顶层作用域:收集 import 绑定名(已在 knownNames),以及 body 级声明\n const globalScope = createScope(null)\n for (const n of importNames) globalScope.names.add(n)\n\n // 遍历 AST\n walkNode(ast as unknown as ASTNode, null, 0)\n\n if (nodeCount > S5_MAX_NODES) {\n violations.push({\n ruleId: 'SEC_LIMIT',\n lineNo: 1,\n message: `too many AST nodes (${nodeCount} > ${S5_MAX_NODES})`,\n })\n }\n\n return {\n ok: violations.length === 0,\n violations,\n warnings,\n }\n\n // ── 递归 walker ──\n\n function lineOf(node: ASTNode): number {\n return node?.loc?.start?.line ?? 1\n }\n\n function addViolation(ruleId: SecurityRuleId, lineNo: number, name: string, message: string): void {\n violations.push({ ruleId, lineNo, name, message })\n }\n\n /**\n * 收集函数参数中的声明名(含默认参数、解构)。\n */\n function collectParamNames(params: ASTNode[], scope: Scope): void {\n for (const p of params ?? []) {\n collectPatternNames(p, scope)\n }\n }\n\n /**\n * 从解构/标识符模式收集名字(用于作用域登记)。\n * P6: If a pattern name is a reserved unit constant, emits SEC_RESERVED_ASSIGN.\n */\n function collectPatternNames(pattern: ASTNode, scope: Scope): void {\n if (!pattern) return\n switch (pattern.type) {\n case 'Identifier':\n // P6/SEC_RESERVED_ASSIGN: reserved unit names cannot be declared\n if (RESERVED_UNIT_NAMES.has(pattern.name)) {\n addViolation('SEC_RESERVED_ASSIGN', lineOf(pattern), pattern.name,\n `[security] SEC_RESERVED_ASSIGN line ${lineOf(pattern)}: cannot declare reserved unit name \"${pattern.name}\"`)\n }\n scope.names.add(pattern.name)\n return\n case 'ObjectPattern':\n for (const prop of pattern.properties ?? []) {\n if (prop?.type === 'Property') collectPatternNames(prop.value, scope)\n else if (prop?.type === 'RestElement') collectPatternNames(prop.argument, scope)\n }\n return\n case 'ArrayPattern':\n for (const el of pattern.elements ?? []) {\n if (el) collectPatternNames(el, scope)\n }\n return\n case 'AssignmentPattern':\n collectPatternNames(pattern.left, scope)\n return\n case 'RestElement':\n collectPatternNames(pattern.argument, scope)\n return\n default:\n return\n }\n }\n\n /**\n * 收集一个节点体内全部声明名(VariableDeclarator + FunctionDeclaration 等)。\n * 用于函数体 / 块体遍历前先登记声明(提升语义)。\n */\n function collectDeclarations(body: ASTNode[], scope: Scope): void {\n for (const node of body ?? []) {\n if (!node) continue\n switch (node.type) {\n case 'VariableDeclaration':\n for (const decl of node.declarations ?? []) {\n collectPatternNames(decl?.id, scope)\n }\n break\n case 'FunctionDeclaration':\n case 'ClassDeclaration':\n if (node.id?.type === 'Identifier') {\n // P6/SEC_RESERVED_ASSIGN: reserved unit names cannot be function/class names\n if (RESERVED_UNIT_NAMES.has(node.id.name)) {\n addViolation('SEC_RESERVED_ASSIGN', lineOf(node), node.id.name,\n `[security] SEC_RESERVED_ASSIGN line ${lineOf(node)}: cannot declare reserved unit name \"${node.id.name}\"`)\n }\n scope.names.add(node.id.name)\n }\n break\n default:\n break\n }\n }\n }\n\n function walkNode(node: ASTNode, scope: Scope | null, depth: number): void {\n if (!node || typeof node !== 'object') return\n\n nodeCount++\n if (depth > S5_MAX_DEPTH) {\n addViolation('SEC_LIMIT', lineOf(node), node.type ?? 'unknown', `AST nesting depth exceeds ${S5_MAX_DEPTH}`)\n return\n }\n\n // ── S2 危险语法节点 ──\n if (s2Syntax[node.type] !== undefined) {\n addViolation('SEC_SYNTAX', lineOf(node), node.type, `[security] dangerous syntax: ${node.type}`)\n // 继续遍历子节点(可能内部有更多违规),但不中断\n }\n\n // 按节点类型处理\n switch (node.type) {\n // ── Program ──\n case 'Program': {\n const programBody = node.body as ASTNode[]\n collectDeclarations(programBody, scope ?? globalScope)\n for (const child of programBody) walkNode(child, scope ?? globalScope, depth + 1)\n return\n }\n\n // ── Import 声明:不遍历(绑定已自动收集) ──\n case 'ImportDeclaration':\n return\n\n // ── Export 声明 ──\n case 'ExportDefaultDeclaration':\n walkNode(node.declaration, scope, depth + 1)\n return\n case 'ExportNamedDeclaration':\n if (node.declaration) walkNode(node.declaration, scope, depth + 1)\n return\n\n // ── 函数声明 ──\n case 'FunctionDeclaration':\n case 'FunctionExpression':\n case 'ArrowFunctionExpression': {\n // 函数名在父作用域(FunctionDeclaration 提升到父层)\n if (node.type === 'FunctionDeclaration' && node.id?.name && scope) {\n // P6/SEC_RESERVED_ASSIGN: reserved unit names cannot be function names\n if (RESERVED_UNIT_NAMES.has(node.id.name)) {\n addViolation('SEC_RESERVED_ASSIGN', lineOf(node), node.id.name,\n `[security] SEC_RESERVED_ASSIGN line ${lineOf(node)}: cannot declare reserved unit name \"${node.id.name}\"`)\n }\n scope.names.add(node.id.name)\n }\n const fnScope = createScope(scope)\n collectParamNames(node.params ?? [], fnScope)\n // 函数体提升:先收集体内全部声明\n if (node.body?.type === 'BlockStatement') {\n collectDeclarations(node.body.body ?? [], fnScope)\n }\n // 遍历参数(含默认值)\n for (const p of node.params ?? []) walkNode(p, fnScope, depth + 1)\n // 遍历函数体\n if (node.body) walkNode(node.body, fnScope, depth + 1)\n return\n }\n\n // ── 变量声明 ──\n case 'VariableDeclaration': {\n for (const decl of node.declarations ?? []) {\n // 声明名登记(pattern 里的名字入当前 scope)\n if (scope) collectPatternNames(decl?.id, scope)\n // 遍历初始化表达式\n if (decl?.init) walkNode(decl.init, scope, depth + 1)\n // 遍历 pattern 本身(解构默认值等)\n walkPattern(decl?.id, scope, depth + 1)\n }\n return\n }\n\n // ── 块语句 ──\n case 'BlockStatement': {\n const blockScope = createScope(scope)\n collectDeclarations(node.body ?? [], blockScope)\n for (const child of node.body ?? []) walkNode(child, blockScope, depth + 1)\n return\n }\n\n // ── 控制流 ──\n case 'IfStatement':\n walkNode(node.test, scope, depth + 1)\n walkNode(node.consequent, scope, depth + 1)\n if (node.alternate) walkNode(node.alternate, scope, depth + 1)\n return\n\n case 'ForStatement': {\n const forScope = createScope(scope)\n if (node.init) {\n // for(let i=...) 的 i 入 forScope\n if (node.init.type === 'VariableDeclaration') {\n for (const decl of node.init.declarations ?? []) {\n collectPatternNames(decl?.id, forScope)\n walkNode(decl, forScope, depth + 1)\n }\n } else {\n walkNode(node.init, forScope, depth + 1)\n }\n }\n if (node.test) walkNode(node.test, forScope, depth + 1)\n if (node.update) walkNode(node.update, forScope, depth + 1)\n // S5: 无界循环告警\n if (node.test === null || node.test === undefined) {\n warnings.push({\n ruleId: 'SEC_LIMIT',\n lineNo: lineOf(node),\n name: 'for(;;)',\n message: 'unbounded for loop (no test condition) — may hang',\n })\n }\n if (node.body) walkNode(node.body, forScope, depth + 1)\n return\n }\n\n case 'ForInStatement':\n case 'ForOfStatement': {\n const forScope = createScope(scope)\n if (node.left?.type === 'VariableDeclaration') {\n for (const decl of node.left.declarations ?? []) {\n collectPatternNames(decl?.id, forScope)\n walkNode(decl, forScope, depth + 1)\n }\n } else if (node.left?.type === 'Identifier') {\n forScope.names.add(node.left.name)\n }\n if (node.right) walkNode(node.right, forScope, depth + 1)\n if (node.body) walkNode(node.body, forScope, depth + 1)\n return\n }\n\n case 'WhileStatement':\n walkNode(node.test, scope, depth + 1)\n // S5: while(true) 告警\n if (node.test?.type === 'Literal' && node.test.value === true) {\n warnings.push({\n ruleId: 'SEC_LIMIT',\n lineNo: lineOf(node),\n name: 'while(true)',\n message: 'unbounded while(true) loop — may hang',\n })\n }\n if (node.body) walkNode(node.body, scope, depth + 1)\n return\n\n case 'DoWhileStatement':\n if (node.body) walkNode(node.body, scope, depth + 1)\n walkNode(node.test, scope, depth + 1)\n if (node.test?.type === 'Literal' && node.test.value === true) {\n warnings.push({\n ruleId: 'SEC_LIMIT',\n lineNo: lineOf(node),\n name: 'do...while(true)',\n message: 'unbounded do...while(true) loop — may hang',\n })\n }\n return\n\n case 'SwitchStatement': {\n const swScope = createScope(scope)\n walkNode(node.discriminant, scope, depth + 1)\n for (const c of node.cases ?? []) {\n if (c.test) walkNode(c.test, swScope, depth + 1)\n for (const stmt of c.consequent ?? []) walkNode(stmt, swScope, depth + 1)\n }\n return\n }\n\n case 'TryStatement': {\n walkNode(node.block, scope, depth + 1)\n if (node.handler) {\n const handlerScope = createScope(scope)\n if (node.handler.param) collectPatternNames(node.handler.param, handlerScope)\n if (node.handler.param) walkNode(node.handler.param, handlerScope, depth + 1)\n walkNode(node.handler.body, handlerScope, depth + 1)\n }\n if (node.finalizer) walkNode(node.finalizer, scope, depth + 1)\n return\n }\n\n case 'CatchClause': {\n const catchScope = createScope(scope)\n if (node.param) {\n collectPatternNames(node.param, catchScope)\n walkNode(node.param, catchScope, depth + 1)\n }\n collectDeclarations(node.body?.body ?? [], catchScope)\n if (node.body) walkNode(node.body, catchScope, depth + 1)\n return\n }\n\n // ── LabeledStatement ──\n case 'LabeledStatement':\n if (node.body) walkNode(node.body, scope, depth + 1)\n return\n\n // ── Return / Throw ──\n case 'ReturnStatement':\n case 'ThrowStatement':\n if (node.argument) walkNode(node.argument, scope, depth + 1)\n return\n\n // ── ExpressionStatement ──\n case 'ExpressionStatement':\n walkNode(node.expression, scope, depth + 1)\n return\n\n // ── 表达式 ──\n case 'Identifier': {\n const name = node.name\n // S1 危险标识符黑名单\n if (s1Idents.has(name)) {\n addViolation('SEC_IDENT', lineOf(node), name, `[security] SEC_IDENT line ${lineOf(node)}: \"${name}\" is not allowed`)\n return\n }\n // S4 自由标识符白名单判定\n if (scopeHas(scope, name) || knownNames.has(name) || S4_SAFE_GLOBALS.has(name)) {\n return\n }\n // 未声明的自由标识符\n addViolation('SEC_FREE_IDENT', lineOf(node), name, `[security] SEC_FREE_IDENT line ${lineOf(node)}: unknown identifier \"${name}\" (not declared, not a known namespace)`)\n return\n }\n\n case 'MemberExpression': {\n // S1 优先于一切:先遍历 object(让 Identifier 先命中 S1/S4),\n // 再检查 S3 危险成员名。这样 globalThis.eval 先命中 SEC_IDENT(globalThis)。\n walkNode(node.object, scope, depth + 1)\n if (node.computed && node.property?.type !== 'Literal') {\n walkNode(node.property, scope, depth + 1)\n }\n // S3 危险成员名(在 object 遍历后检查,确保 S1 优先级)\n const propName = node.property?.type === 'Identifier' ? node.property.name\n : node.property?.type === 'Literal' ? String(node.property.value)\n : null\n if (propName && S3_MEMBERS.has(propName)) {\n addViolation('SEC_MEMBER', lineOf(node), propName, `[security] SEC_MEMBER line ${lineOf(node)}: dangerous member \"${propName}\"`)\n }\n return\n }\n\n case 'CallExpression':\n walkNode(node.callee, scope, depth + 1)\n for (const arg of node.arguments ?? []) walkNode(arg, scope, depth + 1)\n return\n\n case 'NewExpression':\n walkNode(node.callee, scope, depth + 1)\n for (const arg of node.arguments ?? []) walkNode(arg, scope, depth + 1)\n return\n\n case 'AssignmentExpression': {\n // S7 命名空间保护:禁止对 s7Names 中的名字做赋值\n const target = node.left\n if (target?.type === 'Identifier' && s7Names.has(target.name)) {\n addViolation('SEC_NS_ASSIGN', lineOf(node), target.name, `[security] SEC_NS_ASSIGN line ${lineOf(node)}: cannot assign to namespace \"${target.name}\"`)\n }\n // P6: SEC_RESERVED_ASSIGN — cannot assign to reserved unit constant names\n if (target?.type === 'Identifier' && RESERVED_UNIT_NAMES.has(target.name)) {\n addViolation('SEC_RESERVED_ASSIGN', lineOf(node), target.name, `[security] SEC_RESERVED_ASSIGN line ${lineOf(node)}: cannot assign to reserved unit name \"${target.name}\"`)\n }\n // MemberExpression 赋值:cad.box = ...\n if (target?.type === 'MemberExpression' && target.object?.type === 'Identifier' && s7Names.has(target.object.name)) {\n addViolation('SEC_NS_ASSIGN', lineOf(node), target.object.name, `[security] SEC_NS_ASSIGN line ${lineOf(node)}: cannot assign to member of namespace \"${target.object.name}\"`)\n }\n walkNode(node.left, scope, depth + 1)\n walkNode(node.right, scope, depth + 1)\n return\n }\n\n case 'BinaryExpression':\n case 'LogicalExpression':\n walkNode(node.left, scope, depth + 1)\n walkNode(node.right, scope, depth + 1)\n return\n\n case 'UnaryExpression':\n case 'UpdateExpression':\n walkNode(node.argument, scope, depth + 1)\n return\n\n case 'ConditionalExpression':\n walkNode(node.test, scope, depth + 1)\n walkNode(node.consequent, scope, depth + 1)\n walkNode(node.alternate, scope, depth + 1)\n return\n\n case 'ArrayExpression':\n for (const el of node.elements ?? []) {\n if (el) walkNode(el, scope, depth + 1)\n }\n return\n\n case 'ObjectExpression':\n for (const prop of node.properties ?? []) {\n if (prop?.type === 'Property') {\n // key 是标识符且非 computed → 不需要检查(对象字面量 key 不是标识符引用)\n if (prop.computed && prop.key) walkNode(prop.key, scope, depth + 1)\n if (prop.value) walkNode(prop.value, scope, depth + 1)\n } else {\n // SpreadElement 等\n walkNode(prop, scope, depth + 1)\n }\n }\n return\n\n case 'TemplateLiteral':\n for (const expr of node.expressions ?? []) walkNode(expr, scope, depth + 1)\n return\n\n case 'TaggedTemplateExpression':\n // S2 已在上方判定;仍遍历 tag 与 quasi\n walkNode(node.tag, scope, depth + 1)\n if (node.quasi) walkNode(node.quasi, scope, depth + 1)\n return\n\n case 'AwaitExpression':\n if (node.argument) walkNode(node.argument, scope, depth + 1)\n return\n\n case 'YieldExpression':\n if (node.argument) walkNode(node.argument, scope, depth + 1)\n return\n\n case 'SpreadElement':\n if (node.argument) walkNode(node.argument, scope, depth + 1)\n return\n\n case 'SequenceExpression':\n for (const expr of node.expressions ?? []) walkNode(expr, scope, depth + 1)\n return\n\n case 'ParenthesizedExpression':\n if (node.expression) walkNode(node.expression, scope, depth + 1)\n return\n\n case 'ChainExpression':\n if (node.expression) walkNode(node.expression, scope, depth + 1)\n return\n\n case 'MetaProperty':\n // S2 已在上方判定(import.meta / new.target)\n return\n\n case 'ImportExpression':\n // S2 已在上方判定(动态 import())\n for (const arg of node.arguments ?? []) walkNode(arg, scope, depth + 1)\n return\n\n case 'ClassDeclaration':\n case 'ClassExpression': {\n if (node.id?.name && scope) scope.names.add(node.id.name)\n const clsScope = createScope(scope)\n if (node.superClass) walkNode(node.superClass, clsScope, depth + 1)\n if (node.body) walkNode(node.body, clsScope, depth + 1)\n return\n }\n\n case 'ClassBody':\n for (const method of node.body ?? []) {\n walkNode(method, scope, depth + 1)\n }\n return\n\n case 'MethodDefinition':\n case 'PropertyDefinition':\n if (node.key && node.computed) walkNode(node.key, scope, depth + 1)\n if (node.value) walkNode(node.value, scope, depth + 1)\n return\n\n case 'WithStatement':\n // S2 已判定\n walkNode(node.object, scope, depth + 1)\n if (node.body) walkNode(node.body, scope, depth + 1)\n return\n\n case 'DebuggerStatement':\n // S2 已判定\n return\n\n case 'ContinueStatement':\n case 'BreakStatement':\n return\n\n case 'EmptyStatement':\n return\n\n case 'Literal':\n return\n\n case 'Super':\n return\n\n case 'ThisExpression':\n return\n\n case 'ImportSpecifier':\n case 'ImportDefaultSpecifier':\n case 'ImportNamespaceSpecifier':\n return\n\n case 'ExportSpecifier':\n return\n\n default:\n // 未知节点:递归遍历其子属性\n walkChildren(node, scope, depth)\n return\n }\n }\n\n function walkPattern(pattern: ASTNode, scope: Scope | null, depth: number): void {\n if (!pattern) return\n switch (pattern.type) {\n case 'Identifier':\n return // 已在 collectPatternNames 中登记\n case 'ObjectPattern':\n for (const prop of pattern.properties ?? []) {\n if (prop?.type === 'Property') {\n if (prop.computed && prop.key) walkNode(prop.key, scope, depth + 1)\n if (prop.value) walkPattern(prop.value, scope, depth + 1)\n } else if (prop?.type === 'RestElement') {\n walkPattern(prop.argument, scope, depth + 1)\n }\n }\n return\n case 'ArrayPattern':\n for (const el of pattern.elements ?? []) {\n if (el) walkPattern(el, scope, depth + 1)\n }\n return\n case 'AssignmentPattern':\n if (pattern.right) walkNode(pattern.right, scope, depth + 1)\n walkPattern(pattern.left, scope, depth + 1)\n return\n case 'RestElement':\n walkPattern(pattern.argument, scope, depth + 1)\n return\n default:\n return\n }\n }\n\n function walkChildren(node: ASTNode, scope: Scope | null, depth: number): void {\n for (const key of Object.keys(node)) {\n if (key === 'loc' || key === 'start' || key === 'end' || key === 'range' || key === 'parent' || key === 'type') continue\n const v = (node as Record<string, unknown>)[key]\n if (Array.isArray(v)) {\n for (const item of v) {\n if (item && typeof item === 'object' && 'type' in item) {\n walkNode(item as ASTNode, scope, depth + 1)\n }\n }\n } else if (v && typeof v === 'object' && 'type' in v) {\n walkNode(v as ASTNode, scope, depth + 1)\n }\n }\n }\n}\n\n// ── 类型别名 ──\ntype ASTNode = any\n\n// ── 门禁断言 ──\n\n/**\n * 门禁断言:violations 非空则抛 ParseError(code='E_SECURITY',ruleId 挂 ParseError.ruleId)。\n * 三处接入点(A1/A2/A3)统一用它。\n *\n * @param code - the .fai.js source text (raw, un-wrapped).\n * @param opts - scan options (policy is required).\n * @throws ParseError — when violations are non-empty (code='E_SECURITY').\n */\nexport function assertSecure(code: string, opts: SecurityScanOptions): void {\n const result = scanSource(code, opts)\n if (result.violations.length > 0) {\n const v = result.violations[0]\n throw new ParseError(\n v.message,\n v.lineNo,\n 'E_SECURITY',\n undefined,\n v.ruleId,\n )\n }\n}\n"]}
@@ -14,8 +14,8 @@
14
14
  import type { ExtractMetadataOptions } from './metadata-extractor.js';
15
15
  import type { StmtId } from '../identity.js';
16
16
  /**
17
- * 本地最小 Result(与 vendored brepjs/core/result 判别的结构一致,纯结构化等价)。
18
- * lang 层禁止反向 import vendored(分层守卫 R5/L1 D8)——`ok/err/Result` 入库 API
17
+ * 本地最小 Result(与早期 brepjs/core/result 判别的结构一致,纯结构化等价)。
18
+ * lang 层禁止反向 import result 模块(分层守卫 R5/L1 D8)——`ok/err/Result` 入库 API
19
19
  * 面是唯一官方出口;这里用同构本地实现,宿主按结构使用无感。
20
20
  */
21
21
  export type LocalResult<T, E = never> = {
@@ -1 +1 @@
1
- {"version":3,"file":"source-edit.js","sourceRoot":"","sources":["../../src/lang/source-edit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * source-edit — 参数槽源码精确替换(P0-D)\n *\n * 纯函数:不触碰任何运行时状态。用 newText 精确替换 code 中 (stmtId, path) 槽位的\n * 源码区间,返回新全文。结果 ok 时保证「编辑后的新代码至少可被 module 级 acorn 解析」;\n * 执行侧 update 仍会做完整校验(语义、安全、引用)。\n *\n * path 是**不透明标识符**:必须等于 meta.argSources 中某条记录的 path(全等匹配、\n * 不解析结构)。宿主只能从 ArgSource 读取后原样回传,不得自行构造。\n *\n * 偏移断言:`code.slice(start,end) === src.text` 不符 → E_RANGE_STALE(宿主应刷新\n * 重新提取后重试一次,仍失败则关闭面板并报错,禁止静默写回旧值)。\n */\n\nimport { parse as acornParse } from 'acorn'\nimport { extractMetadata } from './metadata-extractor'\nimport type { ExtractMetadataOptions, UiMetadata } from './metadata-extractor'\nimport { validateExpression } from './expr-validate'\nimport { ParseError } from './parse-error'\nimport type { StmtId } from '../identity'\n\n/**\n * 本地最小 Result(与 vendored brepjs/core/result 判别的结构一致,纯结构化等价)。\n * lang 层禁止反向 import vendored(分层守卫 R5/L1 D8)——`ok/err/Result` 入库 API\n * 面是唯一官方出口;这里用同构本地实现,宿主按结构使用无感。\n */\nexport type LocalResult<T, E = never> = { ok: true; value: T } | { ok: false; error: E }\nfunction okRes<T>(value: T): LocalResult<T, never> {\n return { ok: true, value }\n}\n\n/**\n * 参数槽源码精确替换失败的错误分类:\n * 槽位缺失(E_SLOT_NOT_FOUND)、偏移过期(E_RANGE_STALE)、原脚本不可提取(E_PARSE)、\n * 新文本/替换后全文语法错(E_SYNTAX)、引用未声明名(E_REFERENCE)、不在白名单(E_VALUE)。\n */\nexport type EditSourceError =\n /** stmtId+path 在 meta.argSources 中无匹配 */\n | { kind: 'E_SLOT_NOT_FOUND'; message: string }\n /** code.slice(start,end) !== src.text(偏移已失效) */\n | { kind: 'E_RANGE_STALE'; message: string }\n /** 原脚本本身无法提取(坏表达式/语法错 → 整体不可编辑) */\n | { kind: 'E_PARSE'; message: string; line?: number }\n /** 新文本或替换后全文语法失败 */\n | { kind: 'E_SYNTAX'; message: string; line?: number }\n /** 新文本引用了未声明名字 */\n | { kind: 'E_REFERENCE'; message: string; line?: number }\n /** 新文本不在表达式白名单 */\n | { kind: 'E_VALUE'; message: string; line?: number }\n\n/** 新文本校验(复用 validateExpression:同一份白名单/引用判定实现,不复制)。 */\nfunction validateNewExpression(\n newText: string,\n knownNames: string[],\n): Extract<EditSourceError, { kind: 'E_SYNTAX' | 'E_REFERENCE' | 'E_VALUE' }> | null {\n const res = validateExpression({ text: newText, knownNames })\n if (res.ok) return null\n return {\n kind: res.code,\n message: res.message,\n ...(res.line !== undefined ? { line: res.line } : {}),\n } as Extract<EditSourceError, { kind: 'E_SYNTAX' | 'E_REFERENCE' | 'E_VALUE' }>\n}\n\n/**\n * 用 newText 精确替换 code 中由 (stmtId, path) 标识的槽位源码,返回新全文。\n * path 必须取自 meta.argSources 的原始值(不透明标识符,宿主不得自行构造)。\n * 成功时(ok=true)保证新代码至少可被 module 级 acorn 解析。\n * @param code 当前完整脚本源码。\n * @param stmtId 槽位所属语句 id(必须与 meta.argSources 中记录一致)。\n * @param path 槽位路径(自 ArgSource 原样回传,禁止自行构造)。\n * @param newText 替换后的表达式文本(只替换该槽位区间)。\n * @param options 透传给 extractMetadata 的提取选项(如 ns/heuristic)。\n * @returns 成功 → { ok: true, value: 新全文 };失败 → { ok: false, error: EditSourceError }。\n */\nexport function editArgSource(\n code: string,\n stmtId: StmtId,\n path: string,\n newText: string,\n options?: ExtractMetadataOptions,\n): LocalResult<string, EditSourceError> {\n // 1. 提取元数据(抛 ParseError 时转 E_PARSE——对已存在的坏脚本给「整体不可编辑」信号)\n let meta: UiMetadata\n try {\n meta = extractMetadata(code, options)\n } catch (e) {\n if (e instanceof ParseError) {\n return { ok: false, error: { kind: 'E_PARSE', message: e.message, line: e.line } }\n }\n throw e\n }\n\n // 2–3. 查找 stmtId+path 全等匹配(同名同路径理论上唯一;多条取数组顺序第一条)\n const src = meta.argSources.find((s) => s.stmtId === stmtId && s.path === path)\n if (!src) {\n return {\n ok: false,\n error: {\n kind: 'E_SLOT_NOT_FOUND',\n message: `no arg source for stmtId=\"${stmtId}\" path=\"${path}\"`,\n },\n }\n }\n\n // 4. 偏移断言(code 被篡改/已编辑过 → E_RANGE_STALE)\n if (code.slice(src.start, src.end) !== src.text) {\n return {\n ok: false,\n error: {\n kind: 'E_RANGE_STALE',\n message: `arg source range stale for stmtId=\"${stmtId}\" path=\"${path}\"; re-extract metadata and retry`,\n },\n }\n }\n\n // 5. 新文本校验(语法 → 白名单 → 未知名)\n const invalid = validateNewExpression(newText, meta.names)\n if (invalid) return { ok: false, error: invalid }\n\n // 6. splice:纯字符串拼接,不做格式化/规范化(JS UTF-16 下标与 acorn 一致)\n const newCode = code.slice(0, src.start) + newText + code.slice(src.end)\n\n // 7. 全量回验(不跑安全扫描)\n try {\n acornParse(newCode, { ecmaVersion: 'latest', sourceType: 'module' })\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e)\n return {\n ok: false,\n error: { kind: 'E_SYNTAX', message: `edited script failed to re-parse: ${message}` },\n }\n }\n\n // 8\n return okRes(newCode)\n}"]}
1
+ {"version":3,"file":"source-edit.js","sourceRoot":"","sources":["../../src/lang/source-edit.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * source-edit — 参数槽源码精确替换(P0-D)\n *\n * 纯函数:不触碰任何运行时状态。用 newText 精确替换 code 中 (stmtId, path) 槽位的\n * 源码区间,返回新全文。结果 ok 时保证「编辑后的新代码至少可被 module 级 acorn 解析」;\n * 执行侧 update 仍会做完整校验(语义、安全、引用)。\n *\n * path 是**不透明标识符**:必须等于 meta.argSources 中某条记录的 path(全等匹配、\n * 不解析结构)。宿主只能从 ArgSource 读取后原样回传,不得自行构造。\n *\n * 偏移断言:`code.slice(start,end) === src.text` 不符 → E_RANGE_STALE(宿主应刷新\n * 重新提取后重试一次,仍失败则关闭面板并报错,禁止静默写回旧值)。\n */\n\nimport { parse as acornParse } from 'acorn'\nimport { extractMetadata } from './metadata-extractor'\nimport type { ExtractMetadataOptions, UiMetadata } from './metadata-extractor'\nimport { validateExpression } from './expr-validate'\nimport { ParseError } from './parse-error'\nimport type { StmtId } from '../identity'\n\n/**\n * 本地最小 Result(与早期 brepjs/core/result 判别的结构一致,纯结构化等价)。\n * lang 层禁止反向 import result 模块(分层守卫 R5/L1 D8)——`ok/err/Result` 入库 API\n * 面是唯一官方出口;这里用同构本地实现,宿主按结构使用无感。\n */\nexport type LocalResult<T, E = never> = { ok: true; value: T } | { ok: false; error: E }\nfunction okRes<T>(value: T): LocalResult<T, never> {\n return { ok: true, value }\n}\n\n/**\n * 参数槽源码精确替换失败的错误分类:\n * 槽位缺失(E_SLOT_NOT_FOUND)、偏移过期(E_RANGE_STALE)、原脚本不可提取(E_PARSE)、\n * 新文本/替换后全文语法错(E_SYNTAX)、引用未声明名(E_REFERENCE)、不在白名单(E_VALUE)。\n */\nexport type EditSourceError =\n /** stmtId+path 在 meta.argSources 中无匹配 */\n | { kind: 'E_SLOT_NOT_FOUND'; message: string }\n /** code.slice(start,end) !== src.text(偏移已失效) */\n | { kind: 'E_RANGE_STALE'; message: string }\n /** 原脚本本身无法提取(坏表达式/语法错 → 整体不可编辑) */\n | { kind: 'E_PARSE'; message: string; line?: number }\n /** 新文本或替换后全文语法失败 */\n | { kind: 'E_SYNTAX'; message: string; line?: number }\n /** 新文本引用了未声明名字 */\n | { kind: 'E_REFERENCE'; message: string; line?: number }\n /** 新文本不在表达式白名单 */\n | { kind: 'E_VALUE'; message: string; line?: number }\n\n/** 新文本校验(复用 validateExpression:同一份白名单/引用判定实现,不复制)。 */\nfunction validateNewExpression(\n newText: string,\n knownNames: string[],\n): Extract<EditSourceError, { kind: 'E_SYNTAX' | 'E_REFERENCE' | 'E_VALUE' }> | null {\n const res = validateExpression({ text: newText, knownNames })\n if (res.ok) return null\n return {\n kind: res.code,\n message: res.message,\n ...(res.line !== undefined ? { line: res.line } : {}),\n } as Extract<EditSourceError, { kind: 'E_SYNTAX' | 'E_REFERENCE' | 'E_VALUE' }>\n}\n\n/**\n * 用 newText 精确替换 code 中由 (stmtId, path) 标识的槽位源码,返回新全文。\n * path 必须取自 meta.argSources 的原始值(不透明标识符,宿主不得自行构造)。\n * 成功时(ok=true)保证新代码至少可被 module 级 acorn 解析。\n * @param code 当前完整脚本源码。\n * @param stmtId 槽位所属语句 id(必须与 meta.argSources 中记录一致)。\n * @param path 槽位路径(自 ArgSource 原样回传,禁止自行构造)。\n * @param newText 替换后的表达式文本(只替换该槽位区间)。\n * @param options 透传给 extractMetadata 的提取选项(如 ns/heuristic)。\n * @returns 成功 → { ok: true, value: 新全文 };失败 → { ok: false, error: EditSourceError }。\n */\nexport function editArgSource(\n code: string,\n stmtId: StmtId,\n path: string,\n newText: string,\n options?: ExtractMetadataOptions,\n): LocalResult<string, EditSourceError> {\n // 1. 提取元数据(抛 ParseError 时转 E_PARSE——对已存在的坏脚本给「整体不可编辑」信号)\n let meta: UiMetadata\n try {\n meta = extractMetadata(code, options)\n } catch (e) {\n if (e instanceof ParseError) {\n return { ok: false, error: { kind: 'E_PARSE', message: e.message, line: e.line } }\n }\n throw e\n }\n\n // 2–3. 查找 stmtId+path 全等匹配(同名同路径理论上唯一;多条取数组顺序第一条)\n const src = meta.argSources.find((s) => s.stmtId === stmtId && s.path === path)\n if (!src) {\n return {\n ok: false,\n error: {\n kind: 'E_SLOT_NOT_FOUND',\n message: `no arg source for stmtId=\"${stmtId}\" path=\"${path}\"`,\n },\n }\n }\n\n // 4. 偏移断言(code 被篡改/已编辑过 → E_RANGE_STALE)\n if (code.slice(src.start, src.end) !== src.text) {\n return {\n ok: false,\n error: {\n kind: 'E_RANGE_STALE',\n message: `arg source range stale for stmtId=\"${stmtId}\" path=\"${path}\"; re-extract metadata and retry`,\n },\n }\n }\n\n // 5. 新文本校验(语法 → 白名单 → 未知名)\n const invalid = validateNewExpression(newText, meta.names)\n if (invalid) return { ok: false, error: invalid }\n\n // 6. splice:纯字符串拼接,不做格式化/规范化(JS UTF-16 下标与 acorn 一致)\n const newCode = code.slice(0, src.start) + newText + code.slice(src.end)\n\n // 7. 全量回验(不跑安全扫描)\n try {\n acornParse(newCode, { ecmaVersion: 'latest', sourceType: 'module' })\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e)\n return {\n ok: false,\n error: { kind: 'E_SYNTAX', message: `edited script failed to re-parse: ${message}` },\n }\n }\n\n // 8\n return okRes(newCode)\n}"]}
@@ -45,6 +45,42 @@ declare const _default: {
45
45
  revolve: {};
46
46
  sweep: {};
47
47
  loft: {};
48
+ surface: {};
49
+ offset2d: {};
50
+ solidFromFaces: {};
51
+ halfSpace: {};
52
+ exportStl: {};
53
+ exportBrep: {};
54
+ isEdge: {};
55
+ isFace: {};
56
+ isShell: {};
57
+ isVertex: {};
58
+ isWire: {};
59
+ isCompound: {};
60
+ isCompSolid: {};
61
+ isEqual: {};
62
+ toSVG: {};
63
+ toMultiviewSVG: {};
64
+ toPNG: {};
65
+ toMultiviewPNG: {};
66
+ edge: {};
67
+ circleArc: {};
68
+ ellipseEdge: {};
69
+ ellipseArc: {};
70
+ tangentArc: {};
71
+ approximatePoints: {};
72
+ interpolateWithTangents: {};
73
+ curveDegreeElevate: {};
74
+ curveKnotInsert: {};
75
+ curveKnotRemove: {};
76
+ curveIsPeriodic: {};
77
+ faceOnSurface: {};
78
+ nonPlanarFace: {};
79
+ makeSolid: {};
80
+ reverseSurfaceU: {};
81
+ outerWire: {};
82
+ draftPrism: {};
83
+ pipe: {};
48
84
  faceNormal: {};
49
85
  bboxCenter: {};
50
86
  bboxMin: {};
@@ -1 +1 @@
1
- {"version":3,"file":"symbol-table.generated.d.ts","sourceRoot":"","sources":["../../src/lang/symbol-table.generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACH,wBAgGC"}
1
+ {"version":3,"file":"symbol-table.generated.d.ts","sourceRoot":"","sources":["../../src/lang/symbol-table.generated.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACH,wBAoIC"}
@@ -45,6 +45,42 @@ export default {
45
45
  "revolve": {},
46
46
  "sweep": {},
47
47
  "loft": {},
48
+ "surface": {},
49
+ "offset2d": {},
50
+ "solidFromFaces": {},
51
+ "halfSpace": {},
52
+ "exportStl": {},
53
+ "exportBrep": {},
54
+ "isEdge": {},
55
+ "isFace": {},
56
+ "isShell": {},
57
+ "isVertex": {},
58
+ "isWire": {},
59
+ "isCompound": {},
60
+ "isCompSolid": {},
61
+ "isEqual": {},
62
+ "toSVG": {},
63
+ "toMultiviewSVG": {},
64
+ "toPNG": {},
65
+ "toMultiviewPNG": {},
66
+ "edge": {},
67
+ "circleArc": {},
68
+ "ellipseEdge": {},
69
+ "ellipseArc": {},
70
+ "tangentArc": {},
71
+ "approximatePoints": {},
72
+ "interpolateWithTangents": {},
73
+ "curveDegreeElevate": {},
74
+ "curveKnotInsert": {},
75
+ "curveKnotRemove": {},
76
+ "curveIsPeriodic": {},
77
+ "faceOnSurface": {},
78
+ "nonPlanarFace": {},
79
+ "makeSolid": {},
80
+ "reverseSurfaceU": {},
81
+ "outerWire": {},
82
+ "draftPrism": {},
83
+ "pipe": {},
48
84
  "faceNormal": {},
49
85
  "bboxCenter": {},
50
86
  "bboxMin": {},