@faicad/faijs 0.29.5 → 0.31.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +6 -5
- package/dist/api/align/index.d.ts +64 -0
- package/dist/api/align/index.d.ts.map +1 -0
- package/dist/api/align/index.js +101 -0
- package/dist/api/align/index.js.map +1 -0
- package/dist/api/api-namespace.d.ts +6 -5
- package/dist/api/api-namespace.d.ts.map +1 -1
- package/dist/api/api-namespace.js +89 -5
- 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-op/index.d.ts +65 -0
- package/dist/api/boolean-op/index.d.ts.map +1 -0
- package/dist/api/boolean-op/index.js +113 -0
- package/dist/api/boolean-op/index.js.map +1 -0
- package/dist/api/boolean.d.ts.map +1 -1
- package/dist/api/boolean.js +22 -33
- 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 +91 -0
- package/dist/api/brep-operations/healingFns.d.ts.map +1 -0
- package/dist/api/brep-operations/healingFns.js +321 -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 +111 -0
- package/dist/api/brep-operations/topologyFns.d.ts.map +1 -0
- package/dist/api/brep-operations/topologyFns.js +300 -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/chamfer.d.ts +5 -4
- package/dist/api/chamfer.d.ts.map +1 -1
- package/dist/api/chamfer.js +12 -11
- package/dist/api/chamfer.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 +493 -0
- package/dist/api/curve-sketch/index.js.map +1 -0
- package/dist/api/draft.d.ts.map +1 -1
- package/dist/api/draft.js +1 -3
- package/dist/api/draft.js.map +1 -1
- package/dist/api/engrave.d.ts.map +1 -1
- package/dist/api/engrave.js +6 -15
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-3mf.d.ts +73 -0
- package/dist/api/export-3mf.d.ts.map +1 -0
- package/dist/api/export-3mf.js +121 -0
- package/dist/api/export-3mf.js.map +1 -0
- package/dist/api/export-brep.d.ts +47 -0
- package/dist/api/export-brep.d.ts.map +1 -0
- package/dist/api/export-brep.js +67 -0
- package/dist/api/export-brep.js.map +1 -0
- package/dist/api/export-step.d.ts +67 -0
- package/dist/api/export-step.d.ts.map +1 -0
- package/dist/api/export-step.js +98 -0
- package/dist/api/export-step.js.map +1 -0
- package/dist/api/export-stl.d.ts +58 -0
- package/dist/api/export-stl.d.ts.map +1 -0
- package/dist/api/export-stl.js +114 -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/feature-repair.d.ts +1 -1
- package/dist/api/feature-repair.d.ts.map +1 -1
- package/dist/api/feature-repair.js +1 -7
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.d.ts +2 -2
- package/dist/api/fillet-variable.d.ts.map +1 -1
- package/dist/api/fillet-variable.js +2 -3
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.d.ts +5 -7
- package/dist/api/fillet.d.ts.map +1 -1
- package/dist/api/fillet.js +5 -8
- 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 +58 -54
- 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/script-face-manifest.d.ts +1 -1
- package/dist/api/generated/script-face-manifest.js +3 -3
- package/dist/api/generated/script-face-manifest.js.map +1 -1
- package/dist/api/generated/script-face.d.ts +1 -1
- package/dist/api/generated/script-face.js +1 -1
- package/dist/api/generated/script-face.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 +8 -4
- 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 +77 -73
- 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 +11 -2
- package/dist/api/helix.d.ts.map +1 -1
- package/dist/api/helix.js +20 -4
- package/dist/api/helix.js.map +1 -1
- package/dist/api/index.d.ts +19 -7
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +44 -11
- package/dist/api/index.js.map +1 -1
- package/dist/api/internal/compat-op.d.ts +10 -36
- package/dist/api/internal/compat-op.d.ts.map +1 -1
- package/dist/api/internal/compat-op.js +17 -51
- 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/export-members.d.ts +80 -0
- package/dist/api/internal/export-members.d.ts.map +1 -0
- package/dist/api/internal/export-members.js +104 -0
- package/dist/api/internal/export-members.js.map +1 -0
- package/dist/api/internal/l3-bridge.d.ts +22 -37
- package/dist/api/internal/l3-bridge.d.ts.map +1 -1
- package/dist/api/internal/l3-bridge.js +30 -77
- 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/measure-query/index.d.ts +262 -0
- package/dist/api/measure-query/index.d.ts.map +1 -0
- package/dist/api/measure-query/index.js +390 -0
- package/dist/api/measure-query/index.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/api/pattern.js +3 -6
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/primitives.d.ts +6 -6
- package/dist/api/primitives.d.ts.map +1 -1
- package/dist/api/primitives.js +19 -17
- package/dist/api/primitives.js.map +1 -1
- package/dist/api/profile.d.ts.map +1 -1
- package/dist/api/profile.js +0 -1
- package/dist/api/profile.js.map +1 -1
- package/dist/api/punch-hole.d.ts.map +1 -1
- package/dist/api/punch-hole.js +0 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.d.ts +6 -8
- package/dist/api/replicate.d.ts.map +1 -1
- package/dist/api/replicate.js +27 -65
- 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/section-by-plane.d.ts.map +1 -1
- package/dist/api/section-by-plane.js +0 -1
- package/dist/api/section-by-plane.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.d.ts.map +1 -1
- package/dist/api/shell.js +12 -3
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.d.ts +3 -3
- package/dist/api/sketch-on-face.d.ts.map +1 -1
- package/dist/api/sketch-on-face.js +6 -4
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/sketch-on-plane.d.ts.map +1 -1
- package/dist/api/sketch-on-plane.js +0 -1
- package/dist/api/sketch-on-plane.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/split-by-plane.d.ts.map +1 -1
- package/dist/api/split-by-plane.js +0 -1
- package/dist/api/split-by-plane.js.map +1 -1
- package/dist/api/split.d.ts +1 -1
- package/dist/api/split.js +1 -1
- package/dist/api/split.js.map +1 -1
- package/dist/api/surface/arg-spec.d.ts +37 -44
- package/dist/api/surface/arg-spec.d.ts.map +1 -1
- package/dist/api/surface/arg-spec.js +224 -233
- 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 +71 -9
- package/dist/api/sweep.d.ts.map +1 -1
- package/dist/api/sweep.js +13 -6
- package/dist/api/sweep.js.map +1 -1
- package/dist/api/thicken.d.ts +1 -1
- package/dist/api/thicken.d.ts.map +1 -1
- package/dist/api/thicken.js +12 -3
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/transform.d.ts +8 -8
- package/dist/api/transform.d.ts.map +1 -1
- package/dist/api/transform.js +58 -27
- 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/boolean/index.d.ts +23 -0
- package/dist/boolean/index.d.ts.map +1 -0
- package/dist/boolean/index.js +27 -0
- package/dist/boolean/index.js.map +1 -0
- package/dist/brep/brep-chain.d.ts +1 -19
- package/dist/brep/brep-chain.d.ts.map +1 -1
- package/dist/brep/brep-chain.js +0 -1
- package/dist/brep/brep-chain.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +93 -2
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +185 -15
- 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/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +0 -3
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/adapters/brepkit.d.ts +4 -3
- package/dist/brep/engine/adapters/brepkit.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brepkit.js +4 -98
- package/dist/brep/engine/adapters/brepkit.js.map +1 -1
- package/dist/brep/engine/adapters/occt.d.ts +1 -1
- package/dist/brep/engine/adapters/occt.d.ts.map +1 -1
- package/dist/brep/engine/adapters/occt.js +4 -148
- package/dist/brep/engine/adapters/occt.js.map +1 -1
- package/dist/brep/engine/native-history.d.ts +27 -0
- package/dist/brep/engine/native-history.d.ts.map +1 -0
- package/dist/brep/engine/native-history.js +54 -0
- package/dist/brep/engine/native-history.js.map +1 -0
- 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 +3 -5
- package/dist/brep/engine/registry.d.ts.map +1 -1
- package/dist/brep/engine/registry.js +2 -2
- package/dist/brep/engine/registry.js.map +1 -1
- package/dist/brep/engine/types.d.ts +35 -77
- package/dist/brep/engine/types.d.ts.map +1 -1
- package/dist/brep/engine/types.js.map +1 -1
- package/dist/brep/export/export-model.d.ts +21 -0
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +171 -73
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step.d.ts +17 -1
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +133 -0
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/export/stl.d.ts +22 -1
- package/dist/brep/export/stl.d.ts.map +1 -1
- package/dist/brep/export/stl.js +58 -10
- package/dist/brep/export/stl.js.map +1 -1
- package/dist/brep/export/transform12.d.ts +47 -0
- package/dist/brep/export/transform12.d.ts.map +1 -0
- package/dist/brep/export/transform12.js +87 -0
- package/dist/brep/export/transform12.js.map +1 -0
- package/dist/brep/face-evolution.d.ts +53 -0
- package/dist/brep/face-evolution.d.ts.map +1 -1
- package/dist/brep/face-evolution.js +65 -0
- package/dist/brep/face-evolution.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-host/index.d.ts +4 -1
- package/dist/browser-host/index.d.ts.map +1 -1
- package/dist/browser-host/index.js +7 -1
- package/dist/browser-host/index.js.map +1 -1
- package/dist/browser.d.ts +5 -9
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +5 -26
- 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.d.ts +13 -58
- package/dist/cad-runtime/backend-dispatch.d.ts.map +1 -1
- package/dist/cad-runtime/backend-dispatch.js +34 -83
- package/dist/cad-runtime/backend-dispatch.js.map +1 -1
- package/dist/cad-runtime/content-key.d.ts +3 -3
- package/dist/cad-runtime/content-key.js +3 -3
- package/dist/cad-runtime/content-key.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 +31 -3
- package/dist/cad-runtime/ports.d.ts.map +1 -1
- package/dist/cad-runtime/ports.js.map +1 -1
- package/dist/cad-runtime/runtime.d.ts +54 -19
- package/dist/cad-runtime/runtime.d.ts.map +1 -1
- package/dist/cad-runtime/runtime.js +89 -54
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/define-op.d.ts +10 -14
- package/dist/define-op.d.ts.map +1 -1
- package/dist/define-op.js +5 -22
- package/dist/define-op.js.map +1 -1
- package/dist/env-agnostic.d.ts +2 -2
- package/dist/env-agnostic.d.ts.map +1 -1
- package/dist/env-agnostic.js +1 -1
- package/dist/env-agnostic.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 +14 -65
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -70
- 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 +53 -0
- package/dist/lang/symbol-table.generated.d.ts.map +1 -1
- package/dist/lang/symbol-table.generated.js +53 -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 -63
- package/dist/mesh/index.d.ts.map +1 -1
- package/dist/mesh/index.js +19 -72
- package/dist/mesh/index.js.map +1 -1
- package/dist/mesh/io.d.ts +62 -17
- package/dist/mesh/io.d.ts.map +1 -1
- package/dist/mesh/io.js +210 -41
- 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 +52 -5
- package/dist/mesh/threemf-loader.d.ts.map +1 -1
- package/dist/mesh/threemf-loader.js +139 -41
- 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 +35 -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 +56 -0
- package/dist/node-host/execute-script.d.ts.map +1 -0
- package/dist/node-host/execute-script.js +47 -0
- package/dist/node-host/execute-script.js.map +1 -0
- package/dist/node-host/index.d.ts +1 -0
- package/dist/node-host/index.d.ts.map +1 -1
- package/dist/node-host/index.js +4 -0
- package/dist/node-host/index.js.map +1 -1
- 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/primitives/index.d.ts +19 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +21 -0
- package/dist/primitives/index.js.map +1 -0
- 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 +79 -29
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +84 -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/sdf/index.d.ts +12 -0
- package/dist/sdf/index.d.ts.map +1 -0
- package/dist/sdf/index.js +13 -0
- package/dist/sdf/index.js.map +1 -0
- package/dist/sdk.d.ts +0 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js.map +1 -1
- 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 +3 -3
- package/dist/weapp.d.ts.map +1 -1
- package/dist/weapp.js +2 -2
- package/dist/weapp.js.map +1 -1
- package/package.json +283 -44
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。
|
|
15
15
|
*/
|
|
16
16
|
import { getBackends, getCurrentStmt, BrepUnsupportedError, MeshUnsupportedError } from '../runtime-state.js';
|
|
17
|
-
import { hasBrep, hasMeshFace, hasMeshSolid } from '../shape.js';
|
|
17
|
+
import { hasBrep, hasMeshFace, hasMeshSolid, isCompoundLike } from '../shape.js';
|
|
18
18
|
/**
|
|
19
19
|
* Shape 身份槽互斥校验(方案 2026-10-01 §3.2):一个 Shape 只能携带**一种**链身份
|
|
20
20
|
* ——BREP 精度链句柄 / 网格实体句柄 / 网格链面句柄,三者取一。
|
|
@@ -45,45 +45,6 @@ export function assertShapeSlotExclusive(inputs) {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
/**
|
|
49
|
-
* 引擎能力声明 → 受支持能力名集合(族级布尔位 + `evolution` 名单展开成逐个核函数名)。
|
|
50
|
-
* @param caps - 当前引擎的能力声明(缺省 = 空集,即什么都不支持)。
|
|
51
|
-
* @returns 该引擎声明支持的 `BrepCapabilityName` 集合。
|
|
52
|
-
*/
|
|
53
|
-
export function engineCapabilitySet(caps) {
|
|
54
|
-
const set = new Set();
|
|
55
|
-
if (!caps)
|
|
56
|
-
return set;
|
|
57
|
-
for (const kind of caps.evolution ?? [])
|
|
58
|
-
set.add(kind);
|
|
59
|
-
for (const method of caps.methods ?? [])
|
|
60
|
-
set.add(method);
|
|
61
|
-
if (caps.heal)
|
|
62
|
-
set.add('heal');
|
|
63
|
-
if (caps.directEdit)
|
|
64
|
-
set.add('directEdit');
|
|
65
|
-
if (caps.advSurface)
|
|
66
|
-
set.add('advSurface');
|
|
67
|
-
if (caps.assembly)
|
|
68
|
-
set.add('assembly');
|
|
69
|
-
if (caps.meshLift)
|
|
70
|
-
set.add('meshLift');
|
|
71
|
-
return set;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* 声明列表中第一个**当前引擎不具备**的能力名(全具备则 `undefined`)。
|
|
75
|
-
*
|
|
76
|
-
* 读的是运行时配置里的能力声明(与 `dispatchPath` 同一来源),因此调用点与分派点
|
|
77
|
-
* 对"缺哪个能力"的判断必然一致——不会出现"defineOp 认为缺 evolution、dispatch 认为具备"。
|
|
78
|
-
* @param declared - op 声明的能力名列表(来自 `DualOpMeta.capabilities`)。
|
|
79
|
-
* @returns 第一个缺失的能力名,或 undefined。
|
|
80
|
-
*/
|
|
81
|
-
export function firstMissingCapability(declared) {
|
|
82
|
-
if (!declared?.length)
|
|
83
|
-
return undefined;
|
|
84
|
-
const supported = engineCapabilitySet(getBackends().config.brepCapabilities);
|
|
85
|
-
return declared.find((cap) => !supported.has(cap));
|
|
86
|
-
}
|
|
87
48
|
/**
|
|
88
49
|
* `meshEngines` 缺省值(方案 2026-10-01 §3.4):内置 `mesh/`(manifold CSG)。
|
|
89
50
|
*
|
|
@@ -153,20 +114,17 @@ function currentMeshBackendId() {
|
|
|
153
114
|
* undefined, fixed at defineOp construction — static).
|
|
154
115
|
* - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)
|
|
155
116
|
* throws `MeshUnsupportedError`.
|
|
156
|
-
* - `mode='brep'` → missing brep / input off chain /
|
|
157
|
-
* `BrepUnsupportedError`.
|
|
117
|
+
* - `mode='brep'` → missing brep / input off chain / engine not whitelisted
|
|
118
|
+
* throws `BrepUnsupportedError`.
|
|
158
119
|
* - `mode='auto'` → brep when brep exists and all inputs are on the chain;
|
|
159
|
-
* otherwise mesh when mesh exists; brep-only with a broken input chain
|
|
160
|
-
*
|
|
120
|
+
* otherwise mesh when mesh exists; brep-only with a broken input chain
|
|
121
|
+
* throws `MeshUnsupportedError` — no mesh to fall back to.
|
|
161
122
|
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
* plus the engine's `evolution` list of `*WithHistory` kernel function names
|
|
168
|
-
* (Phase 0.2 — a family-level `evolution: true` would over-report, since a
|
|
169
|
-
* kernel may provide only a subset of the evolution family).
|
|
123
|
+
* Engine identity (`engines`, D11) is the **only** narrowing axis: a pure
|
|
124
|
+
* engine whitelist, checked before mode and chain. There is no capability
|
|
125
|
+
* declaration face — what a kernel can do is fixed in code at author time
|
|
126
|
+
* (the engine adapters and `brep/engine/native-history.ts`), not declared in
|
|
127
|
+
* op metadata and not looked up at dispatch.
|
|
170
128
|
*
|
|
171
129
|
* Red line unchanged: static dispatch, no runtime try-catch fallback. The
|
|
172
130
|
* decision happens before the implementation runs and is never revised after a
|
|
@@ -179,18 +137,16 @@ function currentMeshBackendId() {
|
|
|
179
137
|
* @param impls - the operation's implementation set: `mesh`/`brep` presence
|
|
180
138
|
* (function reference or undefined; fixed at defineOp construction), plus the
|
|
181
139
|
* op `name` (error messages).
|
|
182
|
-
* @param requiredCapability - an optional capability the operation declares;
|
|
183
|
-
* a missing capability routes the dispatch.
|
|
184
140
|
* @param engines - the operation's platform declaration (D11): `engines` from
|
|
185
141
|
* the defineOp meta. Undefined/empty = neutral op (all engines). A platform op
|
|
186
|
-
* whose engines do not include the current engine is rejected before the
|
|
187
|
-
*
|
|
142
|
+
* whose engines do not include the current engine is rejected before the mode
|
|
143
|
+
* and chain routing (D11-2: engine mismatch precedes everything else).
|
|
188
144
|
* @returns the selected backend path: 'brep' or 'mesh'.
|
|
189
145
|
*/
|
|
190
|
-
export function dispatchPath(inputs, impls,
|
|
191
|
-
//
|
|
146
|
+
export function dispatchPath(inputs, impls, engines) {
|
|
147
|
+
// 前置不变量:槽位互斥(缺陷即报错,先于任何模式/引擎判定)。
|
|
192
148
|
assertShapeSlotExclusive(inputs);
|
|
193
|
-
const path = decidePath(inputs, impls,
|
|
149
|
+
const path = decidePath(inputs, impls, engines);
|
|
194
150
|
// 网格实体输入的静态门禁(§3.4 规则 1/4):只在**已经**选定 mesh 路径后判定。
|
|
195
151
|
// 放在这里而不是最前面,是为了让 brep 模式下的网格实体仍拿到更贴切的
|
|
196
152
|
// E_BREP_UNSUPPORTED(规则 3)——网格零件没有精度链,那才是它的第一条事实。
|
|
@@ -199,19 +155,27 @@ export function dispatchPath(inputs, impls, requiredCapability, engines) {
|
|
|
199
155
|
return path;
|
|
200
156
|
}
|
|
201
157
|
/**
|
|
202
|
-
*
|
|
158
|
+
* P2(2026-10-06-step-3mf-multipart-import-plan.md §7):多零件 load 的输出是
|
|
159
|
+
* compound——输入「在 BREP 链上」判定对其展开:children 全部有 OCCT 句柄才
|
|
160
|
+
* 算链上(消费 op 按 partIndex 解包出的目标成员才是真正被操作的对象)。
|
|
161
|
+
* 空 children / 混合链按不在链上处理(静态判定,不运行时回退)。
|
|
162
|
+
*/
|
|
163
|
+
function allInputsOnBrepChain(inputs) {
|
|
164
|
+
return inputs.every((s) => (isCompoundLike(s) ? s.children.length > 0 && s.children.every(hasBrep) : hasBrep(s)));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* The path decision itself (mode → engine identity → chain).
|
|
203
168
|
*
|
|
204
169
|
* Split out of `dispatchPath` so the mesh-solid gate can run *after* the path is
|
|
205
|
-
* known, without duplicating the
|
|
170
|
+
* known, without duplicating the mesh-returning branches. Behaviour is
|
|
206
171
|
* unchanged: every throw here is a "path not available" refusal.
|
|
207
172
|
*
|
|
208
173
|
* @param inputs - the shapes feeding the operation.
|
|
209
174
|
* @param impls - the op's implementation set (presence + name + meshEngines).
|
|
210
|
-
* @param requiredCapability - the capability the op declares, if any.
|
|
211
175
|
* @param engines - the op's BREP platform declaration (D11), if any.
|
|
212
176
|
* @returns the selected backend path.
|
|
213
177
|
*/
|
|
214
|
-
function decidePath(inputs, impls,
|
|
178
|
+
function decidePath(inputs, impls, engines) {
|
|
215
179
|
const { config } = getBackends();
|
|
216
180
|
if (config.mode === 'mesh') {
|
|
217
181
|
// D11-6: mode='mesh' 分支仍在最前——平台 op 与中立 op 一视同仁(有 mesh 实现就走
|
|
@@ -222,12 +186,11 @@ function decidePath(inputs, impls, requiredCapability, engines) {
|
|
|
222
186
|
return 'mesh';
|
|
223
187
|
}
|
|
224
188
|
const currentStmt = getCurrentStmt();
|
|
225
|
-
// ── D11-2:
|
|
189
|
+
// ── D11-2: 平台身份判定,置于最前(引擎不匹配时没有别的可谈)──
|
|
226
190
|
//
|
|
227
191
|
// D11-3(mock 豁免,**有意为之**):brep_mock 是测试替身,不代表任何真实平台——
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
// 本豁免由 engine-switch-p5 测试钉住(mock 下平台 op 不拦截)。
|
|
192
|
+
// 它的职责是让编排链路(naming、Result 边界、多输出)能被测到;真实引擎下的身份
|
|
193
|
+
// 校验由 parity 测试与 engine-switch 测试覆盖。本豁免由 engine-switch-p5 测试钉住。
|
|
231
194
|
if (engines && engines.length > 0) {
|
|
232
195
|
const engineId = config.brepEngineId;
|
|
233
196
|
if (engineId !== 'brep_mock' && (engineId === null || engineId === undefined || !engines.some((e) => e === engineId))) {
|
|
@@ -238,36 +201,24 @@ function decidePath(inputs, impls, requiredCapability, engines) {
|
|
|
238
201
|
// D11-4: brep 模式不匹配 → BrepUnsupportedError(执行前,非运行时回退)。
|
|
239
202
|
throw new BrepUnsupportedError(message, currentStmt);
|
|
240
203
|
}
|
|
241
|
-
// D11-5: auto 模式 → 静态降级 mesh;无 mesh 实现 → MeshUnsupportedError
|
|
204
|
+
// D11-5: auto 模式 → 静态降级 mesh;无 mesh 实现 → MeshUnsupportedError。
|
|
242
205
|
if (!impls.mesh) {
|
|
243
206
|
throw new MeshUnsupportedError(`E_MESH_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current}) and has no mesh implementation`, currentStmt);
|
|
244
207
|
}
|
|
245
208
|
return 'mesh';
|
|
246
209
|
}
|
|
247
210
|
}
|
|
248
|
-
// 引擎能力声明 → 具体能力名集合(族级布尔位 + evolution 名单逐核函数展开)。
|
|
249
|
-
const supported = engineCapabilitySet(config.brepCapabilities);
|
|
250
211
|
if (config.mode === 'brep') {
|
|
251
212
|
if (!impls.brep) {
|
|
252
213
|
throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt);
|
|
253
214
|
}
|
|
254
|
-
if (!inputs
|
|
215
|
+
if (!allInputsOnBrepChain(inputs)) {
|
|
255
216
|
throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt);
|
|
256
217
|
}
|
|
257
|
-
// 能力路由:brep 模式缺能力 → 明确报错,不静默回退
|
|
258
|
-
if (requiredCapability && !supported.has(requiredCapability)) {
|
|
259
|
-
throw new BrepUnsupportedError(`E_BREP_UNSUPPORTED: current engine lacks capability '${requiredCapability}' (brepEngineId=${config.brepEngineId ?? '<none>'})`, currentStmt);
|
|
260
|
-
}
|
|
261
218
|
return 'brep';
|
|
262
219
|
}
|
|
263
|
-
// auto
|
|
264
|
-
if (
|
|
265
|
-
if (!impls.mesh) {
|
|
266
|
-
throw new MeshUnsupportedError(`E_MESH_UNSUPPORTED: current engine lacks capability '${requiredCapability}' and function has no mesh implementation`, currentStmt);
|
|
267
|
-
}
|
|
268
|
-
return 'mesh';
|
|
269
|
-
}
|
|
270
|
-
if (impls.brep && inputs.every(hasBrep))
|
|
220
|
+
// auto 模式:brep 实现 + 输入全在链上 → brep;否则 mesh。
|
|
221
|
+
if (impls.brep && allInputsOnBrepChain(inputs))
|
|
271
222
|
return 'brep';
|
|
272
223
|
if (!impls.mesh) {
|
|
273
224
|
throw new MeshUnsupportedError('E_MESH_UNSUPPORTED: input is not BREP and function has no mesh implementation', currentStmt);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-dispatch.js","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * backend-dispatch — BREP/mesh 路径静态判定(引擎侧)\n *\n *\n * 红线(AGENTS.md):BREP 链是否可用,由静态规则在执行前判定,\n * **禁止运行时 try-catch 回退**。BREP 路径抛异常 = 设计缺陷或 bug,必须直接报错暴露。\n *\n * 本文件从 src/api/internal/resolve-path.ts 迁移而来:判定是引擎的职责,\n * 不该由每个库函数各自调用。\n *\n * ⚠️ 分层例外:本文件位于 cad-runtime/ 但被 api/ import。\n * 这是安全的——它只依赖 runtime-state / api/shape / mesh/types,\n * 不依赖 cad-runtime 的任何其他模块,因此不构成循环。\n * P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。\n */\n\nimport { getBackends, getCurrentStmt, BrepUnsupportedError, MeshUnsupportedError } from '../runtime-state'\nimport { hasBrep, hasMeshFace, hasMeshSolid } from '../shape'\nimport type { BrepEngineId, BrepEvolutionKind, BrepMethodKind } from '../brep/engine/types'\nimport type { Shape } from '../mesh/types'\n\n/** 静态判定的两个可能结果:走 BREP 链或 mesh 链。 */\nexport type BrepPath = 'brep' | 'mesh'\n\n/**\n * Shape 身份槽互斥校验(方案 2026-10-01 §3.2):一个 Shape 只能携带**一种**链身份\n * ——BREP 精度链句柄 / 网格实体句柄 / 网格链面句柄,三者取一。\n *\n * 两人同时存在意味着\"这个零件既在精度链又在近似链上\"——后续无论按哪一侧分派\n * 都是错的(按 BREP 走 → 近似几何被当精确实体;按 mesh 走 → 精确句柄悬空)。\n * 这是设计缺陷而非可恢复状态,故在**分派之前**直接抛错,不给运行时\"选边站\"的\n * 机会(静态判定红线)。\n *\n * 三个写入点(`attachBrep` / `attachMeshSolid` / `attachMeshFace`)已经把互斥钉在\n * 写入侧;这里在分派前再兜一层,兜的是\"绕开构造器直接改 slot\"的路径。\n *\n * @param inputs - the shapes feeding the operation.\n * @throws {Error} `E_SHAPE_SLOT_EXCLUSIVE` when a shape carries more than one chain identity.\n */\nexport function assertShapeSlotExclusive(inputs: readonly Shape[]): void {\n for (const s of inputs) {\n const carriers: string[] = []\n if (hasBrep(s)) carriers.push('BREP')\n if (hasMeshSolid(s)) carriers.push('mesh solid')\n if (hasMeshFace(s)) carriers.push('mesh-chain face')\n if (carriers.length > 1) {\n throw new Error(\n `E_SHAPE_SLOT_EXCLUSIVE: input shape carries ${carriers.join(' and ')} handles — ` +\n 'a shape belongs to exactly one chain identity (precision, mesh solid, or mesh-chain face)',\n )\n }\n }\n}\n\n/**\n * 能力名:族级布尔位(`BrepCapabilities` 里类型为 boolean 的字段)**加上**逐核函数的\n * 面演化名(`BrepEvolutionKind`,`evolution` 名单里的条目)。\n *\n * ⚠️ `'evolution'` 已从本联合中**移除**(2026-09-22 Phase 0.2):它曾是\"面演化族\"的\n * 族级名,但族级声明会多报能力(内核可只提供部分 `*WithHistory`)→ 静态判定失效。\n * op 现在必须声明**具体**要哪个核函数(如 `['cut']`),引擎声明**具体**提供哪些\n * (`evolution: ['fuse','cut','fillet']`)。见 `brep/engine/types.ts` 的 `BrepEvolutionKind`。\n */\nexport type BrepCapabilityName =\n | 'heal'\n | 'directEdit'\n | 'advSurface'\n | 'assembly'\n | 'meshLift'\n | BrepEvolutionKind\n | BrepMethodKind\n\n/**\n * 引擎能力声明的宽松镜像(`runtime-state.Backends.config.brepCapabilities` 同构;\n * 该模块须零依赖,故不复用 `BrepCapabilities`)。\n */\nexport interface EngineCapabilitiesLike {\n /** 本引擎实际提供的 `*WithHistory` 核函数名。 */\n evolution?: readonly string[]\n /** 本引擎实际提供的非演化内核方法名(`BrepMethodKind`)。 */\n methods?: readonly string[]\n heal?: boolean\n directEdit?: boolean\n advSurface?: boolean\n assembly?: boolean\n meshLift?: boolean\n}\n\n/**\n * 引擎能力声明 → 受支持能力名集合(族级布尔位 + `evolution` 名单展开成逐个核函数名)。\n * @param caps - 当前引擎的能力声明(缺省 = 空集,即什么都不支持)。\n * @returns 该引擎声明支持的 `BrepCapabilityName` 集合。\n */\nexport function engineCapabilitySet(caps: EngineCapabilitiesLike | undefined): ReadonlySet<string> {\n const set = new Set<string>()\n if (!caps) return set\n for (const kind of caps.evolution ?? []) set.add(kind)\n for (const method of caps.methods ?? []) set.add(method)\n if (caps.heal) set.add('heal')\n if (caps.directEdit) set.add('directEdit')\n if (caps.advSurface) set.add('advSurface')\n if (caps.assembly) set.add('assembly')\n if (caps.meshLift) set.add('meshLift')\n return set\n}\n\n/**\n * 声明列表中第一个**当前引擎不具备**的能力名(全具备则 `undefined`)。\n *\n * 读的是运行时配置里的能力声明(与 `dispatchPath` 同一来源),因此调用点与分派点\n * 对\"缺哪个能力\"的判断必然一致——不会出现\"defineOp 认为缺 evolution、dispatch 认为具备\"。\n * @param declared - op 声明的能力名列表(来自 `DualOpMeta.capabilities`)。\n * @returns 第一个缺失的能力名,或 undefined。\n */\nexport function firstMissingCapability(\n declared: readonly BrepCapabilityName[] | undefined,\n): BrepCapabilityName | undefined {\n if (!declared?.length) return undefined\n const supported = engineCapabilitySet(getBackends().config.brepCapabilities)\n return declared.find((cap) => !supported.has(cap))\n}\n\n/**\n * `meshEngines` 缺省值(方案 2026-10-01 §3.4):内置 `mesh/`(manifold CSG)。\n *\n * 为什么缺省是\"只认识裸网格\"而不是\"全都能\":mesh 实现默认跑在 manifold 上,它拿不到\n * 网格实体句柄;给一个不声明 `meshEngines` 的 op 喂网格实体,唯一诚实的结局是**静态\n * 报错**,而不是在运行时挑一个能跑的后端(红线:无运行时回退)。\n */\nexport const DEFAULT_MESH_ENGINES: readonly string[] = ['manifold']\n\n/**\n * 网格链输入的静态门禁(方案 2026-10-01 §3.4 规则 1 / 规则 4)。\n *\n * \"网格链输入\"= 网格实体(`meshSolid`)或网格链面(`meshFace`)——两者都是近似链上的\n * 构造中几何,都要由**声明的**网格后端来读懂。\n *\n * 只在**已判定走 mesh 路径**时调用(brep 模式下网格实体的归宿是\n * `E_BREP_UNSUPPORTED`——网格零件按定义没有精度链,那条判定更贴切)。\n *\n * 两条不变量:\n * 1. **链不可混**:一次调用里要么全是网格链输入,要么都不是。网格链输入与 BREP 实体\n * (或裸网格)混在一起时,任一侧的结局都是隐式降级——走 manifold 会把网格实体的\n * 身份与近似拓扑静默丢掉,走网格后端则拿不到对侧实体的句柄。故直接报错。\n * 2. **后端必须声明接受**:当前装配的网格后端 id 必须出现在 op 的 `meshEngines` 里。\n *\n * @param inputs - the shapes feeding the operation.\n * @param impls - the op's implementation set (reads `meshEngines` / `name`).\n * @throws {Error} `E_MESH_SOLID_MIXED` when mesh-chain inputs are mixed with other geometry.\n * @throws {MeshUnsupportedError} `E_MESH_SOLID_UNSUPPORTED` when the mesh backend is not declared.\n */\nfunction assertMeshSolidInputs(\n inputs: readonly Shape[],\n impls: { meshEngines?: readonly string[]; name?: string },\n): void {\n let chainCount = 0\n for (const s of inputs) if (hasMeshSolid(s) || hasMeshFace(s)) chainCount++\n if (chainCount === 0) return\n\n const opLabel = impls.name ? ` '${impls.name}'` : ''\n if (chainCount !== inputs.length) {\n throw new Error(\n `E_MESH_SOLID_MIXED: op${opLabel} got both mesh-chain geometry and other geometry ` +\n `(${chainCount}/${inputs.length} inputs are mesh solids or mesh-chain faces) — mesh-chain geometry ` +\n 'cannot take part in an operation whose other inputs are outside its chain (the result would silently drop one side)',\n )\n }\n\n const declared = impls.meshEngines ?? DEFAULT_MESH_ENGINES\n const current = currentMeshBackendId()\n if (current !== null && declared.includes(current)) return\n throw new MeshUnsupportedError(\n `E_MESH_SOLID_UNSUPPORTED: op${opLabel} cannot accept mesh-chain input — current mesh backend ` +\n `is ${current ?? '<none>'} but the op declares [${declared.join(', ')}]`,\n getCurrentStmt(),\n )\n}\n\n/**\n * 当前装配的网格后端 id(未装配 → null)。\n *\n * 读的是**已装配的后端对象自身**(`Backends.kernel.meshSolid`)而不是注册表的另一份\n * 快照——装配事实只有一个来源,门禁不可能与装配结果漂移。类型在本模块只当结构读\n * (`{ id?: string }`),因为它对 runtime-state 是 `unknown`(零依赖红线)。\n *\n * @returns the assembled mesh backend id, or null when none is assembled.\n */\nfunction currentMeshBackendId(): string | null {\n const backend = getBackends().kernel.meshSolid as { id?: unknown } | undefined\n return backend && typeof backend.id === 'string' ? backend.id : null\n}\n\n/**\n * Decide whether this invocation takes the BREP or the mesh backend path.\n *\n * Bidirectional dispatch (defineOp contract, D1/D1b/D2):\n * - `impls` carries mesh/brep implementation presence (function reference or\n * undefined, fixed at defineOp construction — static).\n * - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)\n * throws `MeshUnsupportedError`.\n * - `mode='brep'` → missing brep / input off chain / missing capability throws\n * `BrepUnsupportedError`.\n * - `mode='auto'` → brep when brep exists and all inputs are on the chain;\n * otherwise mesh when mesh exists; brep-only with a broken input chain (or\n * missing capability) throws `MeshUnsupportedError` — no mesh to fall back to.\n *\n * Capability routing (requiredCapability): when the current engine (registry)\n * lacks a declared capability, brep mode throws a BrepUnsupportedError (an\n * explicit error, never a silent fallback) while auto mode statically degrades\n * to mesh (never fabricating a missing capability). The capability is matched\n * against the engine's declaration as a set of concrete names: family booleans\n * plus the engine's `evolution` list of `*WithHistory` kernel function names\n * (Phase 0.2 — a family-level `evolution: true` would over-report, since a\n * kernel may provide only a subset of the evolution family).\n *\n * Red line unchanged: static dispatch, no runtime try-catch fallback. The\n * decision happens before the implementation runs and is never revised after a\n * failed execution.\n *\n * Third-party library authors never call this directly — `defineOp` (SDK)\n * invokes it inside its wrapper; authors only declare the implementation set.\n * @param inputs - the shapes feeding the operation, used to test whether all\n * lie on the BREP chain.\n * @param impls - the operation's implementation set: `mesh`/`brep` presence\n * (function reference or undefined; fixed at defineOp construction), plus the\n * op `name` (error messages).\n * @param requiredCapability - an optional capability the operation declares;\n * a missing capability routes the dispatch.\n * @param engines - the operation's platform declaration (D11): `engines` from\n * the defineOp meta. Undefined/empty = neutral op (all engines). A platform op\n * whose engines do not include the current engine is rejected before the\n * capability/mode routing (D11-2: engine mismatch precedes capability checks).\n * @returns the selected backend path: 'brep' or 'mesh'.\n */\nexport function dispatchPath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown; name?: string; meshEngines?: readonly string[] },\n requiredCapability?: BrepCapabilityName,\n engines?: readonly BrepEngineId[],\n): BrepPath {\n // 前置不变量:槽位互斥(缺陷即报错,先于任何模式/能力判定)。\n assertShapeSlotExclusive(inputs)\n const path = decidePath(inputs, impls, requiredCapability, engines)\n // 网格实体输入的静态门禁(§3.4 规则 1/4):只在**已经**选定 mesh 路径后判定。\n // 放在这里而不是最前面,是为了让 brep 模式下的网格实体仍拿到更贴切的\n // E_BREP_UNSUPPORTED(规则 3)——网格零件没有精度链,那才是它的第一条事实。\n if (path === 'mesh') assertMeshSolidInputs(inputs, impls)\n return path\n}\n\n/**\n * The path decision itself (mode → engine identity → capability → chain).\n *\n * Split out of `dispatchPath` so the mesh-solid gate can run *after* the path is\n * known, without duplicating the four mesh-returning branches. Behaviour is\n * unchanged: every throw here is a \"path not available\" refusal.\n *\n * @param inputs - the shapes feeding the operation.\n * @param impls - the op's implementation set (presence + name + meshEngines).\n * @param requiredCapability - the capability the op declares, if any.\n * @param engines - the op's BREP platform declaration (D11), if any.\n * @returns the selected backend path.\n */\nfunction decidePath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown; name?: string; meshEngines?: readonly string[] },\n requiredCapability?: BrepCapabilityName,\n engines?: readonly BrepEngineId[],\n): BrepPath {\n const { config } = getBackends()\n\n if (config.mode === 'mesh') {\n // D11-6: mode='mesh' 分支仍在最前——平台 op 与中立 op 一视同仁(有 mesh 实现就走\n // mesh)。宿主强制 mesh 时不因平台身份报错。\n if (!impls.mesh) {\n throw new MeshUnsupportedError('E_MESH_UNSUPPORTED: function has no mesh implementation', getCurrentStmt())\n }\n return 'mesh'\n }\n const currentStmt = getCurrentStmt()\n\n // ── D11-2: 平台身份判定,置于最前(先于 mode/capabilities——引擎不匹配时谈能力没有意义)──\n //\n // D11-3(mock 豁免,**有意为之**):brep_mock 是测试替身,不代表任何真实平台——\n // 它的 capabilities 也是\"全给\",职责是让编排链路(naming、Result 边界、多输出)\n // 能被测到;真实引擎下的身份校验由 parity 测试与 engine-switch 测试覆盖。\n // 本豁免由 engine-switch-p5 测试钉住(mock 下平台 op 不拦截)。\n if (engines && engines.length > 0) {\n const engineId = config.brepEngineId\n if (engineId !== 'brep_mock' && (engineId === null || engineId === undefined || !engines.some((e) => e === engineId))) {\n const opLabel = impls.name ? ` '${impls.name}'` : ''\n const current = engineId ?? '<none>'\n const message = `E_BREP_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current})`\n if (config.mode === 'brep') {\n // D11-4: brep 模式不匹配 → BrepUnsupportedError(执行前,非运行时回退)。\n throw new BrepUnsupportedError(message, currentStmt)\n }\n // D11-5: auto 模式 → 静态降级 mesh;无 mesh 实现 → MeshUnsupportedError(与能力路由同构)。\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n `E_MESH_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current}) and has no mesh implementation`,\n currentStmt,\n )\n }\n return 'mesh'\n }\n }\n\n // 引擎能力声明 → 具体能力名集合(族级布尔位 + evolution 名单逐核函数展开)。\n const supported = engineCapabilitySet(config.brepCapabilities)\n\n if (config.mode === 'brep') {\n if (!impls.brep) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt)\n }\n if (!inputs.every(hasBrep)) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt)\n }\n // 能力路由:brep 模式缺能力 → 明确报错,不静默回退\n if (requiredCapability && !supported.has(requiredCapability)) {\n throw new BrepUnsupportedError(\n `E_BREP_UNSUPPORTED: current engine lacks capability '${requiredCapability}' (brepEngineId=${config.brepEngineId ?? '<none>'})`,\n currentStmt,\n )\n }\n return 'brep'\n }\n\n // auto 模式:能力路由(缺能力 → 静态降级走 mesh;brep-only 无 mesh 可降 → 明确报错)\n if (requiredCapability && !supported.has(requiredCapability)) {\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n `E_MESH_UNSUPPORTED: current engine lacks capability '${requiredCapability}' and function has no mesh implementation`,\n currentStmt,\n )\n }\n return 'mesh'\n }\n\n if (impls.brep && inputs.every(hasBrep)) return 'brep'\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n 'E_MESH_UNSUPPORTED: input is not BREP and function has no mesh implementation',\n currentStmt,\n )\n }\n return 'mesh'\n}\n"]}
|
|
1
|
+
{"version":3,"file":"backend-dispatch.js","sourceRoot":"","sources":["../../src/cad-runtime/backend-dispatch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * backend-dispatch — BREP/mesh 路径静态判定(引擎侧)\n *\n *\n * 红线(AGENTS.md):BREP 链是否可用,由静态规则在执行前判定,\n * **禁止运行时 try-catch 回退**。BREP 路径抛异常 = 设计缺陷或 bug,必须直接报错暴露。\n *\n * 本文件从 src/api/internal/resolve-path.ts 迁移而来:判定是引擎的职责,\n * 不该由每个库函数各自调用。\n *\n * ⚠️ 分层例外:本文件位于 cad-runtime/ 但被 api/ import。\n * 这是安全的——它只依赖 runtime-state / api/shape / mesh/types,\n * 不依赖 cad-runtime 的任何其他模块,因此不构成循环。\n * P4b(可选)把函数拆成 brep/mesh 双实现后,此依赖会自然消失。\n */\n\nimport { getBackends, getCurrentStmt, BrepUnsupportedError, MeshUnsupportedError } from '../runtime-state'\nimport { hasBrep, hasMeshFace, hasMeshSolid, isCompoundLike } from '../shape'\nimport type { BrepEngineId } from '../brep/engine/types'\nimport type { Shape } from '../mesh/types'\n\n/** 静态判定的两个可能结果:走 BREP 链或 mesh 链。 */\nexport type BrepPath = 'brep' | 'mesh'\n\n/**\n * Shape 身份槽互斥校验(方案 2026-10-01 §3.2):一个 Shape 只能携带**一种**链身份\n * ——BREP 精度链句柄 / 网格实体句柄 / 网格链面句柄,三者取一。\n *\n * 两人同时存在意味着\"这个零件既在精度链又在近似链上\"——后续无论按哪一侧分派\n * 都是错的(按 BREP 走 → 近似几何被当精确实体;按 mesh 走 → 精确句柄悬空)。\n * 这是设计缺陷而非可恢复状态,故在**分派之前**直接抛错,不给运行时\"选边站\"的\n * 机会(静态判定红线)。\n *\n * 三个写入点(`attachBrep` / `attachMeshSolid` / `attachMeshFace`)已经把互斥钉在\n * 写入侧;这里在分派前再兜一层,兜的是\"绕开构造器直接改 slot\"的路径。\n *\n * @param inputs - the shapes feeding the operation.\n * @throws {Error} `E_SHAPE_SLOT_EXCLUSIVE` when a shape carries more than one chain identity.\n */\nexport function assertShapeSlotExclusive(inputs: readonly Shape[]): void {\n for (const s of inputs) {\n const carriers: string[] = []\n if (hasBrep(s)) carriers.push('BREP')\n if (hasMeshSolid(s)) carriers.push('mesh solid')\n if (hasMeshFace(s)) carriers.push('mesh-chain face')\n if (carriers.length > 1) {\n throw new Error(\n `E_SHAPE_SLOT_EXCLUSIVE: input shape carries ${carriers.join(' and ')} handles — ` +\n 'a shape belongs to exactly one chain identity (precision, mesh solid, or mesh-chain face)',\n )\n }\n }\n}\n\n/**\n * `meshEngines` 缺省值(方案 2026-10-01 §3.4):内置 `mesh/`(manifold CSG)。\n *\n * 为什么缺省是\"只认识裸网格\"而不是\"全都能\":mesh 实现默认跑在 manifold 上,它拿不到\n * 网格实体句柄;给一个不声明 `meshEngines` 的 op 喂网格实体,唯一诚实的结局是**静态\n * 报错**,而不是在运行时挑一个能跑的后端(红线:无运行时回退)。\n */\nexport const DEFAULT_MESH_ENGINES: readonly string[] = ['manifold']\n\n/**\n * 网格链输入的静态门禁(方案 2026-10-01 §3.4 规则 1 / 规则 4)。\n *\n * \"网格链输入\"= 网格实体(`meshSolid`)或网格链面(`meshFace`)——两者都是近似链上的\n * 构造中几何,都要由**声明的**网格后端来读懂。\n *\n * 只在**已判定走 mesh 路径**时调用(brep 模式下网格实体的归宿是\n * `E_BREP_UNSUPPORTED`——网格零件按定义没有精度链,那条判定更贴切)。\n *\n * 两条不变量:\n * 1. **链不可混**:一次调用里要么全是网格链输入,要么都不是。网格链输入与 BREP 实体\n * (或裸网格)混在一起时,任一侧的结局都是隐式降级——走 manifold 会把网格实体的\n * 身份与近似拓扑静默丢掉,走网格后端则拿不到对侧实体的句柄。故直接报错。\n * 2. **后端必须声明接受**:当前装配的网格后端 id 必须出现在 op 的 `meshEngines` 里。\n *\n * @param inputs - the shapes feeding the operation.\n * @param impls - the op's implementation set (reads `meshEngines` / `name`).\n * @throws {Error} `E_MESH_SOLID_MIXED` when mesh-chain inputs are mixed with other geometry.\n * @throws {MeshUnsupportedError} `E_MESH_SOLID_UNSUPPORTED` when the mesh backend is not declared.\n */\nfunction assertMeshSolidInputs(\n inputs: readonly Shape[],\n impls: { meshEngines?: readonly string[]; name?: string },\n): void {\n let chainCount = 0\n for (const s of inputs) if (hasMeshSolid(s) || hasMeshFace(s)) chainCount++\n if (chainCount === 0) return\n\n const opLabel = impls.name ? ` '${impls.name}'` : ''\n if (chainCount !== inputs.length) {\n throw new Error(\n `E_MESH_SOLID_MIXED: op${opLabel} got both mesh-chain geometry and other geometry ` +\n `(${chainCount}/${inputs.length} inputs are mesh solids or mesh-chain faces) — mesh-chain geometry ` +\n 'cannot take part in an operation whose other inputs are outside its chain (the result would silently drop one side)',\n )\n }\n\n const declared = impls.meshEngines ?? DEFAULT_MESH_ENGINES\n const current = currentMeshBackendId()\n if (current !== null && declared.includes(current)) return\n throw new MeshUnsupportedError(\n `E_MESH_SOLID_UNSUPPORTED: op${opLabel} cannot accept mesh-chain input — current mesh backend ` +\n `is ${current ?? '<none>'} but the op declares [${declared.join(', ')}]`,\n getCurrentStmt(),\n )\n}\n\n/**\n * 当前装配的网格后端 id(未装配 → null)。\n *\n * 读的是**已装配的后端对象自身**(`Backends.kernel.meshSolid`)而不是注册表的另一份\n * 快照——装配事实只有一个来源,门禁不可能与装配结果漂移。类型在本模块只当结构读\n * (`{ id?: string }`),因为它对 runtime-state 是 `unknown`(零依赖红线)。\n *\n * @returns the assembled mesh backend id, or null when none is assembled.\n */\nfunction currentMeshBackendId(): string | null {\n const backend = getBackends().kernel.meshSolid as { id?: unknown } | undefined\n return backend && typeof backend.id === 'string' ? backend.id : null\n}\n\n/**\n * Decide whether this invocation takes the BREP or the mesh backend path.\n *\n * Bidirectional dispatch (defineOp contract, D1/D1b/D2):\n * - `impls` carries mesh/brep implementation presence (function reference or\n * undefined, fixed at defineOp construction — static).\n * - `mode='mesh'` → always mesh; missing mesh implementation (brep-only)\n * throws `MeshUnsupportedError`.\n * - `mode='brep'` → missing brep / input off chain / engine not whitelisted\n * throws `BrepUnsupportedError`.\n * - `mode='auto'` → brep when brep exists and all inputs are on the chain;\n * otherwise mesh when mesh exists; brep-only with a broken input chain\n * throws `MeshUnsupportedError` — no mesh to fall back to.\n *\n * Engine identity (`engines`, D11) is the **only** narrowing axis: a pure\n * engine whitelist, checked before mode and chain. There is no capability\n * declaration face — what a kernel can do is fixed in code at author time\n * (the engine adapters and `brep/engine/native-history.ts`), not declared in\n * op metadata and not looked up at dispatch.\n *\n * Red line unchanged: static dispatch, no runtime try-catch fallback. The\n * decision happens before the implementation runs and is never revised after a\n * failed execution.\n *\n * Third-party library authors never call this directly — `defineOp` (SDK)\n * invokes it inside its wrapper; authors only declare the implementation set.\n * @param inputs - the shapes feeding the operation, used to test whether all\n * lie on the BREP chain.\n * @param impls - the operation's implementation set: `mesh`/`brep` presence\n * (function reference or undefined; fixed at defineOp construction), plus the\n * op `name` (error messages).\n * @param engines - the operation's platform declaration (D11): `engines` from\n * the defineOp meta. Undefined/empty = neutral op (all engines). A platform op\n * whose engines do not include the current engine is rejected before the mode\n * and chain routing (D11-2: engine mismatch precedes everything else).\n * @returns the selected backend path: 'brep' or 'mesh'.\n */\nexport function dispatchPath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown; name?: string; meshEngines?: readonly string[] },\n engines?: readonly BrepEngineId[],\n): BrepPath {\n // 前置不变量:槽位互斥(缺陷即报错,先于任何模式/引擎判定)。\n assertShapeSlotExclusive(inputs)\n const path = decidePath(inputs, impls, engines)\n // 网格实体输入的静态门禁(§3.4 规则 1/4):只在**已经**选定 mesh 路径后判定。\n // 放在这里而不是最前面,是为了让 brep 模式下的网格实体仍拿到更贴切的\n // E_BREP_UNSUPPORTED(规则 3)——网格零件没有精度链,那才是它的第一条事实。\n if (path === 'mesh') assertMeshSolidInputs(inputs, impls)\n return path\n}\n\n/**\n * P2(2026-10-06-step-3mf-multipart-import-plan.md §7):多零件 load 的输出是\n * compound——输入「在 BREP 链上」判定对其展开:children 全部有 OCCT 句柄才\n * 算链上(消费 op 按 partIndex 解包出的目标成员才是真正被操作的对象)。\n * 空 children / 混合链按不在链上处理(静态判定,不运行时回退)。\n */\nfunction allInputsOnBrepChain(inputs: Shape[]): boolean {\n return inputs.every((s) => (isCompoundLike(s) ? s.children.length > 0 && s.children.every(hasBrep) : hasBrep(s)))\n}\n\n/**\n * The path decision itself (mode → engine identity → chain).\n *\n * Split out of `dispatchPath` so the mesh-solid gate can run *after* the path is\n * known, without duplicating the mesh-returning branches. Behaviour is\n * unchanged: every throw here is a \"path not available\" refusal.\n *\n * @param inputs - the shapes feeding the operation.\n * @param impls - the op's implementation set (presence + name + meshEngines).\n * @param engines - the op's BREP platform declaration (D11), if any.\n * @returns the selected backend path.\n */\nfunction decidePath(\n inputs: Shape[],\n impls: { mesh?: unknown; brep?: unknown; name?: string; meshEngines?: readonly string[] },\n engines?: readonly BrepEngineId[],\n): BrepPath {\n const { config } = getBackends()\n\n if (config.mode === 'mesh') {\n // D11-6: mode='mesh' 分支仍在最前——平台 op 与中立 op 一视同仁(有 mesh 实现就走\n // mesh)。宿主强制 mesh 时不因平台身份报错。\n if (!impls.mesh) {\n throw new MeshUnsupportedError('E_MESH_UNSUPPORTED: function has no mesh implementation', getCurrentStmt())\n }\n return 'mesh'\n }\n const currentStmt = getCurrentStmt()\n\n // ── D11-2: 平台身份判定,置于最前(引擎不匹配时没有别的可谈)──\n //\n // D11-3(mock 豁免,**有意为之**):brep_mock 是测试替身,不代表任何真实平台——\n // 它的职责是让编排链路(naming、Result 边界、多输出)能被测到;真实引擎下的身份\n // 校验由 parity 测试与 engine-switch 测试覆盖。本豁免由 engine-switch-p5 测试钉住。\n if (engines && engines.length > 0) {\n const engineId = config.brepEngineId\n if (engineId !== 'brep_mock' && (engineId === null || engineId === undefined || !engines.some((e) => e === engineId))) {\n const opLabel = impls.name ? ` '${impls.name}'` : ''\n const current = engineId ?? '<none>'\n const message = `E_BREP_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current})`\n if (config.mode === 'brep') {\n // D11-4: brep 模式不匹配 → BrepUnsupportedError(执行前,非运行时回退)。\n throw new BrepUnsupportedError(message, currentStmt)\n }\n // D11-5: auto 模式 → 静态降级 mesh;无 mesh 实现 → MeshUnsupportedError。\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n `E_MESH_UNSUPPORTED: op${opLabel} requires engine ${engines.join('/')} (current=${current}) and has no mesh implementation`,\n currentStmt,\n )\n }\n return 'mesh'\n }\n }\n\n if (config.mode === 'brep') {\n if (!impls.brep) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: function has no BREP implementation', currentStmt)\n }\n if (!allInputsOnBrepChain(inputs)) {\n throw new BrepUnsupportedError('E_BREP_UNSUPPORTED: input is not BREP', currentStmt)\n }\n return 'brep'\n }\n\n // auto 模式:brep 实现 + 输入全在链上 → brep;否则 mesh。\n if (impls.brep && allInputsOnBrepChain(inputs)) return 'brep'\n if (!impls.mesh) {\n throw new MeshUnsupportedError(\n 'E_MESH_UNSUPPORTED: input is not BREP and function has no mesh implementation',\n currentStmt,\n )\n }\n return 'mesh'\n}\n"]}
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
export declare function computeContentKey(positions: Float32Array, indices: Uint32Array): string;
|
|
14
14
|
/**
|
|
15
15
|
* Compute a deterministic fingerprint for an arbitrary value, used by the
|
|
16
|
-
* incremental update gates (G6/G7
|
|
17
|
-
*
|
|
16
|
+
* incremental update gates (G6/G7) to detect whether params or libIds have
|
|
17
|
+
* changed since the last successful execution.
|
|
18
18
|
*
|
|
19
19
|
* Design constraints:
|
|
20
20
|
* - `undefined` and `null` are normalized to `null` (so "no params" and
|
|
@@ -23,7 +23,7 @@ export declare function computeContentKey(positions: Float32Array, indices: Uint
|
|
|
23
23
|
* - Circular references are detected and represented stably (no infinite loop).
|
|
24
24
|
* - Functions and Symbols have a deterministic degradation rule (type-tagged).
|
|
25
25
|
* - Arrays preserve element order (position-sensitive).
|
|
26
|
-
* @param value - the value to fingerprint (params / libIds
|
|
26
|
+
* @param value - the value to fingerprint (params / libIds).
|
|
27
27
|
* @returns a hex string fingerprint.
|
|
28
28
|
*/
|
|
29
29
|
export declare function stableFingerprint(value: unknown): string;
|
|
@@ -30,8 +30,8 @@ export function computeContentKey(positions, indices) {
|
|
|
30
30
|
// ── stableFingerprint (P0-3) ──
|
|
31
31
|
/**
|
|
32
32
|
* Compute a deterministic fingerprint for an arbitrary value, used by the
|
|
33
|
-
* incremental update gates (G6/G7
|
|
34
|
-
*
|
|
33
|
+
* incremental update gates (G6/G7) to detect whether params or libIds have
|
|
34
|
+
* changed since the last successful execution.
|
|
35
35
|
*
|
|
36
36
|
* Design constraints:
|
|
37
37
|
* - `undefined` and `null` are normalized to `null` (so "no params" and
|
|
@@ -40,7 +40,7 @@ export function computeContentKey(positions, indices) {
|
|
|
40
40
|
* - Circular references are detected and represented stably (no infinite loop).
|
|
41
41
|
* - Functions and Symbols have a deterministic degradation rule (type-tagged).
|
|
42
42
|
* - Arrays preserve element order (position-sensitive).
|
|
43
|
-
* @param value - the value to fingerprint (params / libIds
|
|
43
|
+
* @param value - the value to fingerprint (params / libIds).
|
|
44
44
|
* @returns a hex string fingerprint.
|
|
45
45
|
*/
|
|
46
46
|
export function stableFingerprint(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-key.js","sourceRoot":"","sources":["../../src/cad-runtime/content-key.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * content-key — mesh 内容哈希(statementKey / plan 增量判定共用)\n *\n * 从 runtime.ts 提取为独立模块,供 CadRuntime 与 DirectExecutor 共享。\n */\n\n/** FNV-1a 哈希(typed array 逐元素) */\nfunction hashTypedArray(arr: Float32Array | Uint32Array): string {\n let hash = 0x811c9dc5\n const len = arr.length\n for (let i = 0; i < len; i++) {\n hash ^= arr[i]\n hash = Math.imul(hash, 0x01000193)\n }\n hash ^= len\n hash = Math.imul(hash, 0x01000193)\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n\n/**\n * Compute the mesh content key (hash of positions and indices) used to decide\n * incremental execution.\n * @param positions - the mesh vertex positions.\n * @param indices - the mesh triangle indices.\n * @returns the content key string.\n */\nexport function computeContentKey(positions: Float32Array, indices: Uint32Array): string {\n const posHash = hashTypedArray(positions)\n const idxHash = hashTypedArray(indices)\n return `${posHash}_${idxHash}_${positions.length}_${indices.length}`\n}\n\n// ── stableFingerprint (P0-3) ──\n\n/**\n * Compute a deterministic fingerprint for an arbitrary value, used by the\n * incremental update gates (G6/G7
|
|
1
|
+
{"version":3,"file":"content-key.js","sourceRoot":"","sources":["../../src/cad-runtime/content-key.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * content-key — mesh 内容哈希(statementKey / plan 增量判定共用)\n *\n * 从 runtime.ts 提取为独立模块,供 CadRuntime 与 DirectExecutor 共享。\n */\n\n/** FNV-1a 哈希(typed array 逐元素) */\nfunction hashTypedArray(arr: Float32Array | Uint32Array): string {\n let hash = 0x811c9dc5\n const len = arr.length\n for (let i = 0; i < len; i++) {\n hash ^= arr[i]\n hash = Math.imul(hash, 0x01000193)\n }\n hash ^= len\n hash = Math.imul(hash, 0x01000193)\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n\n/**\n * Compute the mesh content key (hash of positions and indices) used to decide\n * incremental execution.\n * @param positions - the mesh vertex positions.\n * @param indices - the mesh triangle indices.\n * @returns the content key string.\n */\nexport function computeContentKey(positions: Float32Array, indices: Uint32Array): string {\n const posHash = hashTypedArray(positions)\n const idxHash = hashTypedArray(indices)\n return `${posHash}_${idxHash}_${positions.length}_${indices.length}`\n}\n\n// ── stableFingerprint (P0-3) ──\n\n/**\n * Compute a deterministic fingerprint for an arbitrary value, used by the\n * incremental update gates (G6/G7) to detect whether params or libIds have\n * changed since the last successful execution.\n *\n * Design constraints:\n * - `undefined` and `null` are normalized to `null` (so \"no params\" and\n * \"empty object params\" are not treated as different).\n * - Object keys are sorted before hashing (iteration order independent).\n * - Circular references are detected and represented stably (no infinite loop).\n * - Functions and Symbols have a deterministic degradation rule (type-tagged).\n * - Arrays preserve element order (position-sensitive).\n * @param value - the value to fingerprint (params / libIds).\n * @returns a hex string fingerprint.\n */\nexport function stableFingerprint(value: unknown): string {\n const seen = new WeakSet<object>()\n let hash = 0x811c9dc5\n\n const mix = (s: string): void => {\n for (let i = 0; i < s.length; i++) {\n hash ^= s.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n }\n\n const visit = (v: unknown, depth: number): void => {\n if (depth > 50) { mix('!depth!'); return }\n\n // Normalize undefined/null to null\n if (v === undefined || v === null) { mix('null'); return }\n\n const t = typeof v\n\n if (t === 'boolean') { mix(v ? 'B1' : 'B0'); return }\n if (t === 'number') { mix('N:' + v); return }\n if (t === 'string') { mix('S:' + v); return }\n if (t === 'bigint') { mix('G:' + v.toString()); return }\n if (t === 'symbol') { mix('SYM:' + ((v as symbol).description ?? '')); return }\n if (t === 'function') { mix('FN'); return }\n\n // Object / array\n const obj = v as object\n if (seen.has(obj)) { mix('!cycle!'); return }\n seen.add(obj)\n\n if (Array.isArray(v)) {\n mix('A[' + v.length + ']')\n for (const el of v) visit(el, depth + 1)\n return\n }\n\n // Map: sort by key string for stable order\n if (v instanceof Map) {\n const entries = [...v.entries()].sort((a, b) =>\n String(a[0]) < String(b[0]) ? -1 : String(a[0]) > String(b[0]) ? 1 : 0,\n )\n mix('M[' + entries.length + ']')\n for (const [k, val] of entries) {\n mix('K:' + String(k) + ':')\n visit(val, depth + 1)\n }\n return\n }\n\n // Set: sort members for stable order\n if (v instanceof Set) {\n const members = [...v].sort((a, b) =>\n String(a) < String(b) ? -1 : String(a) > String(b) ? 1 : 0,\n )\n mix('SET[' + members.length + ']')\n for (const m of members) visit(m, depth + 1)\n return\n }\n\n // Plain object: sort keys\n const keys = Object.keys(obj).sort()\n mix('O{' + keys.length + '}')\n for (const k of keys) {\n mix('k:' + k + ':')\n visit((obj as Record<string, unknown>)[k], depth + 1)\n }\n }\n\n visit(value, 0)\n hash ^= 0xff\n hash = Math.imul(hash, 0x01000193)\n return (hash >>> 0).toString(16).padStart(8, '0')\n}\n"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* direct-executor — 无 IR 执行器(.fai.js 源码直通 JS VM)
|
|
3
3
|
*
|
|
4
|
-
* 方案:docs/plans/2026-09-06-no-ir-dual-channel-runtime.md §4.2(D1 / P2)
|
|
5
|
-
*
|
|
6
4
|
* 核心语义:源码文本按**执行单元**(顶层语句,行号即语句边界)直接交给 JS VM
|
|
7
5
|
* 执行——没有语句模型、没有 deps、没有表达式折叠、没有 outputs 投影、没有 IR
|
|
8
6
|
* 编译(不 import parser.ts / compile.ts)。共享 `ctx` 是唯一持久状态。
|
|
@@ -24,6 +22,7 @@
|
|
|
24
22
|
import type { LibNamespace } from '../runtime-state.js';
|
|
25
23
|
import type { PartName } from '../identity.js';
|
|
26
24
|
import { type AssemblyKinematicsPose } from '../runtime-state.js';
|
|
25
|
+
import type { ImportModel } from '../mesh/import-model.js';
|
|
27
26
|
import { type SecurityPolicy } from '../lang/security-scanner.js';
|
|
28
27
|
import type { BrepHandle } from '../brep/engine/types.js';
|
|
29
28
|
import type { ExecBackendChoice } from './exec-backend.js';
|
|
@@ -123,7 +122,7 @@ export interface DirectExecutorOptions {
|
|
|
123
122
|
security?: SecurityPolicy;
|
|
124
123
|
/**
|
|
125
124
|
* 执行后端(静态选定,无运行时回退;缺省 'vm')。'interpreter' 在禁 eval
|
|
126
|
-
* 环境(weapp / 严格 CSP
|
|
125
|
+
* 环境(weapp / 严格 CSP)使用。
|
|
127
126
|
*/
|
|
128
127
|
execBackend?: ExecBackendChoice;
|
|
129
128
|
}
|
|
@@ -160,6 +159,8 @@ export declare class DirectExecutor {
|
|
|
160
159
|
private meshSolidOut;
|
|
161
160
|
/** 近似拓扑数据(load op 登记,PartName → SelectorRuntimeData),collectDirectResult 消费。 */
|
|
162
161
|
private meshTopologyOut;
|
|
162
|
+
/** 导入模型结构(load op 登记,PartName → ImportModel,方案 2026-10-06 §5.5),collectDirectResult 消费。 */
|
|
163
|
+
private importModelsOut;
|
|
163
164
|
/** 执行后端(静态选定;缺省 vm) */
|
|
164
165
|
private readonly execBackend;
|
|
165
166
|
/** P3:读取装配运动副位姿快照(collectDirectResult 用;空 Map 表示无 joints)。 */
|
|
@@ -172,6 +173,8 @@ export declare class DirectExecutor {
|
|
|
172
173
|
get meshSolidSnapshot(): Map<PartName, unknown>;
|
|
173
174
|
/** 近似拓扑数据快照(load op 登记;PartName → SelectorRuntimeData)。 */
|
|
174
175
|
get meshTopologySnapshot(): Map<PartName, unknown>;
|
|
176
|
+
/** 导入模型结构快照(load op 登记;PartName → ImportModel)。 */
|
|
177
|
+
get importModelsSnapshot(): Map<PartName, ImportModel>;
|
|
175
178
|
constructor(options: DirectExecutorOptions);
|
|
176
179
|
/**
|
|
177
180
|
* 热更新命名空间集合(registerLib 后)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct-executor.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/direct-executor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"direct-executor.d.ts","sourceRoot":"","sources":["../../src/cad-runtime/direct-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* direct-executor — 无 IR 执行器(.fai.js 源码直通 JS VM)
|
|
3
3
|
*
|
|
4
|
-
* 方案:docs/plans/2026-09-06-no-ir-dual-channel-runtime.md §4.2(D1 / P2)
|
|
5
|
-
*
|
|
6
4
|
* 核心语义:源码文本按**执行单元**(顶层语句,行号即语句边界)直接交给 JS VM
|
|
7
5
|
* 执行——没有语句模型、没有 deps、没有表达式折叠、没有 outputs 投影、没有 IR
|
|
8
6
|
* 编译(不 import parser.ts / compile.ts)。共享 `ctx` 是唯一持久状态。
|
|
@@ -24,18 +22,17 @@
|
|
|
24
22
|
import { parse as acornParse } from 'acorn';
|
|
25
23
|
import { asPartName } from '../identity.js';
|
|
26
24
|
import { ParseError } from '../lang/parse-error.js';
|
|
27
|
-
import { setCurrentStmt, setKeepSink, setName, nameOf, takePendingAssemblyTransforms, takePendingAssemblyKinematics, takePendingDetectedUnits, takePendingMultiPartCounts, takePendingMeshSolids, takePendingMeshTopologies } from '../runtime-state.js';
|
|
25
|
+
import { setCurrentStmt, setKeepSink, setName, nameOf, takePendingAssemblyTransforms, takePendingAssemblyKinematics, takePendingDetectedUnits, takePendingMultiPartCounts, takePendingMeshSolids, takePendingMeshTopologies, takePendingImportModels } from '../runtime-state.js';
|
|
28
26
|
import { getBrepApi } from '../brep/handle-bridge.js';
|
|
29
27
|
import { runtimeLineage } from '../topology/naming/lineage.js';
|
|
30
28
|
import { ExecutionLimitError } from './execution-limit-error.js';
|
|
31
|
-
import { assertSecure } from '../lang/security-scanner.js';
|
|
29
|
+
import { assertSecure, isSafeGlobalIdent } from '../lang/security-scanner.js';
|
|
32
30
|
import { getSlot, ensureSlot, brepOf, isShape } from '../shape.js';
|
|
33
31
|
import { isMeshShape } from '../mesh/types.js';
|
|
34
32
|
import { applyTransform } from '../mesh/rigid-transform.js';
|
|
35
33
|
import { applyTransformBrep } from '../brep/brep-ops.js';
|
|
36
34
|
import { VmBackend } from './exec-backends/vm-backend.js';
|
|
37
35
|
import { InterpBackend } from './exec-backends/interp-backend.js';
|
|
38
|
-
import { SCRIPT_UNIT_NAMES } from '../units.js';
|
|
39
36
|
/**
|
|
40
37
|
* 几何值判定(isShape ∨ isMeshShape;与 define-op.isGeometryInput 同构)——
|
|
41
38
|
* 裸调用原地写回(§3.7 规则 2)的运行时守卫:只有「返回值是几何 且 目标原值也是
|
|
@@ -85,6 +82,8 @@ export class DirectExecutor {
|
|
|
85
82
|
meshSolidOut = new Map();
|
|
86
83
|
/** 近似拓扑数据(load op 登记,PartName → SelectorRuntimeData),collectDirectResult 消费。 */
|
|
87
84
|
meshTopologyOut = new Map();
|
|
85
|
+
/** 导入模型结构(load op 登记,PartName → ImportModel,方案 2026-10-06 §5.5),collectDirectResult 消费。 */
|
|
86
|
+
importModelsOut = new Map();
|
|
88
87
|
/** 执行后端(静态选定;缺省 vm) */
|
|
89
88
|
execBackend;
|
|
90
89
|
/** P3:读取装配运动副位姿快照(collectDirectResult 用;空 Map 表示无 joints)。 */
|
|
@@ -107,6 +106,10 @@ export class DirectExecutor {
|
|
|
107
106
|
get meshTopologySnapshot() {
|
|
108
107
|
return this.meshTopologyOut;
|
|
109
108
|
}
|
|
109
|
+
/** 导入模型结构快照(load op 登记;PartName → ImportModel)。 */
|
|
110
|
+
get importModelsSnapshot() {
|
|
111
|
+
return this.importModelsOut;
|
|
112
|
+
}
|
|
110
113
|
constructor(options) {
|
|
111
114
|
this.namespaces = options.namespaces;
|
|
112
115
|
this.setSolidHook = options.setSolid;
|
|
@@ -612,6 +615,10 @@ export class DirectExecutor {
|
|
|
612
615
|
for (const [part, data] of takePendingMeshTopologies()) {
|
|
613
616
|
this.meshTopologyOut.set(part, data);
|
|
614
617
|
}
|
|
618
|
+
// 导入模型结构(load op 登记,方案 2026-10-06 §5.5)按本语句收编。
|
|
619
|
+
for (const [part, model] of takePendingImportModels()) {
|
|
620
|
+
this.importModelsOut.set(part, model);
|
|
621
|
+
}
|
|
615
622
|
}
|
|
616
623
|
}
|
|
617
624
|
/** 行号 → 函数体 keep 登记(exec.keep/exec.keepHidden;与 live-shapes KeepView 对齐)。 */
|
|
@@ -1002,6 +1009,12 @@ export class DirectExecutor {
|
|
|
1002
1009
|
if (declared.has(callee.name) || this.hasCtxFn(callee.name)) {
|
|
1003
1010
|
head = `await __ctx.${callee.name}`;
|
|
1004
1011
|
}
|
|
1012
|
+
else if (isSafeGlobalIdent(callee.name)) {
|
|
1013
|
+
// 2026-10-06:免 import 安全全局**函数**(Number / parseInt / parseFloat /
|
|
1014
|
+
// isNaN / isFinite / String / Boolean / …)从 globalThis 解析,必须保持裸名调用。
|
|
1015
|
+
// 否则会发射成 `await __ctx.Number(...)` → 运行时 "`__ctx.Number` is not a function"。
|
|
1016
|
+
head = `await ${callee.name}`;
|
|
1017
|
+
}
|
|
1005
1018
|
else {
|
|
1006
1019
|
// 本机函数尚未在 declared(append 前缀场景由调用方校验)→ 仍按 ctx 函数调用
|
|
1007
1020
|
head = `await __ctx.${callee.name}`;
|
|
@@ -1100,9 +1113,13 @@ export class DirectExecutor {
|
|
|
1100
1113
|
case 'Literal':
|
|
1101
1114
|
return JSON.stringify(node.value);
|
|
1102
1115
|
case 'Identifier':
|
|
1103
|
-
// P6/D7
|
|
1104
|
-
//
|
|
1105
|
-
|
|
1116
|
+
// P6/D7 + 2026-10-06:免 import 安全全局(单位常量 MM / INCH / DEGREE / … 以及
|
|
1117
|
+
// Math / JSON / Number / Infinity / …)从 globalThis 解析,保持裸名发射;否则会被
|
|
1118
|
+
// 写成 `__ctx.Math`(undefined),求值结果静默变错。
|
|
1119
|
+
// 已声明变量优先提升为 __ctx.<name>,使同名遮蔽(如 `let Math = 5`)仍按用户变量解析。
|
|
1120
|
+
if (declared.has(node.name))
|
|
1121
|
+
return `__ctx.${node.name}`;
|
|
1122
|
+
if (isSafeGlobalIdent(node.name))
|
|
1106
1123
|
return node.name;
|
|
1107
1124
|
return `__ctx.${node.name}`;
|
|
1108
1125
|
case 'CallExpression':
|
|
@@ -1204,7 +1221,12 @@ export class DirectExecutor {
|
|
|
1204
1221
|
if (!n || typeof n !== 'object')
|
|
1205
1222
|
return;
|
|
1206
1223
|
if (n.type === 'Identifier') {
|
|
1207
|
-
|
|
1224
|
+
// 2026-10-06:免 import 安全全局(Math / JSON / console / Infinity / undefined /
|
|
1225
|
+
// NaN / parseInt / … 以及单位常量 MM / INCH / …)由 globalThis 提供,不是 ctx 变量。
|
|
1226
|
+
// 原先只硬编码排除了 undefined/NaN/Infinity,导致 `cad.box(Math.PI, 1, 1)` 与
|
|
1227
|
+
// `cad.box(console, 1, 1)`(以及单位常量 `cad.box(MM, 1, 1)`)在 append 前缀校验里
|
|
1228
|
+
// 被误报为「缺失引用」→ AppendPrefixError。这里统一走 isSafeGlobalIdent。
|
|
1229
|
+
if (!isSafeGlobalIdent(n.name))
|
|
1208
1230
|
refs.add(n.name);
|
|
1209
1231
|
return;
|
|
1210
1232
|
}
|