@faicad/faijs 0.29.5 → 0.30.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +6 -5
- package/dist/api/api-namespace.d.ts +1 -1
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +53 -1
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/appearance.d.ts +0 -2
- package/dist/api/appearance.d.ts.map +1 -1
- package/dist/api/appearance.js +0 -2
- package/dist/api/appearance.js.map +1 -1
- package/dist/api/assembly/entities.d.ts +1 -1
- package/dist/api/assembly/entities.js +1 -1
- package/dist/api/assembly/entities.js.map +1 -1
- package/dist/api/assembly/index.d.ts +1 -1
- package/dist/api/assembly/index.js +1 -1
- package/dist/api/assembly/index.js.map +1 -1
- package/dist/api/assembly/joints.d.ts +33 -15
- package/dist/api/assembly/joints.d.ts.map +1 -1
- package/dist/api/assembly/joints.js +31 -13
- package/dist/api/assembly/joints.js.map +1 -1
- package/dist/api/assembly/preview.d.ts +1 -1
- package/dist/api/assembly/preview.js +1 -1
- package/dist/api/assembly/preview.js.map +1 -1
- package/dist/api/assembly/solve.d.ts +1 -1
- package/dist/api/assembly/solve.js +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
- package/dist/api/assembly/solvers/chain-solver.d.ts +2 -2
- package/dist/api/assembly/solvers/chain-solver.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts +1 -2
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +3 -4
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js +1 -1
- package/dist/api/assembly/solvers/joints-kinematics.js.map +1 -1
- package/dist/api/assembly/solvers/linalg.d.ts +2 -2
- package/dist/api/assembly/solvers/linalg.js +2 -2
- package/dist/api/assembly/solvers/linalg.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +2 -5
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js +1 -4
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +7 -6
- package/dist/api/boolean.js.map +1 -1
- package/dist/api/brep-mirror/booleanFns.d.ts +3 -3
- package/dist/api/brep-mirror/booleanFns.js +5 -5
- package/dist/api/brep-mirror/booleanFns.js.map +1 -1
- package/dist/api/brep-mirror/compoundFns.d.ts +1 -1
- package/dist/api/brep-mirror/compoundFns.js +4 -4
- package/dist/api/brep-mirror/compoundFns.js.map +1 -1
- package/dist/api/brep-mirror/healingFns.d.ts +4 -4
- package/dist/api/brep-mirror/healingFns.js +4 -4
- package/dist/api/brep-mirror/healingFns.js.map +1 -1
- package/dist/api/brep-mirror/hullFns.d.ts +2 -2
- package/dist/api/brep-mirror/hullFns.js +2 -2
- package/dist/api/brep-mirror/hullFns.js.map +1 -1
- package/dist/api/brep-mirror/patternFns.d.ts +5 -5
- package/dist/api/brep-mirror/patternFns.js +10 -10
- package/dist/api/brep-mirror/patternFns.js.map +1 -1
- package/dist/api/brep-mirror/primitiveFns.d.ts +4 -4
- package/dist/api/brep-mirror/primitiveFns.js +4 -4
- package/dist/api/brep-mirror/primitiveFns.js.map +1 -1
- package/dist/api/brep-mirror/roofFns.d.ts +3 -3
- package/dist/api/brep-mirror/roofFns.js +7 -7
- package/dist/api/brep-mirror/roofFns.js.map +1 -1
- package/dist/api/brep-mirror/sweepFns.d.ts +7 -7
- package/dist/api/brep-mirror/sweepFns.js +14 -14
- package/dist/api/brep-mirror/sweepFns.js.map +1 -1
- package/dist/api/brep-mirror/threadFns.d.ts +1 -1
- package/dist/api/brep-mirror/threadFns.js +1 -1
- package/dist/api/brep-mirror/threadFns.js.map +1 -1
- package/dist/api/brep-mirror/topologyFns.d.ts +5 -5
- package/dist/api/brep-mirror/topologyFns.js +8 -8
- package/dist/api/brep-mirror/topologyFns.js.map +1 -1
- package/dist/api/brep-operations/booleanFns.d.ts +40 -0
- package/dist/api/brep-operations/booleanFns.d.ts.map +1 -0
- package/dist/api/brep-operations/booleanFns.js +104 -0
- package/dist/api/brep-operations/booleanFns.js.map +1 -0
- package/dist/api/brep-operations/brepHelpers.d.ts +55 -0
- package/dist/api/brep-operations/brepHelpers.d.ts.map +1 -0
- package/dist/api/brep-operations/brepHelpers.js +131 -0
- package/dist/api/brep-operations/brepHelpers.js.map +1 -0
- package/dist/api/brep-operations/compoundFns.d.ts +46 -0
- package/dist/api/brep-operations/compoundFns.d.ts.map +1 -0
- package/dist/api/brep-operations/compoundFns.js +299 -0
- package/dist/api/brep-operations/compoundFns.js.map +1 -0
- package/dist/api/brep-operations/healingFns.d.ts +78 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
- package/dist/api/brep-operations/healingFns.js +294 -0
- package/dist/api/brep-operations/healingFns.js.map +1 -0
- package/dist/api/brep-operations/hullFns.d.ts +20 -0
- package/dist/api/brep-operations/hullFns.d.ts.map +1 -0
- package/dist/api/brep-operations/hullFns.js +46 -0
- package/dist/api/brep-operations/hullFns.js.map +1 -0
- package/dist/api/brep-operations/joinery-brep.d.ts +172 -0
- package/dist/api/brep-operations/joinery-brep.d.ts.map +1 -0
- package/dist/api/brep-operations/joinery-brep.js +463 -0
- package/dist/api/brep-operations/joinery-brep.js.map +1 -0
- package/dist/api/brep-operations/patternFns.d.ts +43 -0
- package/dist/api/brep-operations/patternFns.d.ts.map +1 -0
- package/dist/api/brep-operations/patternFns.js +178 -0
- package/dist/api/brep-operations/patternFns.js.map +1 -0
- package/dist/api/brep-operations/primitiveFns.d.ts +42 -0
- package/dist/api/brep-operations/primitiveFns.d.ts.map +1 -0
- package/dist/api/brep-operations/primitiveFns.js +104 -0
- package/dist/api/brep-operations/primitiveFns.js.map +1 -0
- package/dist/api/brep-operations/roofFns.d.ts +24 -0
- package/dist/api/brep-operations/roofFns.d.ts.map +1 -0
- package/dist/api/brep-operations/roofFns.js +229 -0
- package/dist/api/brep-operations/roofFns.js.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts +36 -0
- package/dist/api/brep-operations/straightSkeleton.d.ts.map +1 -0
- package/dist/api/brep-operations/straightSkeleton.js +431 -0
- package/dist/api/brep-operations/straightSkeleton.js.map +1 -0
- package/dist/api/brep-operations/sweepFns.d.ts +60 -0
- package/dist/api/brep-operations/sweepFns.d.ts.map +1 -0
- package/dist/api/brep-operations/sweepFns.js +323 -0
- package/dist/api/brep-operations/sweepFns.js.map +1 -0
- package/dist/api/brep-operations/threadFns.d.ts +83 -0
- package/dist/api/brep-operations/threadFns.d.ts.map +1 -0
- package/dist/api/brep-operations/threadFns.js +138 -0
- package/dist/api/brep-operations/threadFns.js.map +1 -0
- package/dist/api/brep-operations/topologyFns.d.ts +90 -0
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-operations/topologyFns.js +276 -0
- package/dist/api/brep-operations/topologyFns.js.map +1 -0
- package/dist/api/brep-topology.d.ts +1 -1
- package/dist/api/brep-topology.d.ts.map +1 -1
- package/dist/api/brep-topology.js +1 -1
- package/dist/api/brep-topology.js.map +1 -1
- package/dist/api/brepjs-compat/index.d.ts +1 -1
- package/dist/api/brepjs-compat/index.js +3 -3
- package/dist/api/brepjs-compat/index.js.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/borrow-bridge.js +3 -4
- package/dist/api/cadquery-selectors/borrow-bridge.js.map +1 -1
- package/dist/api/curve-sketch/index.d.ts +235 -0
- package/dist/api/curve-sketch/index.d.ts.map +1 -0
- package/dist/api/curve-sketch/index.js +487 -0
- package/dist/api/curve-sketch/index.js.map +1 -0
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +3 -2
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-brep.d.ts +41 -0
- package/dist/api/export-brep.d.ts.map +1 -0
- package/dist/api/export-brep.js +58 -0
- package/dist/api/export-brep.js.map +1 -0
- package/dist/api/export-stl.d.ts +50 -0
- package/dist/api/export-stl.d.ts.map +1 -0
- package/dist/api/export-stl.js +99 -0
- package/dist/api/export-stl.js.map +1 -0
- package/dist/api/extrude.d.ts +8 -11
- package/dist/api/extrude.d.ts.map +1 -1
- package/dist/api/extrude.js +11 -14
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +2 -2
- package/dist/api/fillet-variable.js +2 -2
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +2 -4
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +2 -4
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/generated/2d.d.ts +4 -0
- package/dist/api/generated/2d.d.ts.map +1 -1
- package/dist/api/generated/2d.js +4 -0
- package/dist/api/generated/2d.js.map +1 -1
- package/dist/api/generated/core.d.ts +4 -0
- package/dist/api/generated/core.d.ts.map +1 -1
- package/dist/api/generated/core.js +4 -0
- package/dist/api/generated/core.js.map +1 -1
- package/dist/api/generated/gear.d.ts +4 -0
- package/dist/api/generated/gear.d.ts.map +1 -1
- package/dist/api/generated/gear.js +4 -0
- package/dist/api/generated/gear.js.map +1 -1
- package/dist/api/generated/io.d.ts +4 -0
- package/dist/api/generated/io.d.ts.map +1 -1
- package/dist/api/generated/io.js +4 -0
- package/dist/api/generated/io.js.map +1 -1
- package/dist/api/generated/kernel.d.ts +4 -0
- package/dist/api/generated/kernel.d.ts.map +1 -1
- package/dist/api/generated/kernel.js +4 -0
- package/dist/api/generated/kernel.js.map +1 -1
- package/dist/api/generated/measurement.d.ts +21 -21
- package/dist/api/generated/measurement.d.ts.map +1 -1
- package/dist/api/generated/measurement.js +25 -21
- package/dist/api/generated/measurement.js.map +1 -1
- package/dist/api/generated/ns.d.ts +4 -0
- package/dist/api/generated/ns.d.ts.map +1 -1
- package/dist/api/generated/ns.js +4 -0
- package/dist/api/generated/ns.js.map +1 -1
- package/dist/api/generated/operations.d.ts +32 -32
- package/dist/api/generated/operations.d.ts.map +1 -1
- package/dist/api/generated/operations.js +52 -48
- package/dist/api/generated/operations.js.map +1 -1
- package/dist/api/generated/projection.d.ts +4 -0
- package/dist/api/generated/projection.d.ts.map +1 -1
- package/dist/api/generated/projection.js +4 -0
- package/dist/api/generated/projection.js.map +1 -1
- package/dist/api/generated/query.d.ts +4 -0
- package/dist/api/generated/query.d.ts.map +1 -1
- package/dist/api/generated/query.js +4 -0
- package/dist/api/generated/query.js.map +1 -1
- package/dist/api/generated/sketching.d.ts +2 -2
- package/dist/api/generated/sketching.d.ts.map +1 -1
- package/dist/api/generated/sketching.js +7 -3
- package/dist/api/generated/sketching.js.map +1 -1
- package/dist/api/generated/text.d.ts +4 -0
- package/dist/api/generated/text.d.ts.map +1 -1
- package/dist/api/generated/text.js +4 -0
- package/dist/api/generated/text.js.map +1 -1
- package/dist/api/generated/topology.d.ts +45 -45
- package/dist/api/generated/topology.d.ts.map +1 -1
- package/dist/api/generated/topology.js +67 -63
- package/dist/api/generated/topology.js.map +1 -1
- package/dist/api/generated/view.d.ts +4 -0
- package/dist/api/generated/view.d.ts.map +1 -1
- package/dist/api/generated/view.js +4 -0
- package/dist/api/generated/view.js.map +1 -1
- package/dist/api/geom-types/constants.d.ts +11 -0
- package/dist/api/geom-types/constants.d.ts.map +1 -0
- package/dist/api/geom-types/constants.js +11 -0
- package/dist/api/geom-types/constants.js.map +1 -0
- package/dist/api/geom-types/index.d.ts +21 -0
- package/dist/api/geom-types/index.d.ts.map +1 -0
- package/dist/api/geom-types/index.js +22 -0
- package/dist/api/geom-types/index.js.map +1 -0
- package/dist/api/geom-types/planeOps.d.ts +98 -0
- package/dist/api/geom-types/planeOps.d.ts.map +1 -0
- package/dist/api/geom-types/planeOps.js +170 -0
- package/dist/api/geom-types/planeOps.js.map +1 -0
- package/dist/api/geom-types/planeTypes.d.ts +24 -0
- package/dist/api/geom-types/planeTypes.d.ts.map +1 -0
- package/dist/api/geom-types/planeTypes.js +8 -0
- package/dist/api/geom-types/planeTypes.js.map +1 -0
- package/dist/api/geom-types/types.d.ts +64 -0
- package/dist/api/geom-types/types.d.ts.map +1 -0
- package/dist/api/geom-types/types.js +48 -0
- package/dist/api/geom-types/types.js.map +1 -0
- package/dist/api/geom-types/vecOps.d.ts +124 -0
- package/dist/api/geom-types/vecOps.d.ts.map +1 -0
- package/dist/api/geom-types/vecOps.js +202 -0
- package/dist/api/geom-types/vecOps.js.map +1 -0
- package/dist/api/geom.d.ts.map +1 -1
- package/dist/api/geom.js +6 -5
- package/dist/api/geom.js.map +1 -1
- package/dist/api/half-space.d.ts +56 -0
- package/dist/api/half-space.d.ts.map +1 -0
- package/dist/api/half-space.js +82 -0
- package/dist/api/half-space.js.map +1 -0
- package/dist/api/helix.d.ts +10 -1
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +19 -3
- package/dist/api/helix.js.map +1 -1
- package/dist/api/index.d.ts +15 -6
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +29 -8
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +4 -30
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +10 -42
- package/dist/api/internal/compat-op.js.map +1 -1
- package/dist/api/internal/compat-projection.d.ts +5 -5
- package/dist/api/internal/compat-projection.js +5 -5
- package/dist/api/internal/compat-projection.js.map +1 -1
- package/dist/api/internal/dual-form-args.d.ts +0 -2
- package/dist/api/internal/dual-form-args.d.ts.map +1 -1
- package/dist/api/internal/dual-form-args.js +1 -3
- package/dist/api/internal/dual-form-args.js.map +1 -1
- package/dist/api/internal/l3-bridge.d.ts +5 -37
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +7 -76
- package/dist/api/internal/l3-bridge.js.map +1 -1
- package/dist/api/internal/profile-wire.d.ts +1 -1
- package/dist/api/internal/profile-wire.js +1 -1
- package/dist/api/internal/profile-wire.js.map +1 -1
- package/dist/api/internal/result-unwrap.d.ts +4 -6
- package/dist/api/internal/result-unwrap.d.ts.map +1 -1
- package/dist/api/internal/result-unwrap.js +4 -6
- package/dist/api/internal/result-unwrap.js.map +1 -1
- package/dist/api/knurl.d.ts.map +1 -1
- package/dist/api/knurl.js +5 -3
- package/dist/api/knurl.js.map +1 -1
- package/dist/api/loft.d.ts +2 -2
- package/dist/api/loft.d.ts.map +1 -1
- package/dist/api/loft.js +2 -2
- package/dist/api/loft.js.map +1 -1
- package/dist/api/measurement/index.d.ts +3 -3
- package/dist/api/measurement/index.js +3 -3
- package/dist/api/measurement/index.js.map +1 -1
- package/dist/api/meta.d.ts +0 -2
- package/dist/api/meta.d.ts.map +1 -1
- package/dist/api/meta.js +0 -2
- package/dist/api/meta.js.map +1 -1
- package/dist/api/offset2d.d.ts +49 -0
- package/dist/api/offset2d.d.ts.map +1 -0
- package/dist/api/offset2d.js +86 -0
- package/dist/api/offset2d.js.map +1 -0
- package/dist/api/pattern.js +3 -3
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +7 -6
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/replicate.d.ts +2 -2
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +12 -12
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/result.d.ts +1 -1
- package/dist/api/result.js +1 -1
- package/dist/api/result.js.map +1 -1
- package/dist/api/revolve.d.ts +2 -2
- package/dist/api/revolve.js +3 -3
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/screw.d.ts +1 -1
- package/dist/api/screw.d.ts.map +1 -1
- package/dist/api/screw.js +5 -4
- package/dist/api/screw.js.map +1 -1
- package/dist/api/sdf.d.ts.map +1 -1
- package/dist/api/sdf.js +3 -2
- package/dist/api/sdf.js.map +1 -1
- package/dist/api/shape-type/index.d.ts +141 -0
- package/dist/api/shape-type/index.d.ts.map +1 -0
- package/dist/api/shape-type/index.js +182 -0
- package/dist/api/shape-type/index.js.map +1 -0
- package/dist/api/shell.d.ts +2 -2
- package/dist/api/shell.js +2 -2
- package/dist/api/shell.js.map +1 -1
- package/dist/api/solid-from-faces.d.ts +45 -0
- package/dist/api/solid-from-faces.d.ts.map +1 -0
- package/dist/api/solid-from-faces.js +72 -0
- package/dist/api/solid-from-faces.js.map +1 -0
- package/dist/api/solid-offset/index.d.ts +67 -0
- package/dist/api/solid-offset/index.d.ts.map +1 -0
- package/dist/api/solid-offset/index.js +132 -0
- package/dist/api/solid-offset/index.js.map +1 -0
- package/dist/api/surface/arg-spec.d.ts +35 -33
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +222 -224
- package/dist/api/surface/arg-spec.js.map +1 -1
- package/dist/api/surface-face/index.d.ts +104 -0
- package/dist/api/surface-face/index.d.ts.map +1 -0
- package/dist/api/surface-face/index.js +217 -0
- package/dist/api/surface-face/index.js.map +1 -0
- package/dist/api/surface.d.ts +44 -0
- package/dist/api/surface.d.ts.map +1 -0
- package/dist/api/surface.js +66 -0
- package/dist/api/surface.js.map +1 -0
- package/dist/api/sweep.d.ts +59 -9
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +11 -6
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +5 -5
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +11 -10
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/cameraFns.d.ts +1 -1
- package/dist/api/view/cameraFns.d.ts.map +1 -1
- package/dist/api/view/cameraFns.js +1 -1
- package/dist/api/view/cameraFns.js.map +1 -1
- package/dist/api/view/index.d.ts +0 -2
- package/dist/api/view/index.d.ts.map +1 -1
- package/dist/api/view/index.js +0 -2
- package/dist/api/view/index.js.map +1 -1
- package/dist/api/view/projectionPlanes.d.ts +1 -1
- package/dist/api/view/projectionPlanes.d.ts.map +1 -1
- package/dist/api/view/projectionPlanes.js.map +1 -1
- package/dist/api/view/view-camera.d.ts +7 -9
- package/dist/api/view/view-camera.d.ts.map +1 -1
- package/dist/api/view/view-camera.js +4 -6
- package/dist/api/view/view-camera.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +0 -2
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +0 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/api/view/view-sheet.d.ts +0 -2
- package/dist/api/view/view-sheet.d.ts.map +1 -1
- package/dist/api/view/view-sheet.js +0 -2
- package/dist/api/view/view-sheet.js.map +1 -1
- package/dist/api/view-export/index.d.ts +97 -0
- package/dist/api/view-export/index.d.ts.map +1 -0
- package/dist/api/view-export/index.js +118 -0
- package/dist/api/view-export/index.js.map +1 -0
- package/dist/brep/brep-ops.d.ts +89 -1
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +176 -10
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.d.ts +20 -0
- package/dist/brep/brep-topology.d.ts.map +1 -1
- package/dist/brep/brep-topology.js +46 -0
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.js +7 -7
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +2 -3
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js +1 -2
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/engine/registry.d.ts +1 -1
- package/dist/brep/engine/registry.js +1 -1
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +2 -2
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +2 -2
- package/dist/brep/handle-bridge.js +2 -2
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/index.d.ts +6 -3
- package/dist/brep/index.d.ts.map +1 -1
- package/dist/brep/index.js +6 -3
- package/dist/brep/index.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +2 -2
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/browser.d.ts +2 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -4
- package/dist/browser.js.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.d.ts +3 -10
- package/dist/cad-runtime/admit-compat-lib.d.ts.map +1 -1
- package/dist/cad-runtime/admit-compat-lib.js +3 -9
- package/dist/cad-runtime/admit-compat-lib.js.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +12 -3
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/direct-executor.d.ts +6 -3
- package/dist/cad-runtime/direct-executor.d.ts.map +1 -1
- package/dist/cad-runtime/direct-executor.js +31 -9
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/interp/env.d.ts +1 -1
- package/dist/cad-runtime/interp/env.js.map +1 -1
- package/dist/cad-runtime/lib-id.d.ts +0 -2
- package/dist/cad-runtime/lib-id.d.ts.map +1 -1
- package/dist/cad-runtime/lib-id.js +0 -2
- package/dist/cad-runtime/lib-id.js.map +1 -1
- package/dist/cad-runtime/live-shapes.d.ts +3 -5
- package/dist/cad-runtime/live-shapes.d.ts.map +1 -1
- package/dist/cad-runtime/live-shapes.js +8 -10
- package/dist/cad-runtime/live-shapes.js.map +1 -1
- package/dist/cad-runtime/ports.d.ts +3 -3
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +21 -7
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +45 -6
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +4 -3
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +2 -2
- package/dist/define-op.js.map +1 -1
- package/dist/geometry2d/bridge/plane.d.ts +1 -1
- package/dist/geometry2d/bridge/plane.js +1 -1
- package/dist/geometry2d/bridge/plane.js.map +1 -1
- package/dist/geometry2d/curve2d.d.ts +1 -1
- package/dist/geometry2d/curve2d.js +1 -1
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/io/fai-zip/container-read.d.ts +16 -0
- package/dist/io/fai-zip/container-read.d.ts.map +1 -1
- package/dist/io/fai-zip/container-read.js +22 -0
- package/dist/io/fai-zip/container-read.js.map +1 -1
- package/dist/io/fai-zip/index.d.ts +1 -1
- package/dist/io/fai-zip/index.d.ts.map +1 -1
- package/dist/io/fai-zip/index.js +1 -1
- package/dist/io/fai-zip/index.js.map +1 -1
- package/dist/lang/code-to-args.d.ts.map +1 -1
- package/dist/lang/code-to-args.js +10 -1
- package/dist/lang/code-to-args.js.map +1 -1
- package/dist/lang/determinism-scanner.d.ts.map +1 -1
- package/dist/lang/determinism-scanner.js +22 -9
- package/dist/lang/determinism-scanner.js.map +1 -1
- package/dist/lang/metadata-extractor.d.ts +27 -6
- package/dist/lang/metadata-extractor.d.ts.map +1 -1
- package/dist/lang/metadata-extractor.js +88 -8
- package/dist/lang/metadata-extractor.js.map +1 -1
- package/dist/lang/parse-error.d.ts +4 -0
- package/dist/lang/parse-error.d.ts.map +1 -1
- package/dist/lang/parse-error.js.map +1 -1
- package/dist/lang/security-scanner.d.ts +27 -2
- package/dist/lang/security-scanner.d.ts.map +1 -1
- package/dist/lang/security-scanner.js +29 -2
- package/dist/lang/security-scanner.js.map +1 -1
- package/dist/lang/source-edit.d.ts +2 -2
- package/dist/lang/source-edit.js.map +1 -1
- package/dist/lang/symbol-table.generated.d.ts +36 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +36 -0
- package/dist/lang/symbol-table.generated.js.map +1 -1
- package/dist/mesh/import-model.d.ts +94 -0
- package/dist/mesh/import-model.d.ts.map +1 -0
- package/dist/mesh/import-model.js +15 -0
- package/dist/mesh/import-model.js.map +1 -0
- package/dist/mesh/index.d.ts +19 -58
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +19 -70
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +33 -16
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +144 -39
- package/dist/mesh/io.js.map +1 -1
- package/dist/mesh/primitives.js +1 -1
- package/dist/mesh/primitives.js.map +1 -1
- package/dist/mesh/threemf-bambu.d.ts +12 -1
- package/dist/mesh/threemf-bambu.d.ts.map +1 -1
- package/dist/mesh/threemf-bambu.js +68 -16
- package/dist/mesh/threemf-bambu.js.map +1 -1
- package/dist/mesh/threemf-loader.d.ts +14 -1
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +24 -7
- package/dist/mesh/threemf-loader.js.map +1 -1
- package/dist/mesh/transform.d.ts +1 -1
- package/dist/mesh/transform.js +1 -1
- package/dist/mesh/transform.js.map +1 -1
- package/dist/mesh/types.d.ts +5 -5
- package/dist/mesh/types.d.ts.map +1 -1
- package/dist/mesh/types.js.map +1 -1
- package/dist/node-host/cli.d.ts +49 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +125 -19
- package/dist/node-host/cli.js.map +1 -1
- package/dist/node-host/execute-script.d.ts +55 -0
- package/dist/node-host/execute-script.d.ts.map +1 -0
- package/dist/node-host/execute-script.js +46 -0
- package/dist/node-host/execute-script.js.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -1
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts +260 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.d.ts.map +1 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js +875 -0
- package/dist/occt-kernel/generated/occtPlatform.generated.js.map +1 -0
- package/dist/occt-kernel/hullGeometry.d.ts +2 -2
- package/dist/occt-kernel/hullGeometry.js +2 -3
- package/dist/occt-kernel/hullGeometry.js.map +1 -1
- package/dist/occt-kernel/hullOps.d.ts +3 -3
- package/dist/occt-kernel/hullOps.js +4 -4
- package/dist/occt-kernel/hullOps.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +31 -4
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/occt-kernel/occtKernel.d.ts.map +1 -1
- package/dist/occt-kernel/occtKernel.js +18 -0
- package/dist/occt-kernel/occtKernel.js.map +1 -1
- package/dist/occt-scan/recognize.d.ts +58 -0
- package/dist/occt-scan/recognize.d.ts.map +1 -0
- package/dist/occt-scan/recognize.js +216 -0
- package/dist/occt-scan/recognize.js.map +1 -0
- package/dist/primitives/brep-primitives.js +7 -7
- package/dist/primitives/brep-primitives.js.map +1 -1
- package/dist/result/bug.d.ts +1 -1
- package/dist/result/bug.js +1 -1
- package/dist/result/bug.js.map +1 -1
- package/dist/result/errors.d.ts +2 -2
- package/dist/result/errors.d.ts.map +1 -1
- package/dist/result/errors.js +1 -1
- package/dist/result/errors.js.map +1 -1
- package/dist/result/vec3.d.ts +1 -1
- package/dist/result/vec3.js +1 -1
- package/dist/result/vec3.js.map +1 -1
- package/dist/runtime-state.d.ts +16 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +27 -0
- package/dist/runtime-state.js.map +1 -1
- package/dist/script-globals.d.ts +24 -0
- package/dist/script-globals.d.ts.map +1 -0
- package/dist/script-globals.js +24 -0
- package/dist/script-globals.js.map +1 -0
- package/dist/shape.d.ts +24 -0
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +40 -0
- package/dist/shape.js.map +1 -1
- package/dist/topology/naming/lineage.d.ts +3 -2
- package/dist/topology/naming/lineage.d.ts.map +1 -1
- package/dist/topology/naming/lineage.js.map +1 -1
- package/dist/weapp.d.ts +1 -1
- package/dist/weapp.js +1 -1
- package/dist/weapp.js.map +1 -1
- package/package.json +8 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib-id.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/lib-id.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lib-id.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/lib-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAuDH;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAQjF"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* lib-id — content-addressable identity for a registered library (B2 fix).
|
|
3
3
|
*
|
|
4
|
-
* Design: docs/plans/2026-09-03-faijs-brepjs-compat-api.md §7.3
|
|
5
|
-
*
|
|
6
4
|
* computeLibId(ns) hashes 「binding name + sorted export names + each exported
|
|
7
5
|
* fn.toString()」 — the same content-addressing idea as `local.${callee}#${bodyHash}`:
|
|
8
6
|
* a library identity changes when its implementation changes (so the statement
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib-id.js","sourceRoot":"","sources":["../../src/cad-runtime/lib-id.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lib-id.js","sourceRoot":"","sources":["../../src/cad-runtime/lib-id.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * lib-id — content-addressable identity for a registered library (B2 fix).\n *\n * computeLibId(ns) hashes 「binding name + sorted export names + each exported\n * fn.toString()」 — the same content-addressing idea as `local.${callee}#${bodyHash}`:\n * a library identity changes when its implementation changes (so the statement\n * key changes and downstream recomputes), and is stable when the library is\n * re-registered unchanged (so incremental execution skips zero work).\n *\n * Non-function exports (constants, nested namespaces) participate via a stable\n * per-value encoding — see `encodeValue`. It must never throw: a library may\n * carry arbitrary third-party surface (e.g. a module-namespace child export\n * whose primitive coercion throws), and a throwing encoder would break\n * registration itself. Cycle-safe: shared/self-referencing objects hash\n * deterministically (ancestor objects render as `[Circular]`).\n *\n * @module\n */\n\n/** FNV-1a 32-bit string hash, rendered as an 8-hex-digit key suffix. */\nfunction hashString(s: string): string {\n let h = 0x811c9dc5\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(16).padStart(8, '0')\n}\n\n/**\n * Stable, non-throwing string form of a single namespace export.\n *\n * - functions → source text (`fn.toString()`).\n * - primitives → `String(v)`.\n * - objects (records, module-namespace exotic objects, arrays): expand own\n * enumerable properties recursively so nested library namespaces also get\n * content-hashed; `[Circular]` guards self-references.\n * - values without a safe coercion (e.g. a module-namespace Symbol cannot be\n * turned into a string at all): fall back to `Object.prototype.toString`.\n *\n * @param v - the export value.\n * @param seen - object-identity set guarding return against cyclic structures.\n * @returns a deterministic, throw-free encoding of the value.\n */\nfunction encodeValue(v: unknown, seen: Set<object>): string {\n if (typeof v === 'function') return `fn:${v.toString()}`\n if (v === null || v === undefined) return String(v)\n const t = typeof v\n if (t === 'string' || t === 'number' || t === 'boolean' || t === 'bigint' || t === 'symbol') {\n try {\n return String(v)\n } catch {\n return Object.prototype.toString.call(v)\n }\n }\n // object: expand own enumerable entries (arrays → indexed entries).\n if (typeof v === 'object') {\n if (seen.has(v)) return '[Circular]'\n seen.add(v)\n try {\n const keys = Object.keys(v as object).sort()\n const body = keys\n .map((k) => `${k}:${encodeValue((v as Record<string, unknown>)[k], seen)}`)\n .join(',')\n return Array.isArray(v) ? `arr[${body}]` : `obj{${body}}`\n } finally {\n seen.delete(v)\n }\n }\n return Object.prototype.toString.call(v)\n}\n\n/**\n * Compute a library's content identity.\n *\n * @param binding - the registration binding name (part of the identity).\n * @param ns - the library namespace (exported function sources + resource objects).\n * @returns the content-hash libId (stable across registrations of the same code,\n * changes whenever any export's source or shape changes).\n */\nexport function computeLibId(binding: string, ns: Record<string, unknown>): string {\n const names = Object.keys(ns).sort()\n const seen = new Set<object>()\n const parts: string[] = [binding, ...names]\n for (const n of names) {\n parts.push(encodeValue(ns[n], seen))\n }\n return hashString(parts.join('#'))\n}"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* live-shapes — 无 IR 存活判定(运行时终端 = 最后写者 + 下游无独占消费)
|
|
3
3
|
*
|
|
4
|
-
* 方案:docs/plans/2026-09-06-no-ir-dual-channel-runtime.md §4.4(D5 / P3)
|
|
5
|
-
*
|
|
6
4
|
* 取消 IR 前后,活跃性判断的算法不变,变的是两个输入源:
|
|
7
5
|
* - 语句序列:`metadata.lines`(MetadataExtractor → StatementSummary[],与现状
|
|
8
6
|
* analyzeCode 逐字相等,A-16 锁定);
|
|
@@ -11,7 +9,7 @@
|
|
|
11
9
|
*
|
|
12
10
|
* 候选集合 = ctx 中 shape/compound 键(与现状 allShapeVarNames 同源);
|
|
13
11
|
* lastProducer 由行级 outputs 反查(ctx 值天然是最后写者);
|
|
14
|
-
* 消费判定 = keep 驱动 consumes(
|
|
12
|
+
* 消费判定 = keep 驱动 consumes(R1/R3/R5 短路);
|
|
15
13
|
* 自由 JS 块做词法级引用扫描。
|
|
16
14
|
*
|
|
17
15
|
* 产出 TerminalShape[],与已删除的 computeLeafTerminals 逐字段兼容(A-14 对拍)。
|
|
@@ -52,12 +50,12 @@ export interface LiveShapesInput {
|
|
|
52
50
|
explicitTerminals?: TerminalShape[];
|
|
53
51
|
}
|
|
54
52
|
/**
|
|
55
|
-
* 判定 statement 是否消费变量 v(keep 驱动,
|
|
53
|
+
* 判定 statement 是否消费变量 v(keep 驱动,R1 → R3 → R5 短路)。
|
|
56
54
|
* 输入是 StatementSummary(HostArg 引用形态)。
|
|
57
55
|
* @param line - 消费检查目标语句(行级摘要)。
|
|
58
56
|
* @param v - 被检查的候选 shape/compound 变量。
|
|
59
57
|
* @param keep - keep 来源视图(行内 + 函数体登记)。
|
|
60
|
-
* @param shapeVarNames - 存活候选名集合(
|
|
58
|
+
* @param shapeVarNames - 存活候选名集合(R3 非几何输出判定用)。
|
|
61
59
|
* @returns true 表示该语句消费 v(v 不得作为终端存活)。
|
|
62
60
|
*/
|
|
63
61
|
export declare function lineConsumes(line: StatementSummary, v: PartName, keep: KeepView, shapeVarNames: Set<PartName>): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-shapes.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/live-shapes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"live-shapes.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/live-shapes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAI3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACnB,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,gEAAgE;AAChE,MAAM,WAAW,QAAQ;IACvB,mDAAmD;IACnD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAS,CAAA;IACpD,sDAAsD;IACtD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAA;CAC3D;AAED,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,gBAAgB,EAAE,CAAA;IACzB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC5B,IAAI,EAAE,QAAQ,CAAA;IACd,gEAAgE;IAChE,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5B,6DAA6D;IAC7D,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,aAAa,EAAE,CAAA;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,gBAAgB,EACtB,CAAC,EAAE,QAAQ,EACX,IAAI,EAAE,QAAQ,EACd,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,GAC3B,OAAO,CAoDT;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC5B,CAAC,EAAE,MAAM,EACT,YAAY,EAAE,MAAM,GACnB,OAAO,CAMT;AAOD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,EAAE,CAwFzE;AA8BD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,QAAQ,CAExC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,QAAQ,CAK7E"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* live-shapes — 无 IR 存活判定(运行时终端 = 最后写者 + 下游无独占消费)
|
|
3
3
|
*
|
|
4
|
-
* 方案:docs/plans/2026-09-06-no-ir-dual-channel-runtime.md §4.4(D5 / P3)
|
|
5
|
-
*
|
|
6
4
|
* 取消 IR 前后,活跃性判断的算法不变,变的是两个输入源:
|
|
7
5
|
* - 语句序列:`metadata.lines`(MetadataExtractor → StatementSummary[],与现状
|
|
8
6
|
* analyzeCode 逐字相等,A-16 锁定);
|
|
@@ -11,7 +9,7 @@
|
|
|
11
9
|
*
|
|
12
10
|
* 候选集合 = ctx 中 shape/compound 键(与现状 allShapeVarNames 同源);
|
|
13
11
|
* lastProducer 由行级 outputs 反查(ctx 值天然是最后写者);
|
|
14
|
-
* 消费判定 = keep 驱动 consumes(
|
|
12
|
+
* 消费判定 = keep 驱动 consumes(R1/R3/R5 短路);
|
|
15
13
|
* 自由 JS 块做词法级引用扫描。
|
|
16
14
|
*
|
|
17
15
|
* 产出 TerminalShape[],与已删除的 computeLeafTerminals 逐字段兼容(A-14 对拍)。
|
|
@@ -19,36 +17,36 @@
|
|
|
19
17
|
import { asPartName } from '../identity.js';
|
|
20
18
|
import { isHostVarRef, isHostCallRef, isHostExprRef } from '../lang/host-arg.js';
|
|
21
19
|
/**
|
|
22
|
-
* 判定 statement 是否消费变量 v(keep 驱动,
|
|
20
|
+
* 判定 statement 是否消费变量 v(keep 驱动,R1 → R3 → R5 短路)。
|
|
23
21
|
* 输入是 StatementSummary(HostArg 引用形态)。
|
|
24
22
|
* @param line - 消费检查目标语句(行级摘要)。
|
|
25
23
|
* @param v - 被检查的候选 shape/compound 变量。
|
|
26
24
|
* @param keep - keep 来源视图(行内 + 函数体登记)。
|
|
27
|
-
* @param shapeVarNames - 存活候选名集合(
|
|
25
|
+
* @param shapeVarNames - 存活候选名集合(R3 非几何输出判定用)。
|
|
28
26
|
* @returns true 表示该语句消费 v(v 不得作为终端存活)。
|
|
29
27
|
*/
|
|
30
28
|
export function lineConsumes(line, v, keep, shapeVarNames) {
|
|
31
|
-
//
|
|
29
|
+
// R1:keep 声明胜出——被声明的变量不被本语句消费
|
|
32
30
|
const fnKeep = keep.functionBody(line.line);
|
|
33
31
|
if (fnKeep && fnKeep.kept.has(v))
|
|
34
32
|
return false;
|
|
35
33
|
const lineKeep = keep.lineEntries(line.line);
|
|
36
34
|
if (lineKeep?.some((e) => e.target === String(v)))
|
|
37
35
|
return false;
|
|
38
|
-
// C4
|
|
36
|
+
// R2(原 C4,P25 §3.7 规则 1):无赋值裸调用默认不消费——无论自赋值还是只读,
|
|
39
37
|
// 没有赋值绑定的语句不构成对输入的消费。覆盖 projectView(part)/fai_drill(part0)/
|
|
40
38
|
// volume(part) 等裸调用;修改类裸调用的写回经 inplaceWrites 登记(producer 精确化)。
|
|
41
39
|
if (!line.hasAssignment)
|
|
42
40
|
return false;
|
|
43
|
-
// C3
|
|
41
|
+
// R3(原 C3):本语句有赋值且所有输出都是非几何 → 纯数据/测量/查询语句,不消费任何输入
|
|
44
42
|
if (line.hasAssignment &&
|
|
45
43
|
line.outputs.length > 0 &&
|
|
46
44
|
shapeVarNames.size > 0 &&
|
|
47
45
|
line.outputs.every((o) => !shapeVarNames.has(o))) {
|
|
48
46
|
return false;
|
|
49
47
|
}
|
|
50
|
-
// C5
|
|
51
|
-
// receiver 不消费(成员方法调用对 compound 的消费经
|
|
48
|
+
// R5(原 C5):默认消费——positional 顶层 var-ref / expr-ref refs;嵌套 call-ref 内只读(R4)。
|
|
49
|
+
// receiver 不消费(成员方法调用对 compound 的消费经 R5 扫描其 args)。
|
|
52
50
|
let consumed = false;
|
|
53
51
|
const scan = (value, inCallRef) => {
|
|
54
52
|
if (consumed)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-shapes.js","sourceRoot":"","sources":["../../src/cad-runtime/live-shapes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAqC7E;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAsB,EACtB,CAAW,EACX,IAAc,EACd,aAA4B;IAE5B,iCAAiC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3C,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAE/D,4CAA4C;IAC5C,4DAA4D;IAC5D,+DAA+D;IAC/D,IAAI,CAAC,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAA;IAErC,4CAA4C;IAC5C,IACE,IAAI,CAAC,aAAa;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QACvB,aAAa,CAAC,IAAI,GAAG,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAChD,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,kEAAkE;IAClE,mDAAmD;IACnD,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,SAAkB,EAAQ,EAAE;QACxD,IAAI,QAAQ;YAAE,OAAM;QACpB,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAM;QACvD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAM;YACpC,IAAI,SAAS;gBAAE,OAAM,CAAC,eAAe;YACrC,QAAQ,GAAG,IAAI,CAAA;YACf,OAAM;QACR,CAAC;QACD,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,SAAS;gBAAE,OAAM;YACrB,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAAE,QAAQ,GAAG,IAAI,CAAA;YACnD,OAAM;QACR,CAAC;QACD,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI;gBAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YACzC,OAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,CAAC,IAAe,EAAE,SAAS,CAAC,CAAA;YAC1D,OAAM;QACR,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC;YAAE,IAAI,CAAC,EAAa,EAAE,SAAS,CAAC,CAAA;IAClG,CAAC,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAC3D,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IAChE,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA4B,EAC5B,CAAS,EACT,YAAoB;IAEpB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,IAAI,YAAY;YAAE,SAAQ;QACtC,IAAI,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;IACjD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;IACvD,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;IAEjF,wBAAwB;IACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAA;IAC9C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAA;IAExC,uBAAuB;IACvB,mDAAmD;IACnD,mCAAmC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAA;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,EAAE,EAAE,CAAC;YACP,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,SAAQ;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO;YAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,oDAAoD;IACpD,iDAAiD;IACjD,4CAA4C;IAC5C,IAAI,aAAa,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QACF,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACjC,IAAI,GAAG,KAAK,SAAS;gBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,aAAa;IACb,MAAM,SAAS,GAAoB,EAAE,CAAA;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAE,SAAQ;QACxC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE1B,sDAAsD;QACtD,mCAAmC;QACnC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACnC,MAAM,QAAQ,GAAG,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS;YACjD,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;YACzC,CAAC,CAAC,SAAS,CAAA;QACb,IAAI,WAA+B,CAAA;QACnC,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpD,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;QACvD,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,OAAO,IAAI,QAAQ,CAAA;QACnC,CAAC;QACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,8BAA8B;YAC9B,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;YAChD,SAAQ;QACV,CAAC;QAED,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC;gBAC1D,QAAQ,GAAG,IAAI,CAAA;gBACf,MAAK;YACP,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;gBAAE,QAAQ,GAAG,IAAI,CAAA;QACpG,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;2BAG2B;AAC3B,SAAS,cAAc,CAAC,KAAyB,EAAE,GAAW,EAAE,YAAkC,EAAE,IAAa;IAC/G,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,YAAY,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,CAAA;AAC9B,CAAC;AAED,4CAA4C;AAC5C,SAAS,UAAU,CAAC,KAAyB,EAAE,SAAiB;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,SAAS;YAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAA;AACrB,CAAC;AAED,wCAAwC;AACxC,SAAS,YAAY,CAAC,EAAY,EAAE,QAAgC;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAA;AAC/C,CAAC;AAED,+BAA+B;AAE/B;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAA;AACxE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA8B;IACjE,OAAO;QACL,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;QAC9C,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;KAC9B,CAAA;AACH,CAAC","sourcesContent":["/**\n * live-shapes — 无 IR 存活判定(运行时终端 = 最后写者 + 下游无独占消费)\n *\n * 方案:docs/plans/2026-09-06-no-ir-dual-channel-runtime.md §4.4(D5 / P3)\n *\n * 取消 IR 前后,活跃性判断的算法不变,变的是两个输入源:\n * - 语句序列:`metadata.lines`(MetadataExtractor → StatementSummary[],与现状\n * analyzeCode 逐字相等,A-16 锁定);\n * - 行内 keep 判定:`metadata.keep` 表(提取器已把 args 的 keep/keepHidden 键结构化)\n * + `KeepRegistry`(DirectExecutor 执行期登记,替代 ModuleExecutor.internalKeep)。\n *\n * 候选集合 = ctx 中 shape/compound 键(与现状 allShapeVarNames 同源);\n * lastProducer 由行级 outputs 反查(ctx 值天然是最后写者);\n * 消费判定 = keep 驱动 consumes(C0/C3/C5 短路);\n * 自由 JS 块做词法级引用扫描。\n *\n * 产出 TerminalShape[],与已删除的 computeLeafTerminals 逐字段兼容(A-14 对拍)。\n */\n\nimport type { StatementSummary } from '../lang/statement-summary'\nimport type { UiMetadata, KeepEntry } from '../lang/metadata-extractor'\nimport type { PartName } from '../identity'\nimport { asPartName } from '../identity'\nimport type { HostArg } from '../lang/host-arg'\nimport { isHostVarRef, isHostCallRef, isHostExprRef } from '../lang/host-arg'\nimport type { TerminalShape } from '../lang/types'\n\n/** 函数体 keep 登记(DirectExecutor 执行期登记;与 InternalKeepRecord 同构)。 */\nexport interface KeepRegistration {\n kept: Set<PartName>\n hidden: Map<PartName, boolean>\n}\n\n/** keep 来源视图:行内调用点(metadata.keep 表)+ 函数体执行期登记(KeepRegistry)。 */\nexport interface KeepView {\n /** 行内调用点 keep(lineNo → 条目;extractor 已归一 hidden) */\n lineEntries(lineNo: number): KeepEntry[] | undefined\n /** 函数体 exec.keep 登记(lineNo → 登记;DirectExecutor 提供) */\n functionBody(lineNo: number): KeepRegistration | undefined\n}\n\n/** computeLiveShapes 的输入(与运行时视图解耦:值/名字由调用方提供)。 */\nexport interface LiveShapesInput {\n lines: StatementSummary[]\n blocks: UiMetadata['blocks']\n keep: KeepView\n /** 候选 shape/compound 变量名(ctx 键 ∩ 结构判定;与 allShapeVarNames 同源) */\n shapeVarNames: Set<PartName>\n /** 块单元产出:shape 名 → 块起始行(DirectExecutor 执行块前后 ctx diff 登记) */\n blockOutputs?: Map<string, number>\n /**\n * 原地写回登记(P25 §3.7.4 规则 2):裸调用行 → 写回目标变量名。\n * DirectExecutor 执行期登记(修改类裸调用 `fai_drill(part0)` 把结果写回首参);\n * lastProducer 叠加时把该变量的最后写者锚到裸调用行——写回行之前的旧消费\n * 不误伤写回后的新值(producer 精确化,见方案 §3.7.4)。\n */\n inplaceWrites?: Map<number, string>\n /** 显式 return 终端(metadata.terminalShapes,非空优先——与现状一致) */\n explicitTerminals?: TerminalShape[]\n}\n\n/**\n * 判定 statement 是否消费变量 v(keep 驱动,C0 → C3 → C5 短路)。\n * 输入是 StatementSummary(HostArg 引用形态)。\n * @param line - 消费检查目标语句(行级摘要)。\n * @param v - 被检查的候选 shape/compound 变量。\n * @param keep - keep 来源视图(行内 + 函数体登记)。\n * @param shapeVarNames - 存活候选名集合(C3 非几何输出判定用)。\n * @returns true 表示该语句消费 v(v 不得作为终端存活)。\n */\nexport function lineConsumes(\n line: StatementSummary,\n v: PartName,\n keep: KeepView,\n shapeVarNames: Set<PartName>,\n): boolean {\n // C0/C1:keep 声明胜出——被声明的变量不被本语句消费\n const fnKeep = keep.functionBody(line.line)\n if (fnKeep && fnKeep.kept.has(v)) return false\n const lineKeep = keep.lineEntries(line.line)\n if (lineKeep?.some((e) => e.target === String(v))) return false\n\n // C4(P25 §3.7 规则 1):无赋值裸调用默认不消费——无论自赋值还是只读,\n // 没有赋值绑定的语句不构成对输入的消费。覆盖 projectView(part)/fai_drill(part0)/\n // volume(part) 等裸调用;修改类裸调用的写回经 inplaceWrites 登记(producer 精确化)。\n if (!line.hasAssignment) return false\n\n // C3:本语句有赋值且所有输出都是非几何 → 纯数据/测量/查询语句,不消费任何输入\n if (\n line.hasAssignment &&\n line.outputs.length > 0 &&\n shapeVarNames.size > 0 &&\n line.outputs.every((o) => !shapeVarNames.has(o))\n ) {\n return false\n }\n\n // C5:默认消费——positional 顶层 var-ref / expr-ref refs;嵌套 call-ref 内只读。\n // receiver 不消费(成员方法调用对 compound 的消费经 C5 扫描其 args)。\n let consumed = false\n const scan = (value: HostArg, inCallRef: boolean): void => {\n if (consumed) return\n if (value === null || typeof value !== 'object') return\n if (isHostVarRef(value)) {\n if (value.name !== String(v)) return\n if (inCallRef) return // 嵌套调用内 = 只读查询\n consumed = true\n return\n }\n if (isHostExprRef(value)) {\n if (inCallRef) return\n if (value.refs.includes(String(v))) consumed = true\n return\n }\n if (isHostCallRef(value)) {\n for (const a of value.args) scan(a, true)\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) scan(item as HostArg, inCallRef)\n return\n }\n for (const vv of Object.values(value as Record<string, unknown>)) scan(vv as HostArg, inCallRef)\n }\n for (const parg of line.positional ?? []) scan(parg, false)\n for (const vv of Object.values(line.args ?? {})) scan(vv, false)\n return consumed\n}\n\n/**\n * 块单元词法级引用扫描(§4.3):块源码文本中出现外部 shape 名 → 保守判为消费。\n * 只扫 range.start 行号 > producerIdx 的块(producer 之前的块不可能消费新值)。\n * @param blocks - 块元数据数组(UiMetadata.blocks)。\n * @param v - 被消费的变量名。\n * @param producerLine - 最后写者的行号。\n * @returns true 如果有 producer 之后的块词法消费了该变量。\n */\nexport function blockConsumes(\n blocks: UiMetadata['blocks'],\n v: string,\n producerLine: number,\n): boolean {\n for (const b of blocks) {\n if (b.lineNo <= producerLine) continue\n if (wordBoundaryMatch(b.source, v)) return true\n }\n return false\n}\n\nfunction wordBoundaryMatch(text: string, name: string): boolean {\n const esc = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n return new RegExp(`\\\\b${esc}\\\\b`).test(text)\n}\n\n/**\n * 存活判定主算法(§4.4):候选 = shapeVarNames(ctx 键 ∩ 结构判定);\n * lastProducer = 单次正向遍历 + Map 覆盖写;逐个候选查 producer 之后是否有语句消费。\n *\n * hidden(D2):最后一次保留声明胜出——函数体登记先铺,行内调用点按行号序覆盖。\n *\n * @param input - 存活判定输入(lines/blocks/keep 视图/shapeVarNames/块产出/显式终端)。\n * @returns TerminalShape[]({ id } ∪ hidden),与原 computeLeafTerminals 形态兼容。\n */\nexport function computeLiveShapes(input: LiveShapesInput): TerminalShape[] {\n const { lines, blocks, keep, shapeVarNames, blockOutputs, inplaceWrites } = input\n\n // 显式 return 终端优先(与现状一致)\n const explicit = input.explicitTerminals ?? []\n if (explicit.length > 0) return explicit\n\n // 0. hidden:最后一次保留声明胜出\n // 先铺函数体登记(KeepView.functionBody),再按行号顺序用行级调用点覆盖\n // (Map 按插入序 = 行号序 → 调用点 > 函数体)。\n const hiddenOf = new Map<PartName, boolean>()\n for (const line of lines) {\n const fn = keep.functionBody(line.line)\n if (fn) {\n for (const v of fn.kept) {\n hiddenOf.set(v, fn.hidden.get(v) ?? false)\n }\n }\n }\n for (const line of lines) {\n const entries = keep.lineEntries(line.line)\n if (entries) {\n for (const e of entries) {\n hiddenOf.set(asPartName(e.target), e.hidden)\n }\n }\n }\n\n // 1. lastProducer:单次正向遍历 + Map 覆盖写\n const lastProducer = new Map<string, number>()\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.hasAssignment) continue\n for (const out of line.outputs) lastProducer.set(String(out), i)\n }\n // P25 §3.7.4:原地写回登记(DirectExecutor 执行期;行号 → 写回变量名)。\n // 修改类裸调用(fai_drill(part0) 等)把结果写回首参——把该变量的最后写者锚到\n // 裸调用行(producer 精确化):写回行之前的旧消费只作用于旧值,不误伤新值。\n if (inplaceWrites && inplaceWrites.size > 0) {\n const lineIdxOf = new Map<number, number>()\n lines.forEach((l, i) => {\n if (!lineIdxOf.has(l.line)) lineIdxOf.set(l.line, i)\n })\n for (const [lineNo, name] of inplaceWrites) {\n const idx = lineIdxOf.get(lineNo)\n if (idx !== undefined) lastProducer.set(name, idx)\n }\n }\n\n // 2. 逐个候选名判定\n const terminals: TerminalShape[] = []\n const seen = new Set<string>()\n for (const partName of shapeVarNames) {\n if (seen.has(String(partName))) continue\n seen.add(String(partName))\n const s = String(partName)\n\n // producerIdx:取 lines 中最后写者 与 blockOutputs(块内写者)的较大者。\n // 块在 lines 之后执行时,块是最后写者——用块的行号作锚点。\n const lineIdx = lastProducer.get(s)\n const blockIdx = blockOutputs?.get(s) !== undefined\n ? blockIdxOf(lines, blockOutputs.get(s)!)\n : undefined\n let producerIdx: number | undefined\n if (lineIdx !== undefined && blockIdx !== undefined) {\n producerIdx = blockIdx > lineIdx ? blockIdx : lineIdx\n } else {\n producerIdx = lineIdx ?? blockIdx\n }\n if (producerIdx === undefined) {\n // 无生产者(如宿主手工注入 / 跨文件引用)→ 直接终端\n terminals.push(makeTerminal(partName, hiddenOf))\n continue\n }\n\n let consumed = false\n for (let i = producerIdx + 1; i < lines.length; i++) {\n if (lineConsumes(lines[i], partName, keep, shapeVarNames)) {\n consumed = true\n break\n }\n }\n if (!consumed && blocks.length > 0) {\n if (blockConsumes(blocks, s, producerLineOf(lines, producerIdx, blockOutputs, s))) consumed = true\n }\n if (!consumed) terminals.push(makeTerminal(partName, hiddenOf))\n }\n return terminals\n}\n\n/** producer 行号(lines 下标 → 行号;块产出用块起始行)。\n * 当 blockIdx == lines.length(块行号 > 所有 lines 行号)时,返回块行号本身\n * (从 blockOutputs 反查),确保 blockConsumes 跳过该块(producer 块自身的引用\n * 是对旧值的消费,不应取消新值的终端资格)。 */\nfunction producerLineOf(lines: StatementSummary[], idx: number, blockOutputs?: Map<string, number>, name?: string): number {\n if (idx >= lines.length && blockOutputs && name !== undefined) {\n const blockLine = blockOutputs.get(name)\n if (blockLine !== undefined) return blockLine\n }\n return lines[idx]?.line ?? 0\n}\n\n/** 块起始行 → lines 中第一个 >= 该行的下标(块产出候选的锚点)。 */\nfunction blockIdxOf(lines: StatementSummary[], blockLine: number): number {\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].line >= blockLine) return i\n }\n return lines.length\n}\n\n/** 组装终端条目(hidden 缺省 undefined → 可见)。 */\nfunction makeTerminal(id: PartName, hiddenOf: Map<PartName, boolean>): TerminalShape {\n const hidden = hiddenOf.get(id)\n return hidden ? { id, hidden: true } : { id }\n}\n\n// ── 便捷构造(测试 / runtime 装配用) ──\n\n/**\n * 空 keep 视图(无行内 keep、无函数体登记)。\n * @returns 恒返回 undefined 的 KeepView。\n */\nexport function emptyKeepView(): KeepView {\n return { lineEntries: () => undefined, functionBody: () => undefined }\n}\n\n/**\n * 由 UiMetadata.keep 表构造 KeepView(行内条目;函数体登记由调用方补充)。\n * @param meta - 含 keep 表的元数据(行号 → 行内 keep 条目)。\n * @returns KeepView(lineEntries 查 meta.keep;functionBody 恒空)。\n */\nexport function keepViewFromMetadata(meta: Pick<UiMetadata, 'keep'>): KeepView {\n return {\n lineEntries: (lineNo) => meta.keep.get(lineNo),\n functionBody: () => undefined,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"live-shapes.js","sourceRoot":"","sources":["../../src/cad-runtime/live-shapes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * live-shapes — 无 IR 存活判定(运行时终端 = 最后写者 + 下游无独占消费)\n *\n * 取消 IR 前后,活跃性判断的算法不变,变的是两个输入源:\n * - 语句序列:`metadata.lines`(MetadataExtractor → StatementSummary[],与现状\n * analyzeCode 逐字相等,A-16 锁定);\n * - 行内 keep 判定:`metadata.keep` 表(提取器已把 args 的 keep/keepHidden 键结构化)\n * + `KeepRegistry`(DirectExecutor 执行期登记,替代 ModuleExecutor.internalKeep)。\n *\n * 候选集合 = ctx 中 shape/compound 键(与现状 allShapeVarNames 同源);\n * lastProducer 由行级 outputs 反查(ctx 值天然是最后写者);\n * 消费判定 = keep 驱动 consumes(R1/R3/R5 短路);\n * 自由 JS 块做词法级引用扫描。\n *\n * 产出 TerminalShape[],与已删除的 computeLeafTerminals 逐字段兼容(A-14 对拍)。\n */\n\nimport type { StatementSummary } from '../lang/statement-summary'\nimport type { UiMetadata, KeepEntry } from '../lang/metadata-extractor'\nimport type { PartName } from '../identity'\nimport { asPartName } from '../identity'\nimport type { HostArg } from '../lang/host-arg'\nimport { isHostVarRef, isHostCallRef, isHostExprRef } from '../lang/host-arg'\nimport type { TerminalShape } from '../lang/types'\n\n/** 函数体 keep 登记(DirectExecutor 执行期登记;与 InternalKeepRecord 同构)。 */\nexport interface KeepRegistration {\n kept: Set<PartName>\n hidden: Map<PartName, boolean>\n}\n\n/** keep 来源视图:行内调用点(metadata.keep 表)+ 函数体执行期登记(KeepRegistry)。 */\nexport interface KeepView {\n /** 行内调用点 keep(lineNo → 条目;extractor 已归一 hidden) */\n lineEntries(lineNo: number): KeepEntry[] | undefined\n /** 函数体 exec.keep 登记(lineNo → 登记;DirectExecutor 提供) */\n functionBody(lineNo: number): KeepRegistration | undefined\n}\n\n/** computeLiveShapes 的输入(与运行时视图解耦:值/名字由调用方提供)。 */\nexport interface LiveShapesInput {\n lines: StatementSummary[]\n blocks: UiMetadata['blocks']\n keep: KeepView\n /** 候选 shape/compound 变量名(ctx 键 ∩ 结构判定;与 allShapeVarNames 同源) */\n shapeVarNames: Set<PartName>\n /** 块单元产出:shape 名 → 块起始行(DirectExecutor 执行块前后 ctx diff 登记) */\n blockOutputs?: Map<string, number>\n /**\n * 原地写回登记(P25 §3.7.4 规则 2):裸调用行 → 写回目标变量名。\n * DirectExecutor 执行期登记(修改类裸调用 `fai_drill(part0)` 把结果写回首参);\n * lastProducer 叠加时把该变量的最后写者锚到裸调用行——写回行之前的旧消费\n * 不误伤写回后的新值(producer 精确化,见方案 §3.7.4)。\n */\n inplaceWrites?: Map<number, string>\n /** 显式 return 终端(metadata.terminalShapes,非空优先——与现状一致) */\n explicitTerminals?: TerminalShape[]\n}\n\n/**\n * 判定 statement 是否消费变量 v(keep 驱动,R1 → R3 → R5 短路)。\n * 输入是 StatementSummary(HostArg 引用形态)。\n * @param line - 消费检查目标语句(行级摘要)。\n * @param v - 被检查的候选 shape/compound 变量。\n * @param keep - keep 来源视图(行内 + 函数体登记)。\n * @param shapeVarNames - 存活候选名集合(R3 非几何输出判定用)。\n * @returns true 表示该语句消费 v(v 不得作为终端存活)。\n */\nexport function lineConsumes(\n line: StatementSummary,\n v: PartName,\n keep: KeepView,\n shapeVarNames: Set<PartName>,\n): boolean {\n // R1:keep 声明胜出——被声明的变量不被本语句消费\n const fnKeep = keep.functionBody(line.line)\n if (fnKeep && fnKeep.kept.has(v)) return false\n const lineKeep = keep.lineEntries(line.line)\n if (lineKeep?.some((e) => e.target === String(v))) return false\n\n // R2(原 C4,P25 §3.7 规则 1):无赋值裸调用默认不消费——无论自赋值还是只读,\n // 没有赋值绑定的语句不构成对输入的消费。覆盖 projectView(part)/fai_drill(part0)/\n // volume(part) 等裸调用;修改类裸调用的写回经 inplaceWrites 登记(producer 精确化)。\n if (!line.hasAssignment) return false\n\n // R3(原 C3):本语句有赋值且所有输出都是非几何 → 纯数据/测量/查询语句,不消费任何输入\n if (\n line.hasAssignment &&\n line.outputs.length > 0 &&\n shapeVarNames.size > 0 &&\n line.outputs.every((o) => !shapeVarNames.has(o))\n ) {\n return false\n }\n\n // R5(原 C5):默认消费——positional 顶层 var-ref / expr-ref refs;嵌套 call-ref 内只读(R4)。\n // receiver 不消费(成员方法调用对 compound 的消费经 R5 扫描其 args)。\n let consumed = false\n const scan = (value: HostArg, inCallRef: boolean): void => {\n if (consumed) return\n if (value === null || typeof value !== 'object') return\n if (isHostVarRef(value)) {\n if (value.name !== String(v)) return\n if (inCallRef) return // 嵌套调用内 = 只读查询\n consumed = true\n return\n }\n if (isHostExprRef(value)) {\n if (inCallRef) return\n if (value.refs.includes(String(v))) consumed = true\n return\n }\n if (isHostCallRef(value)) {\n for (const a of value.args) scan(a, true)\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) scan(item as HostArg, inCallRef)\n return\n }\n for (const vv of Object.values(value as Record<string, unknown>)) scan(vv as HostArg, inCallRef)\n }\n for (const parg of line.positional ?? []) scan(parg, false)\n for (const vv of Object.values(line.args ?? {})) scan(vv, false)\n return consumed\n}\n\n/**\n * 块单元词法级引用扫描(§4.3):块源码文本中出现外部 shape 名 → 保守判为消费。\n * 只扫 range.start 行号 > producerIdx 的块(producer 之前的块不可能消费新值)。\n * @param blocks - 块元数据数组(UiMetadata.blocks)。\n * @param v - 被消费的变量名。\n * @param producerLine - 最后写者的行号。\n * @returns true 如果有 producer 之后的块词法消费了该变量。\n */\nexport function blockConsumes(\n blocks: UiMetadata['blocks'],\n v: string,\n producerLine: number,\n): boolean {\n for (const b of blocks) {\n if (b.lineNo <= producerLine) continue\n if (wordBoundaryMatch(b.source, v)) return true\n }\n return false\n}\n\nfunction wordBoundaryMatch(text: string, name: string): boolean {\n const esc = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n return new RegExp(`\\\\b${esc}\\\\b`).test(text)\n}\n\n/**\n * 存活判定主算法(§4.4):候选 = shapeVarNames(ctx 键 ∩ 结构判定);\n * lastProducer = 单次正向遍历 + Map 覆盖写;逐个候选查 producer 之后是否有语句消费。\n *\n * hidden(D2):最后一次保留声明胜出——函数体登记先铺,行内调用点按行号序覆盖。\n *\n * @param input - 存活判定输入(lines/blocks/keep 视图/shapeVarNames/块产出/显式终端)。\n * @returns TerminalShape[]({ id } ∪ hidden),与原 computeLeafTerminals 形态兼容。\n */\nexport function computeLiveShapes(input: LiveShapesInput): TerminalShape[] {\n const { lines, blocks, keep, shapeVarNames, blockOutputs, inplaceWrites } = input\n\n // 显式 return 终端优先(与现状一致)\n const explicit = input.explicitTerminals ?? []\n if (explicit.length > 0) return explicit\n\n // 0. hidden:最后一次保留声明胜出\n // 先铺函数体登记(KeepView.functionBody),再按行号顺序用行级调用点覆盖\n // (Map 按插入序 = 行号序 → 调用点 > 函数体)。\n const hiddenOf = new Map<PartName, boolean>()\n for (const line of lines) {\n const fn = keep.functionBody(line.line)\n if (fn) {\n for (const v of fn.kept) {\n hiddenOf.set(v, fn.hidden.get(v) ?? false)\n }\n }\n }\n for (const line of lines) {\n const entries = keep.lineEntries(line.line)\n if (entries) {\n for (const e of entries) {\n hiddenOf.set(asPartName(e.target), e.hidden)\n }\n }\n }\n\n // 1. lastProducer:单次正向遍历 + Map 覆盖写\n const lastProducer = new Map<string, number>()\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.hasAssignment) continue\n for (const out of line.outputs) lastProducer.set(String(out), i)\n }\n // P25 §3.7.4:原地写回登记(DirectExecutor 执行期;行号 → 写回变量名)。\n // 修改类裸调用(fai_drill(part0) 等)把结果写回首参——把该变量的最后写者锚到\n // 裸调用行(producer 精确化):写回行之前的旧消费只作用于旧值,不误伤新值。\n if (inplaceWrites && inplaceWrites.size > 0) {\n const lineIdxOf = new Map<number, number>()\n lines.forEach((l, i) => {\n if (!lineIdxOf.has(l.line)) lineIdxOf.set(l.line, i)\n })\n for (const [lineNo, name] of inplaceWrites) {\n const idx = lineIdxOf.get(lineNo)\n if (idx !== undefined) lastProducer.set(name, idx)\n }\n }\n\n // 2. 逐个候选名判定\n const terminals: TerminalShape[] = []\n const seen = new Set<string>()\n for (const partName of shapeVarNames) {\n if (seen.has(String(partName))) continue\n seen.add(String(partName))\n const s = String(partName)\n\n // producerIdx:取 lines 中最后写者 与 blockOutputs(块内写者)的较大者。\n // 块在 lines 之后执行时,块是最后写者——用块的行号作锚点。\n const lineIdx = lastProducer.get(s)\n const blockIdx = blockOutputs?.get(s) !== undefined\n ? blockIdxOf(lines, blockOutputs.get(s)!)\n : undefined\n let producerIdx: number | undefined\n if (lineIdx !== undefined && blockIdx !== undefined) {\n producerIdx = blockIdx > lineIdx ? blockIdx : lineIdx\n } else {\n producerIdx = lineIdx ?? blockIdx\n }\n if (producerIdx === undefined) {\n // 无生产者(如宿主手工注入 / 跨文件引用)→ 直接终端\n terminals.push(makeTerminal(partName, hiddenOf))\n continue\n }\n\n let consumed = false\n for (let i = producerIdx + 1; i < lines.length; i++) {\n if (lineConsumes(lines[i], partName, keep, shapeVarNames)) {\n consumed = true\n break\n }\n }\n if (!consumed && blocks.length > 0) {\n if (blockConsumes(blocks, s, producerLineOf(lines, producerIdx, blockOutputs, s))) consumed = true\n }\n if (!consumed) terminals.push(makeTerminal(partName, hiddenOf))\n }\n return terminals\n}\n\n/** producer 行号(lines 下标 → 行号;块产出用块起始行)。\n * 当 blockIdx == lines.length(块行号 > 所有 lines 行号)时,返回块行号本身\n * (从 blockOutputs 反查),确保 blockConsumes 跳过该块(producer 块自身的引用\n * 是对旧值的消费,不应取消新值的终端资格)。 */\nfunction producerLineOf(lines: StatementSummary[], idx: number, blockOutputs?: Map<string, number>, name?: string): number {\n if (idx >= lines.length && blockOutputs && name !== undefined) {\n const blockLine = blockOutputs.get(name)\n if (blockLine !== undefined) return blockLine\n }\n return lines[idx]?.line ?? 0\n}\n\n/** 块起始行 → lines 中第一个 >= 该行的下标(块产出候选的锚点)。 */\nfunction blockIdxOf(lines: StatementSummary[], blockLine: number): number {\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].line >= blockLine) return i\n }\n return lines.length\n}\n\n/** 组装终端条目(hidden 缺省 undefined → 可见)。 */\nfunction makeTerminal(id: PartName, hiddenOf: Map<PartName, boolean>): TerminalShape {\n const hidden = hiddenOf.get(id)\n return hidden ? { id, hidden: true } : { id }\n}\n\n// ── 便捷构造(测试 / runtime 装配用) ──\n\n/**\n * 空 keep 视图(无行内 keep、无函数体登记)。\n * @returns 恒返回 undefined 的 KeepView。\n */\nexport function emptyKeepView(): KeepView {\n return { lineEntries: () => undefined, functionBody: () => undefined }\n}\n\n/**\n * 由 UiMetadata.keep 表构造 KeepView(行内条目;函数体登记由调用方补充)。\n * @param meta - 含 keep 表的元数据(行号 → 行内 keep 条目)。\n * @returns KeepView(lineEntries 查 meta.keep;functionBody 恒空)。\n */\nexport function keepViewFromMetadata(meta: Pick<UiMetadata, 'keep'>): KeepView {\n return {\n lineEntries: (lineNo) => meta.keep.get(lineNo),\n functionBody: () => undefined,\n }\n}\n"]}
|
|
@@ -151,9 +151,9 @@ export interface LibLoader {
|
|
|
151
151
|
/**
|
|
152
152
|
* 按 packageName 的逐库 `autoLift` 覆盖(优先于 `options.autoLift`)。
|
|
153
153
|
* 返回 `undefined` 时回落到全局选项 / 推断式。用于别名库:如 cq-compat 在
|
|
154
|
-
* 浏览器 host 被全局 autoLift 提升后,compat
|
|
155
|
-
*
|
|
156
|
-
*
|
|
154
|
+
* 浏览器 host 被全局 autoLift 提升后,compat 边界会改变实参形态,破坏其
|
|
155
|
+
* 内部「以 Shape 受众」的借面逻辑(原 CLI 即按 autoLift=false 运行)。
|
|
156
|
+
* 逐库关掉提升恢复 CLI 等价行为。
|
|
157
157
|
*/
|
|
158
158
|
autoLiftFor?: (packageName: string) => boolean | undefined;
|
|
159
159
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/cad-runtime/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG","sourcesContent":["/**\n * Ports 接口定义 — Host 注入的环境能力\n *\n *\n * L2 CadRuntime 通过这些接口获取所有环境能力(CSG 计算、SDF 求值、字体、纹理、资产、事件)。\n * 不直接 import 任何 ?worker、window、document、zustand store——这些由 Host 实现。\n *\n * 两个宿主各自实现:\n * - browser host: WorkerCsgBackend / WorkerSdfBackend / BrowserFontProvider / ...\n * - node host (P3): InlineCsgBackend / InlineSdfBackend / NodeFontProvider / ...\n */\n\nimport type { PartName } from '../identity'\nimport type { LibNamespace } from '../runtime-state'\n\n// ── 共享类型 ──\n\n/** 网格数据(与 csg.ts ManifoldMeshData 同构) */\nexport interface MeshData {\n positions: Float32Array\n indices: Uint32Array\n}\n\n/** 平面参数 */\nexport interface PlaneParams {\n normal: [number, number, number]\n offset: number\n}\n\n// Re-export joinery param types from boolean/geo-convert to ensure\n// structural identity across CsgBackend interface and implementations.\nexport type {\n DovetailGrooveParams,\n DowelSplitParams,\n StraightTenonSplitParams,\n} from '../boolean/geo-convert'\nimport type {\n DovetailGrooveParams,\n DowelSplitParams,\n StraightTenonSplitParams,\n} from '../boolean/geo-convert'\n\n/** 分割结果 */\nexport interface SplitResult {\n front: MeshData\n back: MeshData\n wedge: MeshData | null\n}\n\n// ── CsgBackend ──\n\n/**\n * CSG 后端接口 — mesh 路径的布尔/分割操作。\n *\n * browser 实现:WorkerCsgBackend(经 csg-worker postMessage)\n * node 实现 (P3):InlineCsgBackend(主线程直跑 manifold-3d)\n */\nexport interface CsgBackend {\n boolean(op: 'union' | 'subtract' | 'intersect', meshes: MeshData[]): Promise<MeshData>\n splitPlane(mesh: MeshData, plane: PlaneParams): Promise<{ front: MeshData; back: MeshData }>\n splitDovetail(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: DovetailGrooveParams\n },\n ): Promise<SplitResult>\n splitDowel(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: DowelSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult>\n splitStraightTenon(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: StraightTenonSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult>\n}\n\n// ── SdfBackend ──\n\n/**\n * SDF 后端接口 — SDF 求值。\n *\n * browser 实现:WorkerSdfBackend(经 sdf-worker postMessage)\n * node 实现 (P3):InlineSdfBackend(主线程直跑)\n */\nexport interface SdfBackend {\n runSdf(\n code: string,\n params: Record<string, number>,\n bounds: [number, number, number, number, number, number],\n edgeLength: number,\n level?: number,\n tolerance?: number,\n ): Promise<MeshData>\n}\n\n// ── FontProvider ──\n\n/**\n * 字体提供者接口。\n *\n * browser 实现:BrowserFontProvider(?url + fetch + fontRegistry DI)\n * node 实现 (P3):NodeFontProvider(fs 字体加载)\n */\nexport interface FontProvider {\n /** 加载字体字节(按 key/path),返回 ArrayBuffer */\n loadFont(key: string): Promise<ArrayBuffer>\n /** 列出可用字体 key(node 端为资产目录,browser 端为注册表) */\n listFonts(): string[]\n}\n\n// ── TextureSampler ──\n\n/**\n * 纹理采样接口 — knurl 纹理。\n *\n * browser 实现:CanvasTextureSampler(Image + canvas)\n * node 实现 (P3):纯数据解码\n */\nexport interface TextureSampler {\n /** 采样纹理在 (u, v) 处的值 [0,1] */\n sample(u: number, v: number): number\n /** 纹理尺寸 */\n readonly width: number\n readonly height: number\n}\n\n// ── AssetResolver ──\n\n/**\n * 资产解析接口 — load* 操作的字节来源。\n *\n * browser 实现:FaicadAssetResolver(faicad 会话缓存)\n * node 实现 (P3):FsAssetResolver(--assets 目录/manifest)\n */\nexport interface AssetResolver {\n /** loadByKey 的 headless 等价物 */\n resolveByKey(key: string): Promise<{ bytes: ArrayBuffer; format?: string }>\n /** 本地文件路径(browser 下抛错) */\n resolveFile(path: string): Promise<ArrayBuffer>\n /** 网络 URL(两环境通用) */\n resolveUrl(url: string): Promise<ArrayBuffer>\n}\n\n// ── EventSink ──\n\n/**\n * 事件通知接口 — BREP 丢失等事件。\n *\n * browser 实现:BrowserEventSink(window.dispatchEvent → toast)\n * node 实现 (P3):CliEventSink(写入 stderr + 收集到 events 数组)\n */\nexport interface EventSink {\n emit(event: 'part-brep-lost', detail: { partName: PartName; callee: string; reason: string }): void\n}\n\n// ── LibLoader ──\n\n/**\n * 库加载器接口 — 按 packageName 自动装载未注册的第三方库。\n *\n * 宿主实现:\n * - node CLI(createNodePorts):白名单 + Node 原生 `import(name)`(monorepo\n * workspace symlink 直接把裸包解析到包源码)。\n * - browser / demo:静态 `LIB_MODULES` 映射表(value 必须是静态字面量\n * specifier,Vite/Rollup 才能静态分析打包;禁止变量传参的 import(name))。\n * - vitest:复用浏览器映射表写法 + `await import('@faicad/…')`(alias 落位活源码)。\n */\nexport interface LibLoader {\n /** 按 packageName 加载库模块,返回其导出命名空间对象(与 registerLib 的 ns 同形)。 */\n loadLib(packageName: string): Promise<LibNamespace>\n /** 列出当前可加载的 packageName(check 阶段同步校验 import specifier 用)。 */\n listLibs(): string[]\n /** 自动装载的注册选项;缺省由推断式决定(有 dual-op 的库不提升,全裸函数库自动提升,与手动注入一致)。 */\n options?: {\n autoLift?: boolean\n /**\n * 按 packageName 的逐库 `autoLift` 覆盖(优先于 `options.autoLift`)。\n * 返回 `undefined` 时回落到全局选项 / 推断式。用于别名库:如 cq-compat 在\n * 浏览器 host 被全局 autoLift 提升后,compat
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/cad-runtime/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG","sourcesContent":["/**\n * Ports 接口定义 — Host 注入的环境能力\n *\n *\n * L2 CadRuntime 通过这些接口获取所有环境能力(CSG 计算、SDF 求值、字体、纹理、资产、事件)。\n * 不直接 import 任何 ?worker、window、document、zustand store——这些由 Host 实现。\n *\n * 两个宿主各自实现:\n * - browser host: WorkerCsgBackend / WorkerSdfBackend / BrowserFontProvider / ...\n * - node host (P3): InlineCsgBackend / InlineSdfBackend / NodeFontProvider / ...\n */\n\nimport type { PartName } from '../identity'\nimport type { LibNamespace } from '../runtime-state'\n\n// ── 共享类型 ──\n\n/** 网格数据(与 csg.ts ManifoldMeshData 同构) */\nexport interface MeshData {\n positions: Float32Array\n indices: Uint32Array\n}\n\n/** 平面参数 */\nexport interface PlaneParams {\n normal: [number, number, number]\n offset: number\n}\n\n// Re-export joinery param types from boolean/geo-convert to ensure\n// structural identity across CsgBackend interface and implementations.\nexport type {\n DovetailGrooveParams,\n DowelSplitParams,\n StraightTenonSplitParams,\n} from '../boolean/geo-convert'\nimport type {\n DovetailGrooveParams,\n DowelSplitParams,\n StraightTenonSplitParams,\n} from '../boolean/geo-convert'\n\n/** 分割结果 */\nexport interface SplitResult {\n front: MeshData\n back: MeshData\n wedge: MeshData | null\n}\n\n// ── CsgBackend ──\n\n/**\n * CSG 后端接口 — mesh 路径的布尔/分割操作。\n *\n * browser 实现:WorkerCsgBackend(经 csg-worker postMessage)\n * node 实现 (P3):InlineCsgBackend(主线程直跑 manifold-3d)\n */\nexport interface CsgBackend {\n boolean(op: 'union' | 'subtract' | 'intersect', meshes: MeshData[]): Promise<MeshData>\n splitPlane(mesh: MeshData, plane: PlaneParams): Promise<{ front: MeshData; back: MeshData }>\n splitDovetail(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n bboxWidthOnWidthDir: number\n groove: DovetailGrooveParams\n },\n ): Promise<SplitResult>\n splitDowel(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n dowel: DowelSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult>\n splitStraightTenon(\n mesh: MeshData,\n params: {\n planeNormal: [number, number, number]\n planeDistance: number\n planeCenter: [number, number, number]\n widthDir: [number, number, number]\n tenon: StraightTenonSplitParams\n selectedSections?: number[] | null\n },\n ): Promise<SplitResult>\n}\n\n// ── SdfBackend ──\n\n/**\n * SDF 后端接口 — SDF 求值。\n *\n * browser 实现:WorkerSdfBackend(经 sdf-worker postMessage)\n * node 实现 (P3):InlineSdfBackend(主线程直跑)\n */\nexport interface SdfBackend {\n runSdf(\n code: string,\n params: Record<string, number>,\n bounds: [number, number, number, number, number, number],\n edgeLength: number,\n level?: number,\n tolerance?: number,\n ): Promise<MeshData>\n}\n\n// ── FontProvider ──\n\n/**\n * 字体提供者接口。\n *\n * browser 实现:BrowserFontProvider(?url + fetch + fontRegistry DI)\n * node 实现 (P3):NodeFontProvider(fs 字体加载)\n */\nexport interface FontProvider {\n /** 加载字体字节(按 key/path),返回 ArrayBuffer */\n loadFont(key: string): Promise<ArrayBuffer>\n /** 列出可用字体 key(node 端为资产目录,browser 端为注册表) */\n listFonts(): string[]\n}\n\n// ── TextureSampler ──\n\n/**\n * 纹理采样接口 — knurl 纹理。\n *\n * browser 实现:CanvasTextureSampler(Image + canvas)\n * node 实现 (P3):纯数据解码\n */\nexport interface TextureSampler {\n /** 采样纹理在 (u, v) 处的值 [0,1] */\n sample(u: number, v: number): number\n /** 纹理尺寸 */\n readonly width: number\n readonly height: number\n}\n\n// ── AssetResolver ──\n\n/**\n * 资产解析接口 — load* 操作的字节来源。\n *\n * browser 实现:FaicadAssetResolver(faicad 会话缓存)\n * node 实现 (P3):FsAssetResolver(--assets 目录/manifest)\n */\nexport interface AssetResolver {\n /** loadByKey 的 headless 等价物 */\n resolveByKey(key: string): Promise<{ bytes: ArrayBuffer; format?: string }>\n /** 本地文件路径(browser 下抛错) */\n resolveFile(path: string): Promise<ArrayBuffer>\n /** 网络 URL(两环境通用) */\n resolveUrl(url: string): Promise<ArrayBuffer>\n}\n\n// ── EventSink ──\n\n/**\n * 事件通知接口 — BREP 丢失等事件。\n *\n * browser 实现:BrowserEventSink(window.dispatchEvent → toast)\n * node 实现 (P3):CliEventSink(写入 stderr + 收集到 events 数组)\n */\nexport interface EventSink {\n emit(event: 'part-brep-lost', detail: { partName: PartName; callee: string; reason: string }): void\n}\n\n// ── LibLoader ──\n\n/**\n * 库加载器接口 — 按 packageName 自动装载未注册的第三方库。\n *\n * 宿主实现:\n * - node CLI(createNodePorts):白名单 + Node 原生 `import(name)`(monorepo\n * workspace symlink 直接把裸包解析到包源码)。\n * - browser / demo:静态 `LIB_MODULES` 映射表(value 必须是静态字面量\n * specifier,Vite/Rollup 才能静态分析打包;禁止变量传参的 import(name))。\n * - vitest:复用浏览器映射表写法 + `await import('@faicad/…')`(alias 落位活源码)。\n */\nexport interface LibLoader {\n /** 按 packageName 加载库模块,返回其导出命名空间对象(与 registerLib 的 ns 同形)。 */\n loadLib(packageName: string): Promise<LibNamespace>\n /** 列出当前可加载的 packageName(check 阶段同步校验 import specifier 用)。 */\n listLibs(): string[]\n /** 自动装载的注册选项;缺省由推断式决定(有 dual-op 的库不提升,全裸函数库自动提升,与手动注入一致)。 */\n options?: {\n autoLift?: boolean\n /**\n * 按 packageName 的逐库 `autoLift` 覆盖(优先于 `options.autoLift`)。\n * 返回 `undefined` 时回落到全局选项 / 推断式。用于别名库:如 cq-compat 在\n * 浏览器 host 被全局 autoLift 提升后,compat 边界会改变实参形态,破坏其\n * 内部「以 Shape 受众」的借面逻辑(原 CLI 即按 autoLift=false 运行)。\n * 逐库关掉提升恢复 CLI 等价行为。\n */\n autoLiftFor?: (packageName: string) => boolean | undefined\n }\n /**\n * 可选源码扫描钩子(§6.2 ②):宿主返回库源码时走同一 SecurityScanner(A4,固定 strict);\n * 不提供或返回 undefined 则跳过。不改 loadLib 返回值——返回 LibNamespace,\n * 往里挂 source 会被 admitCompatLib 当成导出值并污染命名空间。\n * @param packageName - the npm package name.\n * @returns the library source text if available, otherwise undefined.\n */\n loadSource?(packageName: string): Promise<string | undefined>\n}\n\n// ── ProjectLoader ──\n\n/**\n * 项目文件加载器(多文件,§4.5)——按 moduleKey 读取/枚举项目内 .fai.js 模块源码。\n *\n * moduleKey 约定:host 决定字符串形态(项目根相对路径等);引擎只做最小归一\n * (POSIX 斜杠、去掉 `./`/`../`/前导 `/` 前缀),随后按 `listModules()` 精确匹配。\n *\n * host 实现:\n * - 3d_editor / browser:项目文件表 + session 内缓存;\n * - node / vitest:内存映射表或 fs 读取(fixture 目录)。\n */\nexport interface ProjectLoader {\n /** 列出当前可加载的 moduleKey(装载前预检 / 错误提示用)。 */\n listModules(): string[]\n /** 按 moduleKey 读取模块源码(.fai.js 文本)。 */\n readSource(moduleKey: string): Promise<string>\n /** 模块内容指纹(增量缓存用;不提供则每次全量重读重执行)。 */\n fingerprint?(moduleKey: string): Promise<string>\n}\n\n// ── HostPorts 汇总 ──\n\n/**\n * Host 在 createRuntime 时注入的全部环境能力。\n *\n * 所有字段可选——node 测试环境可只提供 occt kernel(不注入 csg/sdf),\n * BREP-path ops 不依赖这些 Port。\n */\nexport interface HostPorts {\n csg?: CsgBackend\n sdf?: SdfBackend\n fonts?: FontProvider\n texture?: TextureSampler\n assets?: AssetResolver\n events: EventSink // events 必填——断链通知是基础能力\n /** 库加载器(execute 自动装载未注册库;check 用它做 specifier 预检)。可选——无则仅手工 registerLib。 */\n libLoader?: LibLoader\n /** 项目文件加载器(相对 specifier 的多文件模块,§4.5)。可选——不提供则单文件行为不变。 */\n projectLoader?: ProjectLoader\n}\n\n// ── 执行模式 ──\n\n/**\n * 执行模式(设计文档 §4.4)。\n *\n * - `auto`(默认):优先 BREP,断链后自动切 mesh + EventSink 通知\n * - `brep`:强制 BREP,断链即报错 E_BREP_UNSUPPORTED,不自动切换\n * - `mesh`:全部走 mesh 路径\n */\nexport type ExecutionMode = 'auto' | 'brep' | 'mesh'\n"]}
|
|
@@ -26,6 +26,7 @@ import type { SecurityPolicy } from '../lang/security-scanner.js';
|
|
|
26
26
|
import type { HostPorts, ExecutionMode } from './ports.js';
|
|
27
27
|
import type { SelectorRuntimeData } from '../topology/build-selector-runtime.js';
|
|
28
28
|
import type { SelectorRuntime } from '../topology/types.js';
|
|
29
|
+
import type { ImportModel } from '../mesh/import-model.js';
|
|
29
30
|
import { type PartName } from '../identity.js';
|
|
30
31
|
import type { ExecBackendChoice } from './exec-backend.js';
|
|
31
32
|
import { type OpDimMap } from '../lang/metadata-extractor.js';
|
|
@@ -160,6 +161,13 @@ export interface ExecutionResult {
|
|
|
160
161
|
* 零件数(≥2)。宿主据此弹「该文件包含 N 个零件,当前仅加载第一个」警告。
|
|
161
162
|
*/
|
|
162
163
|
multiPartCounts?: Map<PartName, number>;
|
|
164
|
+
/**
|
|
165
|
+
* 导入模型结构(方案 2026-10-06-step-3mf-multipart-import-plan.md §5.5)—
|
|
166
|
+
* 每个执行了 `cad.load` 的 part 的 ImportModel(零件身份表 + 装配层级 +
|
|
167
|
+
* Bambu 视图)。单/多零件均登记(单零件 parts 长度 1)。宿主据此批量建
|
|
168
|
+
* part / 消费装配结构,不再自行解析文件。
|
|
169
|
+
*/
|
|
170
|
+
importModels?: Map<PartName, ImportModel>;
|
|
163
171
|
}
|
|
164
172
|
/**
|
|
165
173
|
* Options controlling a single CadRuntime execution. All inputs are code text
|
|
@@ -233,7 +241,7 @@ export interface CadRuntimeOptions {
|
|
|
233
241
|
/**
|
|
234
242
|
* 执行后端(缺省 'vm';静态选定,无运行时回退)。'interpreter' 为无
|
|
235
243
|
* `new Function`/eval 的 AST 解释器后端,供禁 eval 环境(weapp / 严格 CSP)
|
|
236
|
-
*
|
|
244
|
+
* 使用。
|
|
237
245
|
*/
|
|
238
246
|
execBackend?: ExecBackendChoice;
|
|
239
247
|
/**
|
|
@@ -350,14 +358,12 @@ export declare class CadRuntime {
|
|
|
350
358
|
* @param options - registration hints. `packageName` declares the npm package
|
|
351
359
|
* backing this binding so `check()` can validate script import specifiers
|
|
352
360
|
* against registered libraries (specifier mismatch = hard check error).
|
|
353
|
-
|
|
354
|
-
* not borrow inputs into brepjs handle form (compat-op.ts CompatSpec.borrow).
|
|
361
|
+
|
|
355
362
|
*/
|
|
356
363
|
registerLib(binding: string, ns: LibNamespace, options?: {
|
|
357
364
|
default?: boolean;
|
|
358
365
|
autoLift?: boolean;
|
|
359
366
|
packageName?: string;
|
|
360
|
-
borrow?: boolean;
|
|
361
367
|
}): void;
|
|
362
368
|
/** The runtime's default namespace binding name (host-declared; 'cad' by default). */
|
|
363
369
|
get defaultNs(): string;
|
|
@@ -541,7 +547,7 @@ export declare class CadRuntime {
|
|
|
541
547
|
* @param partName - the part name to look up.
|
|
542
548
|
* @returns the cached shape, or undefined.
|
|
543
549
|
*/
|
|
544
|
-
getCachedOutput(partName: PartName): Shape | undefined;
|
|
550
|
+
getCachedOutput(partName: PartName): Shape | CompoundShape | undefined;
|
|
545
551
|
/**
|
|
546
552
|
* Get a statement cache's full entry (statementKey / outputContentKey / output;
|
|
547
553
|
* used by tests and host diagnostics).
|
|
@@ -551,7 +557,7 @@ export declare class CadRuntime {
|
|
|
551
557
|
getStatementCacheEntry(partName: PartName): {
|
|
552
558
|
statementKey: string;
|
|
553
559
|
outputContentKey: string;
|
|
554
|
-
output: Shape;
|
|
560
|
+
output: Shape | CompoundShape;
|
|
555
561
|
} | undefined;
|
|
556
562
|
/**
|
|
557
563
|
* Write an entry into the statement cache (keyed by PartName).
|
|
@@ -560,7 +566,7 @@ export declare class CadRuntime {
|
|
|
560
566
|
* @param output - the shape output.
|
|
561
567
|
* @param outputContentKey - the output's content key.
|
|
562
568
|
*/
|
|
563
|
-
writeToStatementCache(partName: PartName, _stmt: unknown, output: Shape, outputContentKey: string): void;
|
|
569
|
+
writeToStatementCache(partName: PartName, _stmt: unknown, output: Shape | CompoundShape, outputContentKey: string): void;
|
|
564
570
|
/** 清除语句缓存(含 statementCache + DirectExecutor ctx 变量) */
|
|
565
571
|
clearStatementCache(): void;
|
|
566
572
|
/**
|
|
@@ -620,6 +626,14 @@ export declare class CadRuntime {
|
|
|
620
626
|
* @returns SelectorRuntime,或 null(无可用 BREP solid)
|
|
621
627
|
*/
|
|
622
628
|
buildBrepTopology(partName: PartName): SelectorRuntime | null;
|
|
629
|
+
/**
|
|
630
|
+
* 多零件 compound 终端的合并 BREP 拓扑(见 buildCompoundTopologyRuntime)。
|
|
631
|
+
*
|
|
632
|
+
* 读 compound 的**当前** children(装配变换已把新 solid 写回 child 槽位,
|
|
633
|
+
* brepOf(child) 返回最新句柄——比 buildBrepTopology 读持久 solidCache 更不
|
|
634
|
+
* 会陈旧),按声明序合并为单个 occurrence-aware runtime。
|
|
635
|
+
*/
|
|
636
|
+
private buildCompoundBrepTopology;
|
|
623
637
|
/**
|
|
624
638
|
* dryRun:acorn 语法门禁 + 元数据提取(T5 后唯一路径)。
|
|
625
639
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAGvD,OAAO,EAAc,KAAK,QAAQ,EAAe,MAAM,aAAa,CAAA;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAIvD,OAAO,EAAoC,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAC5F,OAAO,EAEkB,KAAK,YAAY,EACxC,KAAK,sBAAsB,EAC5B,MAAM,kBAAkB,CAAA;AAMzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAuC,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAI1D,OAAO,EAA8C,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAShH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,8EAA8E;IAC9E,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAA;IAC3E,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,iDAAiD;IACjD,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CACnD;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,QAAQ,EAAE,QAAQ,CAAA;IAClB,iBAAiB;IACjB,MAAM,EAAE,cAAc,CAAA;IACtB,6BAA6B;IAC7B,IAAI,EAAE,mBAAmB,CAAA;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,aAAa,CAAC,CAAA;IAC7C,iCAAiC;IACjC,SAAS,EAAE,cAAc,CAAA;IACzB,aAAa;IACb,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,cAAc;IACd,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,8HAA8H;IAC9H,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7F,yDAAyD;IACzD,UAAU,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC,CAAA;IACxE;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IACtC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAClC;;;OAGG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;IACrC,8DAA8D;IAC9D,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAA;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACrC;;;;OAIG;IACH,UAAU,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAA;IAClD;;;;OAIG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAErC;;;;OAIG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACvC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,sCAAsC;IACtC,aAAa,CAAC,EAAE;QAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IACxF,6CAA6C;IAC7C,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACzD;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;IAClC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAKD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAiBnE;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAExC,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,MAAM;;IAH3B,+DAA+D;IACtD,WAAW,EAAE,MAAM;IAC5B,+DAA+D;IACtD,UAAU,EAAE,MAAM;CAS9B;AA2BD,YAAY,EAAE,iBAAiB,EAAE,CAAA;AAEjC;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B;;;;OAIG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAA;CAChC;AAED;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,kCAAkC;IAClC,QAAQ,CAAC,YAAY,EAAG,QAAQ,CAAS;IAEzC,4DAA4D;IAC5D,OAAO,CAAC,cAAc,CAMlB;IAEJ,yEAAyE;IACzE,OAAO,CAAC,eAAe,CAAsB;IAC7C,wCAAwC;IACxC,OAAO,CAAC,cAAc,CAAoB;IAG1C,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,4BAA4B,CAAsB;IAC1D,OAAO,CAAC,iBAAiB,CAAQ;IAEjC;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAkC;IAEpD,2DAA2D;IAC3D,OAAO,CAAC,kBAAkB,CAA6C;IAEvE,+EAA+E;IAC/E,OAAO,CAAC,cAAc,CAA+B;IAErD,+DAA+D;IAC/D,OAAO,CAAC,MAAM,CAA6B;IAE3C;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA0B;IAE5D;;;OAGG;IACH,OAAO,CAAC,SAAS,CAA8B;IAE/C;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAoC;IAEzD,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAE5C,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmB;IACrD,oDAAoD;IACpD,OAAO,CAAC,mBAAmB,CAAe;IAE1C,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC;qEACiE;IACjE,OAAO,CAAC,aAAa,CAAQ;IAE7B;;;;;;;;;OASG;IACH;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA0B/H,sFAAsF;IACtF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;;;;OAOG;IACH,SAAS,IAAI,QAAQ;gBAKnB,KAAK,EAAE,SAAS,EAChB,IAAI,GAAE,aAAsB,EAC5B,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAM,EACvC,OAAO,GAAE,iBAAsB;IA+BjC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa;IA2CrB;;;;;OAKG;YACW,eAAe;IAuB7B;;;;;;;;;OASG;YACW,iBAAiB;IAmB/B,mCAAmC;IACnC,MAAM,KAAK,cAAc,IAAI,MAAM,GAAG,IAAI,CAEzC;IAED;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAI5E;;;;;;;;OAQG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAI3E;;;;;;;;OAQG;YACW,kBAAkB;IAmDhC,4FAA4F;IAC5F,OAAO,CAAC,uBAAuB;IAU/B,2DAA2D;IAC3D,OAAO,CAAC,iBAAiB;IAWzB;;;;OAIG;YACW,iBAAiB;IAoC/B,0EAA0E;IAC1E,OAAO,CAAC,iBAAiB;IAMzB;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;OAGG;YACW,gBAAgB;IAK9B;;;;OAIG;YACW,gBAAgB;IA6C9B,gEAAgE;IAChE,OAAO,CAAC,YAAY;IAUpB;;;;OAIG;YACW,uBAAuB;IA8BrC,yEAAyE;YAC3D,eAAe;IAyB7B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAuI3B,gEAAgE;IAChE,OAAO,CAAC,MAAM,CAAC,cAAc;IAO7B;;;;;;;OAOG;IACH,OAAO,CAAC,yBAAyB;IAuDjC,6DAA6D;IAC7D,OAAO,CAAC,gBAAgB;IAoBxB;;;;OAIG;YACW,uBAAuB;IAqCrC;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAM/F;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,aAAa,GAAG,SAAS;IAItE;;;;;OAKG;IACH,sBAAsB,CACpB,QAAQ,EAAE,QAAQ,GACjB;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,aAAa,CAAA;KAAE,GAAG,SAAS;IAIhG;;;;;;OAMG;IACH,qBAAqB,CACnB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,KAAK,GAAG,aAAa,EAC7B,gBAAgB,EAAE,MAAM,GACvB,IAAI;IAQP,uDAAuD;IACvD,mBAAmB,IAAI,IAAI;IAO3B;;;;;;;;;;OAUG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAWxF;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS;IAIzD;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIxC;;;;;;OAMG;IACH,IAAI,UAAU,IAAI,iBAAiB,CAElC;IAED;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,IAAI;IAoB7D;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IASjC;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAiChC;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;;;;;;;;;;;;;;;OAgBG;YACW,iBAAiB;IAqK/B;;OAEG;YACW,cAAc;IAqB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;;OAGG;IACH,OAAO,IAAI,IAAI;CAgBhB;AAID;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAElJ"}
|
|
@@ -20,7 +20,7 @@ import { getBrepEngine, hasBrepEngine, getActiveBrepEngineId, getMeshSolidBacken
|
|
|
20
20
|
import { ensureOcctDefaultEngine } from '../brep/engine/adapters/occt.js';
|
|
21
21
|
import { MeshSolidRegistry } from '../brep/mesh-solid.js';
|
|
22
22
|
import { ParseError } from '../lang/parse-error.js';
|
|
23
|
-
import { buildSolidTopologyRuntime } from '../brep/brep-topology.js';
|
|
23
|
+
import { buildSolidTopologyRuntime, buildCompoundTopologyRuntime } from '../brep/brep-topology.js';
|
|
24
24
|
import { buildTopologyFromMesh } from '../brep/brep-topology.js';
|
|
25
25
|
import { asPartName } from '../identity.js';
|
|
26
26
|
import { DirectExecutor } from './direct-executor.js';
|
|
@@ -200,8 +200,7 @@ export class CadRuntime {
|
|
|
200
200
|
* @param options - registration hints. `packageName` declares the npm package
|
|
201
201
|
* backing this binding so `check()` can validate script import specifiers
|
|
202
202
|
* against registered libraries (specifier mismatch = hard check error).
|
|
203
|
-
|
|
204
|
-
* not borrow inputs into brepjs handle form (compat-op.ts CompatSpec.borrow).
|
|
203
|
+
|
|
205
204
|
*/
|
|
206
205
|
registerLib(binding, ns, options) {
|
|
207
206
|
assertContractVersion(ns);
|
|
@@ -213,10 +212,10 @@ export class CadRuntime {
|
|
|
213
212
|
// skip the strict validation pass (R8).
|
|
214
213
|
// Naming (2026-09-23): library authors no longer declare face naming; every
|
|
215
214
|
// bare function is admitted with the default unmodeled provenance (see
|
|
216
|
-
// admit-compat-lib.ts
|
|
215
|
+
// admit-compat-lib.ts).
|
|
217
216
|
const lift = options?.autoLift ?? !hasDualOp(ns);
|
|
218
217
|
const admitted = lift
|
|
219
|
-
? admitCompatLib(ns
|
|
218
|
+
? admitCompatLib(ns)
|
|
220
219
|
: ns;
|
|
221
220
|
this.libs[binding] = admitted;
|
|
222
221
|
this.libIds.set(binding, computeLibId(binding, ns));
|
|
@@ -762,6 +761,18 @@ export class CadRuntime {
|
|
|
762
761
|
output: shape,
|
|
763
762
|
});
|
|
764
763
|
}
|
|
764
|
+
else if (isCompoundLike(v)) {
|
|
765
|
+
// P2(2026-10-06-step-3mf-multipart-import-plan.md §7):多零件 load 的
|
|
766
|
+
// 输出是 compound(无 positions/indices)——必须整体缓存,否则宿主经
|
|
767
|
+
// `getCachedOutput` 指令取不到多零件几何(探针实测:返回 undefined →
|
|
768
|
+
// "load produced no geometry")。content key 退化为占位(compound 无
|
|
769
|
+
// 单一网格可哈希)。
|
|
770
|
+
this.statementCache.set(name, {
|
|
771
|
+
statementKey: `direct:${String(name)}`,
|
|
772
|
+
outputContentKey: `direct:compound:${String(name)}`,
|
|
773
|
+
output: v,
|
|
774
|
+
});
|
|
775
|
+
}
|
|
765
776
|
}
|
|
766
777
|
// T3-cond:DAG 叶子终端判定换 computeLiveShapes(§4.4)——输入换源:
|
|
767
778
|
// 候选 = ctx 键;行内 keep 查 metadata.keep 表;函数体 exec.keep 登记读
|
|
@@ -801,6 +812,18 @@ export class CadRuntime {
|
|
|
801
812
|
const buildFor = (partName) => {
|
|
802
813
|
if (topology.has(partName))
|
|
803
814
|
return;
|
|
815
|
+
const v = de.getCtxVar(String(partName));
|
|
816
|
+
// 多零件 load(compound):成员各带 BREP solid(fromBrep(shape,{solid}),
|
|
817
|
+
// 装配变换经 brepOf(child) 读回),但 compound 终端无单一 solidCache 键
|
|
818
|
+
// ——buildBrepTopology 必 miss。按成员合并构建 occurrence-aware 拓扑,
|
|
819
|
+
// 否则多 solid STEP 导入后该终端无拓扑 → 宿主面拾取/装配 overlay 缺失
|
|
820
|
+
// (assembly-dropdown 多文件回归)。
|
|
821
|
+
if (isCompoundLike(v)) {
|
|
822
|
+
const rt = this.buildCompoundBrepTopology(v);
|
|
823
|
+
if (rt)
|
|
824
|
+
topology.set(partName, { partName, source: 'brep', data: runtimeToData(rt) });
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
804
827
|
const rt = this.buildBrepTopology(partName);
|
|
805
828
|
if (rt)
|
|
806
829
|
topology.set(partName, { partName, source: 'brep', data: runtimeToData(rt) });
|
|
@@ -808,7 +831,7 @@ export class CadRuntime {
|
|
|
808
831
|
if (topoMode === 'brep') {
|
|
809
832
|
for (const name of shapeVarNames) {
|
|
810
833
|
const v = de.getCtxVar(String(name));
|
|
811
|
-
if (isShapeLike(v))
|
|
834
|
+
if (isShapeLike(v) || isCompoundLike(v))
|
|
812
835
|
buildFor(name);
|
|
813
836
|
}
|
|
814
837
|
}
|
|
@@ -842,6 +865,7 @@ export class CadRuntime {
|
|
|
842
865
|
kinematics: de.kinematicsSnapshot.size > 0 ? de.kinematicsSnapshot : undefined,
|
|
843
866
|
detectedUnits: de.detectedUnitsSnapshot.size > 0 ? de.detectedUnitsSnapshot : undefined,
|
|
844
867
|
multiPartCounts: de.multiPartCountSnapshot.size > 0 ? de.multiPartCountSnapshot : undefined,
|
|
868
|
+
importModels: de.importModelsSnapshot.size > 0 ? de.importModelsSnapshot : undefined,
|
|
845
869
|
changed: deChanged ? deChanged.map(asPartName) : undefined,
|
|
846
870
|
activeValues: activeValues.size > 0 ? activeValues : undefined,
|
|
847
871
|
};
|
|
@@ -1210,6 +1234,21 @@ export class CadRuntime {
|
|
|
1210
1234
|
const result = buildSolidTopologyRuntime(brepChain.kernel, solid);
|
|
1211
1235
|
return result.runtime;
|
|
1212
1236
|
}
|
|
1237
|
+
/**
|
|
1238
|
+
* 多零件 compound 终端的合并 BREP 拓扑(见 buildCompoundTopologyRuntime)。
|
|
1239
|
+
*
|
|
1240
|
+
* 读 compound 的**当前** children(装配变换已把新 solid 写回 child 槽位,
|
|
1241
|
+
* brepOf(child) 返回最新句柄——比 buildBrepTopology 读持久 solidCache 更不
|
|
1242
|
+
* 会陈旧),按声明序合并为单个 occurrence-aware runtime。
|
|
1243
|
+
*/
|
|
1244
|
+
buildCompoundBrepTopology(v) {
|
|
1245
|
+
if (!this.brepChain?.kernel)
|
|
1246
|
+
return null;
|
|
1247
|
+
const children = (v.children ?? []);
|
|
1248
|
+
if (children.length === 0)
|
|
1249
|
+
return null;
|
|
1250
|
+
return buildCompoundTopologyRuntime(this.brepChain.kernel, children) ?? null;
|
|
1251
|
+
}
|
|
1213
1252
|
// ── 公开:dryRun 校验 ──
|
|
1214
1253
|
/**
|
|
1215
1254
|
* dryRun:acorn 语法门禁 + 元数据提取(T5 后唯一路径)。
|