forgecad 0.9.13 → 0.9.15
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/LICENSE +6 -4
- package/README.md +8 -4
- package/dist/assets/{AdminPage-DramHHDf.js → AdminPage-CDyGUinA.js} +2 -2
- package/dist/assets/{BenchmarkPage-Bjgkh5m9.js → BenchmarkPage-DfPMY_-d.js} +4 -15
- package/dist/assets/{BlogPage-n_HGP3Qm.js → BlogPage-kF0fkdJT.js} +2 -2
- package/dist/assets/{DocsPage-WCIkPmzC.js → DocsPage-B954L3YN.js} +9 -3
- package/dist/assets/EditorApp-Beb-IZ0y.js +14014 -0
- package/dist/assets/{EditorApp-BAnckbsk.css → EditorApp-CuDLxKqL.css} +698 -0
- package/dist/assets/{EmbedViewer-DEZKqdfW.js → EmbedViewer-C77B-TrF.js} +3 -3
- package/dist/assets/{LandingPageProofDriven-CeRIctuj.js → LandingPageProofDriven-Cr6fXMDj.js} +35 -37
- package/dist/assets/LegalPage-BRlScr9A.css +91 -0
- package/dist/assets/LegalPage-Dzklqmmg.js +39 -0
- package/dist/assets/{PricingPage-BMedqFef.css → PricingPage-BPF6HKyO.css} +25 -0
- package/dist/assets/{PricingPage-rIRa8p4Y.js → PricingPage-zWXkvlwl.js} +19 -19
- package/dist/assets/{SettingsPage-BqCUvEXM.js → SettingsPage-Bz0of4KQ.js} +2 -2
- package/dist/assets/app-CE3sYcV7.css +3890 -0
- package/dist/assets/{app-BUZqJvSO.js → app-D3kDkggg.js} +2305 -960
- package/dist/assets/cli/{render-lhGxj50Y.js → render-DSY3mMQa.js} +423 -30
- package/dist/assets/{constructionHistoryWorker-ipD1jcIv.js → constructionHistoryWorker-gpDo-uH2.js} +927 -243
- package/dist/assets/{evalWorker-CHXSe_-u.js → evalWorker-CU0Ke6DP.js} +7799 -4163
- package/dist/assets/{forgecad_geometry-BVnIeXMG.js → forgecad_geometry-Dgceylq9.js} +43 -1
- package/dist/assets/{forgecad_geometry_bg-DufhhCBV.wasm → forgecad_geometry_bg-dD4RNQF1.wasm} +0 -0
- package/dist/assets/{inspectWorker-DeRnMVv1.js → inspectWorker-COyp8XXA.js} +927 -243
- package/dist/assets/{javascript-70-4uGcz.js → javascript-1kQXfVaz.js} +1 -1
- package/dist/assets/landing-proof-driven-DiGqdtWa.js +18 -0
- package/dist/assets/{landing-proof-driven-oFYW6mjz.css → landing-proof-driven-ORyigZ6p.css} +13 -7
- package/dist/assets/legalContent-ZfFGMmi4.js +251 -0
- package/dist/assets/{manifold-D1LZIHqn.js → manifold-BRI5prcH.js} +1 -1
- package/dist/assets/{manifold-C2fwoTgd.js → manifold-C-3h2M7p.js} +2 -2
- package/dist/assets/{manifold-BTkzxi9V.js → manifold-DNkrUWpA.js} +1 -1
- package/dist/assets/{reportWorker-Cq1qGmg0.js → reportWorker-CdBz5bNg.js} +7537 -10856
- package/dist/assets/{scalar-sampling-budget-D9Qv_UlJ.js → scalar-sampling-budget-wJF98aY9.js} +6943 -4345
- package/dist/assets/{scanProxyWorker-Bs2TDgLw.js → scanProxyWorker-B-9VbLIs.js} +32 -1
- package/dist/assets/{renderSceneState-Dr0xPq1A.js → targets-B9sGB5nB.js} +27 -1
- package/dist/assets/{vendor-react-Da3A2QmU.js → vendor-react-6j1Kke-Y.js} +6 -5
- package/dist/cli/render.html +1 -1
- package/dist/docs/index.html +2 -2
- package/dist/docs-raw/AI/ai-native-cad.md +50 -0
- package/dist/docs-raw/AI/usage.md +9 -17
- package/dist/docs-raw/CLI.md +71 -21
- package/dist/docs-raw/component-model.md +27 -11
- package/dist/docs-raw/generated/assembly.md +301 -212
- package/dist/docs-raw/generated/concepts.md +238 -240
- package/dist/docs-raw/generated/core.md +283 -6
- package/dist/docs-raw/generated/curves.md +274 -361
- package/dist/docs-raw/generated/lib.md +7 -1
- package/dist/docs-raw/generated/output.md +19 -4
- package/dist/docs-raw/generated/runtime-names.md +41 -0
- package/dist/docs-raw/generated/sdf.md +31 -0
- package/dist/docs-raw/generated/sheet-metal.md +9 -0
- package/dist/docs-raw/generated/sketch.md +44 -1
- package/dist/docs-raw/generated/viewport.md +14 -6
- package/dist/docs-raw/guides/coordinate-system.md +20 -16
- package/dist/docs-raw/guides/geometry-conventions.md +2 -2
- package/dist/docs-raw/guides/inspection-bundles.md +2 -1
- package/dist/docs-raw/guides/joint-design.md +24 -0
- package/dist/docs-raw/guides/positioning.md +13 -3
- package/dist/docs-raw/legal/privacy.md +63 -0
- package/dist/docs-raw/legal/software-license.md +55 -0
- package/dist/docs-raw/legal/terms.md +87 -0
- package/dist/docs-raw/skills/forgecad-3d-reconstruction.md +3 -3
- package/dist/docs-raw/skills/forgecad-blockout-model.md +1 -1
- package/dist/docs-raw/skills/forgecad-component-model.md +11 -2
- package/dist/docs-raw/skills/forgecad-high-level-spec.md +1 -1
- package/dist/docs-raw/skills/forgecad-image-replicator.md +8 -8
- package/dist/docs-raw/skills/forgecad-lld.md +1 -1
- package/dist/docs-raw/skills/forgecad-make-a-model.md +4 -4
- package/dist/docs-raw/skills/forgecad-model-grader.md +2 -2
- package/dist/docs-raw/skills/forgecad-prepare-prompt.md +2 -2
- package/dist/docs-raw/skills/forgecad-project.md +1 -1
- package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +4 -4
- package/dist/docs-raw/skills/forgecad-render-inspect.md +4 -2
- package/dist/docs-raw/skills/forgecad-visual-spec.md +1 -1
- package/dist/docs-raw/skills/forgecad.md +4 -3
- package/dist/index.html +40 -12
- package/dist/llms.txt +8 -0
- package/dist/site.webmanifest +1 -1
- package/dist/sitemap.xml +49 -13
- package/dist-cli/{check-compiler-LOXCPEOI.js → check-compiler-SDX5QIXI.js} +1 -2
- package/dist-cli/{check-query-propagation-BAKNVWXR.js → check-query-propagation-EAYEFT77.js} +1 -2
- package/dist-cli/{chunk-RY43WF46.js → chunk-N4O47JLF.js} +13772 -9938
- package/dist-cli/forgecad.js +2387 -899
- package/dist-cli/{forgecad_geometry-GYVNKPIE.js → forgecad_geometry-QOQIIP53.js} +42 -1
- package/dist-cli/forgecad_geometry_bg.wasm +0 -0
- package/dist-cli/{solver-46FFSK2U.js → solver-OK4HECRH.js} +0 -1
- package/dist-skill/CONTEXT.md +1120 -724
- package/dist-skill/SKILL.md +3 -2
- package/dist-skill/docs/API/core/concepts.md +64 -1
- package/dist-skill/docs/CLI.md +71 -21
- package/dist-skill/docs/generated/assembly.md +277 -229
- package/dist-skill/docs/generated/core.md +283 -6
- package/dist-skill/docs/generated/curves.md +272 -362
- package/dist-skill/docs/generated/lib.md +7 -1
- package/dist-skill/docs/generated/output.md +19 -4
- package/dist-skill/docs/generated/runtime-names.md +41 -0
- package/dist-skill/docs/generated/sdf.md +31 -0
- package/dist-skill/docs/generated/sheet-metal.md +9 -0
- package/dist-skill/docs/generated/sketch.md +44 -2
- package/dist-skill/docs/generated/viewport.md +5 -90
- package/dist-skill/docs/guides/coordinate-system.md +20 -16
- package/dist-skill/docs/guides/geometry-conventions.md +2 -2
- package/dist-skill/docs/guides/inspection-bundles.md +2 -1
- package/dist-skill/docs/guides/joint-design.md +24 -0
- package/dist-skill/docs/guides/positioning.md +13 -3
- package/dist-skill/library/forgecad-3d-reconstruction/SKILL.md +2 -2
- package/dist-skill/library/forgecad-component-model/SKILL.md +10 -1
- package/dist-skill/library/forgecad-image-replicator/SKILL.md +6 -6
- package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.py +166 -0
- package/dist-skill/library/forgecad-make-a-model/SKILL.md +3 -3
- package/dist-skill/library/forgecad-model-grader/SKILL.md +1 -1
- package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +1 -1
- package/dist-skill/library/forgecad-reconstruction-benchmark/SKILL.md +3 -3
- package/dist-skill/library/forgecad-render-inspect/SKILL.md +3 -1
- package/examples/api/assembly-kinematics-foundation.forge.js +65 -0
- package/examples/api/assembly-kinematics-four-bar.forge.js +115 -0
- package/examples/api/assembly-kinematics-limb.forge.js +116 -0
- package/examples/api/connector-frame-rig-chain.forge.js +102 -0
- package/examples/api/exact-sheet-shell-assembly.forge.js +0 -2
- package/examples/api/exact-surface-studio.forge.js +6 -8
- package/examples/api/helix-basics.forge.js +6 -6
- package/examples/api/lean-foundations/README.md +12 -0
- package/examples/api/lean-foundations/curve-blend-exact.forge.js +22 -0
- package/examples/api/lean-foundations/curve-fit-interpolation.forge.js +18 -0
- package/examples/api/lean-foundations/curve-helix-canonicalization.forge.js +27 -0
- package/examples/api/lean-foundations/curve-route-canonicalization.forge.js +16 -0
- package/examples/api/lean-foundations/curve-trim-reverse.forge.js +24 -0
- package/examples/api/lean-foundations/exact-curve-arc.forge.js +36 -0
- package/examples/api/mixed-edge-finishes-proof.forge.js +8 -11
- package/examples/api/route3d-elbow.forge.js +68 -0
- package/examples/api/transition-curves.forge.js +44 -15
- package/examples/api/y-blend-corner-showcase.forge.js +0 -2
- package/examples/generative/coral-vase.forge.js +1 -1
- package/examples/nurbs-tube.forge.js +1 -1
- package/package.json +14 -18
- package/dist/assets/EditorApp-CP9Za6tm.js +0 -13630
- package/dist/assets/app-CsHnaBWt.css +0 -1789
- package/dist/docs-raw/API/README.md +0 -16
- package/dist/docs-raw/API/core/concepts.md +0 -118
- package/dist/docs-raw/INDEX.md +0 -138
- package/dist/docs-raw/RELEASING.md +0 -87
- package/dist/docs-raw/agent-native-api.md +0 -27
- package/dist/docs-raw/beta-deployment.md +0 -304
- package/dist/docs-raw/beta-operations.md +0 -325
- package/dist/docs-raw/blueprint-first.md +0 -145
- package/dist/docs-raw/cli-monetization.md +0 -112
- package/dist/docs-raw/coding-best-practices.md +0 -120
- package/dist/docs-raw/coding.md +0 -340
- package/dist/docs-raw/deployment.md +0 -374
- package/dist/docs-raw/guides/skill-maintenance.md +0 -161
- package/dist/docs-raw/guides/surface-members.md +0 -82
- package/dist/docs-raw/internals/backend-vocabulary.md +0 -35
- package/dist/docs-raw/internals/compiler.md +0 -307
- package/dist/docs-raw/internals/constraint-solver-quality.md +0 -161
- package/dist/docs-raw/internals/constraint-solver.md +0 -176
- package/dist/docs-raw/internals/shape-from-slices.md +0 -152
- package/dist/docs-raw/internals/sketch-2d-pipeline.md +0 -108
- package/dist/docs-raw/platform/admin.md +0 -45
- package/dist/docs-raw/platform/architecture.md +0 -82
- package/dist/docs-raw/platform/auth.md +0 -139
- package/dist/docs-raw/platform/email.md +0 -67
- package/dist/docs-raw/platform/google-oauth-setup.md +0 -88
- package/dist/docs-raw/platform/observability.md +0 -197
- package/dist/docs-raw/platform/projects.md +0 -111
- package/dist/docs-raw/platform/sharing.md +0 -90
- package/dist/docs-raw/product/README.md +0 -39
- package/dist/docs-raw/product/api-as-product-language.md +0 -13
- package/dist/docs-raw/product/business-model.md +0 -15
- package/dist/docs-raw/product/competitive-positioning.md +0 -17
- package/dist/docs-raw/product/creative-manufacturing.md +0 -15
- package/dist/docs-raw/product/founder-story.md +0 -11
- package/dist/docs-raw/product/manufacturing-workflows.md +0 -15
- package/dist/docs-raw/product/onboarding-first-experience.md +0 -256
- package/dist/docs-raw/product/product-loop.md +0 -17
- package/dist/docs-raw/product/strategic-decisions.md +0 -22
- package/dist/docs-raw/product/user-outreach-email-templates.md +0 -161
- package/dist/docs-raw/product/user-segments.md +0 -15
- package/dist/docs-raw/product/vision.md +0 -26
- package/dist/docs-raw/rl-environments.md +0 -508
- package/dist/docs-raw/runbook.md +0 -611
- package/dist-cli/check-compiler-LOXCPEOI.js.map +0 -1
- package/dist-cli/check-query-propagation-BAKNVWXR.js.map +0 -1
- package/dist-cli/chunk-RY43WF46.js.map +0 -1
- package/dist-cli/forgecad.js.map +0 -1
- package/dist-cli/forgecad_geometry-GYVNKPIE.js.map +0 -1
- package/dist-cli/solver-46FFSK2U.js.map +0 -1
- package/dist-skill/SKILL-dev.md +0 -145
- package/dist-skill/docs-dev/API/core/concepts.md +0 -118
- package/dist-skill/docs-dev/CLI.md +0 -647
- package/dist-skill/docs-dev/agent-native-api.md +0 -27
- package/dist-skill/docs-dev/blueprint-first.md +0 -145
- package/dist-skill/docs-dev/coding-best-practices.md +0 -120
- package/dist-skill/docs-dev/coding.md +0 -340
- package/dist-skill/docs-dev/component-model.md +0 -164
- package/dist-skill/docs-dev/generated/assembly.md +0 -794
- package/dist-skill/docs-dev/generated/core.md +0 -2117
- package/dist-skill/docs-dev/generated/curves.md +0 -2583
- package/dist-skill/docs-dev/generated/lib.md +0 -169
- package/dist-skill/docs-dev/generated/output.md +0 -247
- package/dist-skill/docs-dev/generated/sdf.md +0 -446
- package/dist-skill/docs-dev/generated/sheet-metal.md +0 -504
- package/dist-skill/docs-dev/generated/sketch.md +0 -1811
- package/dist-skill/docs-dev/generated/viewport.md +0 -585
- package/dist-skill/docs-dev/generated/wood.md +0 -108
- package/dist-skill/docs-dev/guides/coordinate-system.md +0 -46
- package/dist-skill/docs-dev/guides/geometry-conventions.md +0 -52
- package/dist-skill/docs-dev/guides/inspection-bundles.md +0 -485
- package/dist-skill/docs-dev/guides/joint-design.md +0 -78
- package/dist-skill/docs-dev/guides/modeling-recipes.md +0 -78
- package/dist-skill/docs-dev/guides/positioning.md +0 -161
- package/dist-skill/docs-dev/guides/skill-maintenance.md +0 -161
- package/dist-skill/docs-dev/internals/backend-vocabulary.md +0 -35
- package/dist-skill/docs-dev/internals/compiler.md +0 -307
- package/dist-skill/docs-dev/internals/constraint-solver-quality.md +0 -161
- package/dist-skill/docs-dev/internals/constraint-solver.md +0 -176
- package/dist-skill/docs-dev/internals/sketch-2d-pipeline.md +0 -108
- package/dist-skill/library/forgecad-image-replicator/scripts/compare_images.mjs +0 -289
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/check-compiler.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Compiler invariants and snapshot check.\n *\n * This is a unit-style regression harness for the compiler surface. It records\n * the Forge compile plan, exact BREP lowering, and runtime/lowered Manifold\n * summaries for a curated set of cases so compiler regressions show up as\n * explicit snapshot diffs instead of silent geometry drift.\n */\nimport assert from 'node:assert/strict';\nimport { mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { init, setActiveBackend } from '../src/forge/headless';\nimport type { CompilerCaseSnapshot, CompilerInspectionInput } from './compiler-inspection';\nimport { inspectCompilerScene, loadCompilerInspectionInput } from './compiler-inspection';\nimport { COMPILER_REGRESSION_CORPUS } from './compiler-regression-corpus';\nimport { CHAMFER_EDGE_WORKFLOW_CODE, FILLET_EDGE_WORKFLOW_CODE } from './edge-finish-fixtures';\nimport { resolvePackagePath, runDirectCliMain } from './package-runtime';\n\ntype CompilerCaseDefinition = {\n id: string;\n description: string;\n input: CompilerInspectionInput;\n};\n\nconst SNAPSHOT_PATH = resolvePackagePath(import.meta.url, 'cli', 'snapshots', 'compiler-snapshots.json');\n\nconst HOLE_CUT_WORKFLOW_CODE = `\nconst base = roundedRect(90, 60, 8).extrude(24);\nconst topPocket = roundedRect(18, 10, 2)\n .onFace(base, 'top', { u: 14, v: -8, selfAnchor: 'center' });\nconst sideCut = roundedRect(16, 8, 2)\n .onFace(base, 'right', { u: -4, v: 0, selfAnchor: 'center' });\nconst body = base\n .hole('front', { diameter: 8, u: 0, v: 2 })\n .hole('top', { diameter: 6, u: -18, v: 10, depth: 10 })\n .cutout(topPocket, { depth: 6 })\n .cutout(sideCut);\nreturn [{ name: 'Workflow', shape: body }];\n`;\n\nconst CREATED_FACE_DOWNSTREAM_CODE = `\nconst shellBase = roundedRect(70, 42, 5).extrude(22);\nconst cup = shellBase.shell(2, { openFaces: ['top'] });\nconst shellPad = rect(6, 4)\n .onFace(cup, 'inner-side-right', { u: 0, v: 0, protrude: 0.05, selfAnchor: 'center' })\n .extrude(1.2)\n ;\n\nconst holeBase = roundedRect(62, 38, 4).extrude(18);\nconst drilled = holeBase.hole('top', { diameter: 7, u: 12, v: -6, depth: 8 });\nconst floorButton = circle2d(2.5)\n .onFace(drilled, 'floor', { u: 0, v: 0, protrude: 0.05, selfAnchor: 'center' })\n .extrude(1)\n ;\n\nconst cutBase = roundedRect(68, 40, 4).extrude(20);\nconst pocket = roundedRect(18, 10, 2)\n .onFace(cutBase, 'front', { u: 0, v: 2, selfAnchor: 'center' });\nconst cut = cutBase.cutout(pocket, { depth: 7 });\nconst wallTab = rect(4, 3)\n .onFace(cut, 'wall-right', { u: 0, v: 0, protrude: 0.05, selfAnchor: 'center' })\n .extrude(0.9)\n ;\n\nreturn [\n { name: 'Shell Inner Pad', shape: shellPad },\n { name: 'Hole Floor Button', shape: floorButton },\n { name: 'Cut Wall Tab', shape: wallTab },\n];\n`;\n\nfunction inlineCase(id: string, description: string, code: string): CompilerCaseDefinition {\n return {\n id,\n description,\n input: {\n displayPath: `inline:${id}`,\n code,\n fileName: 'main.forge.js',\n allFiles: { 'main.forge.js': code },\n },\n };\n}\n\nfunction fileCase(id: string, description: string, scriptPath: string): CompilerCaseDefinition {\n return {\n id,\n description,\n input: loadCompilerInspectionInput(scriptPath),\n };\n}\n\nlet _compilerCases: CompilerCaseDefinition[] | undefined;\nfunction getCompilerCases(): CompilerCaseDefinition[] {\n if (_compilerCases) return _compilerCases;\n _compilerCases = [\n inlineCase(\n 'exact-boolean-plate',\n 'Exact boolean plate with profile booleans and tapered extrude stays on the exact route.',\n `\nconst ring = difference2d(\n roundedRect(90, 60, 8),\n roundedRect(84, 54, 5),\n);\nconst leadIn = ring\n .scale([0.96, 0.93])\n .extrude(4, { scaleTop: [1 / 0.96, 1 / 0.93] })\n .translate(0, 0, -4);\nconst body = roundedRect(96, 66, 8).extrude(20).subtract(\n roundedRect(88, 58, 5).extrude(18).translate(0, 0, 2),\n);\nreturn [{ name: 'Plate', shape: union(body, leadIn) }];\n`,\n ),\n inlineCase(\n 'transform-heavy-solid',\n 'Exact primitives keep transform intent and runtime lowering aligned.',\n `\nconst pipe = cylinder(60, 5).pointAlong([0, 1, 0]);\nconst ellipsoid = sphere(6).scale([1.2, 0.8, 0.5]).translate(4, -2, 1);\nconst body = box(30, 30, 30)\n .subtract(pipe)\n .subtract(ellipsoid)\n .mirror([1, 0, 0])\n .rotateAroundAxis([0, 0, 1], 20, [0, 0, 0]);\nreturn [{ name: 'Body', shape: body }];\n`,\n ),\n inlineCase(\n 'split-solid-exact',\n 'Shape.split() keeps both branches inside compiler ownership when the cutter is compile-covered.',\n `\nconst stock = box(48, 24, 20);\nconst cutter = cylinder(28, 8, undefined, undefined)\n .translate(10, 0, 0)\n .rotateY(90);\nconst [inside, outside] = stock.split(cutter);\nreturn [\n { name: 'Inside', shape: inside },\n { name: 'Outside', shape: outside },\n];\n`,\n ),\n inlineCase(\n 'plane-trim-exact',\n 'Plane trims and split branches stay compiler-owned across both lowerers.',\n `\nconst body = box(40, 30, 20);\nconst trimmed = body.trimByPlane([0, 0, 1], 0);\nconst [upper, lower] = body.splitByPlane([0, 0, 1], 0);\nreturn [\n { name: 'Trimmed', shape: trimmed },\n { name: 'Upper', shape: upper },\n { name: 'Lower', shape: lower },\n];\n`,\n ),\n inlineCase(\n 'loft-exact',\n 'Loft stays compiler-owned and lowerable to both Manifold and CadQuery/OCCT for compatible section stacks.',\n `\nconst body = loft(\n [\n roundedRect(26, 16, 3).translate(-1, 0),\n circle2d(8),\n roundedRect(18, 10, 2).translate(2, -1),\n ],\n [0, 14, 28],\n);\nreturn [{ name: 'Loft', shape: body }];\n`,\n ),\n inlineCase(\n 'sweep-exact',\n 'Sweep keeps its sampled path intent in the compile graph and exports through the exact lowerer.',\n `\nconst profile = roundedRect(8, 4, 1.2).rotate(18).translate(1.5, 0);\nconst route = [\n [0, 0, 0],\n [18, 0, 0],\n [28, 8, 4],\n [40, 12, 10],\n];\nconst body = sweep(profile, route, { up: [0, 0, 1], edgeLength: 0.5 });\nreturn [{ name: 'Sweep', shape: body }];\n`,\n ),\n inlineCase(\n 'shell-exact',\n 'Shell keeps semantic intent in the compile graph while exact lowering rewrites it into the supported boolean/extrude subset.',\n `\nconst body = roundedRect(80, 50, 6)\n .extrude(30)\n .translate(4, -3, 2)\n .shell(2.5, { openFaces: ['top'] });\nreturn [{ name: 'Shell', shape: body }];\n`,\n ),\n inlineCase(\n 'hole-cut-workflows',\n 'Through holes, blind holes, and face-anchored cutouts stay compiler-owned and exact-exportable from one semantic workflow family.',\n HOLE_CUT_WORKFLOW_CODE,\n ),\n inlineCase(\n 'created-face-downstream',\n 'Shell inner walls, blind-hole floors, and cut-created walls stay queryable enough to drive downstream exact-exportable features.',\n CREATED_FACE_DOWNSTREAM_CODE,\n ),\n inlineCase(\n 'fillet-edge-workflow',\n 'Tracked vertical edge finishing stays compiler-owned through an ordinary union, preserves the selected propagated edge lineage, and still accepts downstream face-driven edits on the base-owner lineage.',\n FILLET_EDGE_WORKFLOW_CODE,\n ),\n inlineCase(\n 'chamfer-edge-workflow',\n 'Tracked vertical chamfers lower through both backends after a supported union, preserve the selected propagated edge lineage, and still compose with additive and hole-driven edits.',\n CHAMFER_EDGE_WORKFLOW_CODE,\n ),\n inlineCase(\n 'repeated-feature-ownership',\n 'Mirrored descendants and patterned cuts keep repeated-result ownership visible through booleans and downstream workplanes.',\n `\nconst plate = roundedRect(90, 56, 6).extrude(14);\nconst boss = roundedRect(18, 12, 3)\n .onFace(plate, 'top', { u: -22, v: 12, protrude: 0.5, selfAnchor: 'center' })\n .extrude(10);\nconst mirroredBoss = boss.mirror([1, 0, 0]);\nconst mirroredDrill = circle2d(3)\n .onFace(mirroredBoss, 'top', { u: 0, v: 0, protrude: 0.25, selfAnchor: 'center' })\n .extrude(14);\nconst slotSeed = roundedRect(12, 4, 1.5)\n .onFace(plate, 'top', { u: -24, v: -14, protrude: 0.5, selfAnchor: 'center' })\n .extrude(8);\nconst slotCuts = linearPattern(slotSeed, 3, 24, 0, 0);\nconst body = union(\n plate,\n boss,\n mirroredBoss,\n).subtract(mirroredDrill).subtract(slotCuts);\nreturn [{ name: 'Repeated Feature Plate', shape: body }];\n`,\n ),\n inlineCase(\n 'boolean-pattern-query-propagation',\n 'Boolean propagation keeps repeated-result descendants reviewable through supported unions and reports duplicate-owner merges explicitly.',\n `\nconst duplicateSeed = roundedRect(16, 12, 2).extrude(10);\nconst duplicateUnion = union(\n duplicateSeed,\n duplicateSeed.clone().translate(28, 0, 0),\n);\n\nconst plate = roundedRect(84, 48, 4).extrude(12);\nconst bossSeed = roundedRect(12, 10, 1.5)\n .onFace(plate, 'top', { u: -24, v: 0, protrude: 0.5, selfAnchor: 'center' })\n .extrude(8);\nconst bosses = linearPattern(bossSeed, 3, 24, 0, 0);\nconst bossPlate = union(plate, bosses);\nconst trimmedBossPlate = bossPlate.subtract(\n box(18, 10, 24).translate(0, 0, 8),\n);\n\nreturn [\n { name: 'Duplicate Owner Union', shape: duplicateUnion },\n { name: 'Pattern Bosses', shape: bosses },\n { name: 'Trimmed Boss Plate', shape: trimmedBossPlate },\n];\n`,\n ),\n inlineCase(\n 'sketch-on-face-placement',\n 'Downstream features keep semantic workplane placement intent in the compile graph and propagate it through later shape transforms.',\n `\nconst body = roundedRect(20, 12, 2).extrude(6);\nconst feature = rect(6, 4)\n .onFace(body, 'top', { u: 2, v: 1, protrude: 0.5, selfAnchor: 'center' })\n .extrude(3)\n .translate(10, -2, 5)\n .rotateZ(90);\nreturn [{ name: 'Feature', shape: feature }];\n`,\n ),\n ...COMPILER_REGRESSION_CORPUS.map((part) => fileCase(part.id, part.description, part.scriptPath)),\n inlineCase(\n 'projection-downstream-gasket',\n 'Projection-driven downstream sketching keeps explicit projection intent on the sketch and still lowers follow-on face features through both compiler paths.',\n `\nconst base = roundedRect(40, 24, 4).extrude(8);\nconst badge = roundedRect(18, 8, 2)\n .onFace(base, 'top', { u: 5, v: -2, protrude: 0.25, selfAnchor: 'center' })\n .extrude(2);\nconst projected = projectToPlane(badge, { plane: 'XY' });\nconst gasket = projected\n .offset(1.25)\n .onFace(base, 'top', { protrude: 0.25, selfAnchor: 'center' })\n .extrude(0.8);\nreturn [\n { name: 'Projected Badge', sketch: projected },\n { name: 'Gasket', shape: gasket },\n];\n`,\n ),\n inlineCase(\n 'segmented-runtime-hints',\n 'Segmented runtime intent stays runnable but outside the exact BREP subset.',\n `\nconst segmentedDisk = circle2d(12, 18).extrude(4);\nconst segmentedPost = cylinder(20, 5, undefined, 12);\nconst segmentedLathe = polygon([\n [6, 0],\n [10, 4],\n [8, 12],\n [0, 12],\n]).revolve(240, 24);\nreturn [\n { name: 'Segmented Disk', shape: segmentedDisk },\n { name: 'Segmented Post', shape: segmentedPost },\n { name: 'Segmented Lathe', shape: segmentedLathe },\n];\n`,\n ),\n inlineCase(\n 'sketch-profile-chain',\n 'Sketch-only profile chains keep profile lowering aligned with runtime cross-sections.',\n `\nconst profile = difference2d(\n roundedRect(80, 50, 10),\n circle2d(12).translate(18, 0),\n circle2d(8).translate(-18, 0),\n)\n .offset(-2)\n .mirror([1, 0])\n .translate(5, -3);\nreturn [{ name: 'Profile', sketch: profile }];\n`,\n ),\n ];\n return _compilerCases;\n}\n\nfunction parseArgs(argv: string[]) {\n let update = false;\n let caseId: string | undefined;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--update') {\n update = true;\n continue;\n }\n if (arg === '--case') {\n caseId = argv[index + 1];\n if (!caseId) throw new Error('--case requires an id');\n index += 1;\n continue;\n }\n throw new Error(`Unknown flag: ${arg}`);\n }\n\n return { update, caseId };\n}\n\nfunction stripUndefinedDeep<T>(value: T): T {\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) return null as T;\n return (Object.is(value, -0) ? 0 : value) as T;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => stripUndefinedDeep(entry)) as T;\n }\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entry]) => entry !== undefined)\n .map(([key, entry]) => [key, stripUndefinedDeep(entry)]),\n ) as T;\n }\n return value;\n}\n\nfunction generateSnapshots(caseId?: string): CompilerCaseSnapshot[] {\n const cases = getCompilerCases();\n const selected = caseId ? cases.filter((entry) => entry.id === caseId) : cases;\n if (selected.length === 0) {\n throw new Error(`Unknown compiler snapshot case: ${caseId}`);\n }\n\n return selected.map((entry) =>\n stripUndefinedDeep({\n id: entry.id,\n description: entry.description,\n scene: inspectCompilerScene(entry.input),\n }),\n );\n}\n\nfunction isFaceQueryKind(kind: unknown): boolean {\n return (\n kind === 'canonical-face' || kind === 'tracked-face' || kind === 'face-ref' || kind === 'propagated-face' || kind === 'created-face'\n );\n}\n\nfunction isEdgeQueryKind(kind: unknown): boolean {\n return kind === 'tracked-edge' || kind === 'edge-ref' || kind === 'propagated-edge' || kind === 'created-edge';\n}\n\nfunction assertPropagationQueryShape(\n snapshotId: string,\n objectName: string,\n rewriteId: string,\n label: string,\n queryKind: 'face' | 'edge',\n query: unknown,\n issues: string[],\n enforceRewriteId = true,\n): void {\n if (!query || typeof query !== 'object') {\n issues.push(`${snapshotId}/${objectName}: ${label} is missing a query object`);\n return;\n }\n\n const candidate = query as { kind?: unknown; rewriteId?: unknown };\n if (queryKind === 'face' && !isFaceQueryKind(candidate.kind)) {\n issues.push(`${snapshotId}/${objectName}: ${label} should carry a face-query ref, got ${String(candidate.kind)}`);\n return;\n }\n if (queryKind === 'edge' && !isEdgeQueryKind(candidate.kind)) {\n issues.push(`${snapshotId}/${objectName}: ${label} should carry an edge-query ref, got ${String(candidate.kind)}`);\n return;\n }\n if (\n enforceRewriteId &&\n (candidate.kind === 'propagated-face' ||\n candidate.kind === 'created-face' ||\n candidate.kind === 'propagated-edge' ||\n candidate.kind === 'created-edge') &&\n candidate.rewriteId !== rewriteId\n ) {\n issues.push(\n `${snapshotId}/${objectName}: ${label} rewriteId ${String(candidate.rewriteId)} does not match parent propagation ${rewriteId}`,\n );\n }\n}\n\nfunction assertLoweredRuntimeMatches(snapshots: CompilerCaseSnapshot[]): void {\n const mismatches: string[] = [];\n\n for (const snapshot of snapshots) {\n for (const object of snapshot.scene.objects) {\n if (object.loweredRuntimeError) {\n mismatches.push(`${snapshot.id}/${object.name}: lowering failed (${object.loweredRuntimeError})`);\n continue;\n }\n if (object.kind === 'shape' && object.compilePlan && object.loweredRuntimeMatches !== true) {\n mismatches.push(`${snapshot.id}/${object.name}: runtime shape diverged from compiler Manifold lowering`);\n }\n if (object.kind === 'sketch' && object.compilePlan && object.loweredRuntimeMatches !== true) {\n mismatches.push(`${snapshot.id}/${object.name}: runtime sketch diverged from compiler profile lowering`);\n }\n }\n }\n\n assert.equal(mismatches.length, 0, `Compiler/runtime mismatch:\\n${mismatches.map((line) => `- ${line}`).join('\\n')}`);\n}\n\nfunction assertCompilerRoutingIntegrity(snapshots: CompilerCaseSnapshot[]): void {\n const issues: string[] = [];\n\n for (const snapshot of snapshots) {\n const exactObjects = new Map(snapshot.scene.exactExport.objects.map((object) => [object.name, object]));\n const facetedObjects = new Map(snapshot.scene.facetedExport.objects.map((object) => [object.name, object]));\n const exactUnsupported = new Set(snapshot.scene.exactExport.unsupported.map((item) => item.name));\n const facetedUnsupported = new Set(snapshot.scene.facetedExport.unsupported.map((item) => item.name));\n const facetedFallbacks = new Set(snapshot.scene.facetedExport.fallbacks.map((item) => item.name));\n const skippedObjects = new Set(snapshot.scene.exactExport.skipped.map((item) => item.name));\n\n for (const object of snapshot.scene.objects) {\n if (object.kind === 'shape') {\n if (object.cadqueryOcct.supported && object.cadqueryOcct.plan == null) {\n issues.push(`${snapshot.id}/${object.name}: CadQuery/OCCT target marked supported without a lowered plan`);\n }\n if (!object.cadqueryOcct.supported && object.cadqueryOcct.diagnostics.length === 0) {\n issues.push(`${snapshot.id}/${object.name}: CadQuery/OCCT target marked unsupported without diagnostics`);\n }\n if (object.compilePlan && object.loweredRuntime == null && object.loweredRuntimeError == null) {\n issues.push(`${snapshot.id}/${object.name}: compile-covered runtime object missing lowered runtime summary`);\n }\n\n const exactExportObject = exactObjects.get(object.name);\n const facetedExportObject = facetedObjects.get(object.name);\n\n if (object.exactRoute.kind === 'exact') {\n if (!object.cadqueryOcct.supported) {\n issues.push(`${snapshot.id}/${object.name}: exact route is exact but CadQuery/OCCT target is unsupported`);\n }\n if (!exactExportObject || exactExportObject.kind !== 'exact') {\n issues.push(`${snapshot.id}/${object.name}: exact-exportable shape missing from exact export manifest`);\n }\n if (exactUnsupported.has(object.name)) {\n issues.push(`${snapshot.id}/${object.name}: exact-route shape still reported as unsupported in exact manifest`);\n }\n } else if (object.exactRoute.kind === 'unsupported') {\n if (object.cadqueryOcct.supported) {\n issues.push(`${snapshot.id}/${object.name}: exact route is unsupported but CadQuery/OCCT target is marked supported`);\n }\n if (!exactUnsupported.has(object.name)) {\n issues.push(`${snapshot.id}/${object.name}: exact-unsupported shape missing from exact export blockers`);\n }\n } else {\n issues.push(`${snapshot.id}/${object.name}: unexpected exact route kind for shape (${object.exactRoute.kind})`);\n }\n\n switch (object.facetedRoute.kind) {\n case 'exact':\n if (!facetedExportObject || facetedExportObject.kind !== 'exact') {\n issues.push(`${snapshot.id}/${object.name}: exact-route shape missing from allow-faceted export manifest as exact`);\n }\n if (facetedFallbacks.has(object.name) || facetedUnsupported.has(object.name)) {\n issues.push(`${snapshot.id}/${object.name}: exact-route shape still reported as fallback or unsupported with allow-faceted`);\n }\n break;\n case 'faceted':\n if (object.cadqueryOcct.supported) {\n issues.push(`${snapshot.id}/${object.name}: faceted route selected even though CadQuery/OCCT target is supported`);\n }\n if (!object.facetedMesh.supported) {\n issues.push(`${snapshot.id}/${object.name}: faceted route selected but faceted mesh target is unsupported`);\n }\n if (!facetedExportObject || facetedExportObject.kind !== 'faceted') {\n issues.push(`${snapshot.id}/${object.name}: faceted-route shape missing from allow-faceted manifest`);\n }\n if (!facetedFallbacks.has(object.name)) {\n issues.push(`${snapshot.id}/${object.name}: faceted-route shape missing fallback record`);\n }\n if (facetedUnsupported.has(object.name)) {\n issues.push(`${snapshot.id}/${object.name}: faceted-route shape still marked unsupported with allow-faceted`);\n }\n break;\n case 'unsupported':\n if (object.facetedMesh.supported && !object.cadqueryOcct.supported) {\n issues.push(`${snapshot.id}/${object.name}: allow-faceted route stayed unsupported despite faceted mesh support`);\n }\n if (!facetedUnsupported.has(object.name)) {\n issues.push(`${snapshot.id}/${object.name}: allow-faceted unsupported shape missing from manifest blockers`);\n }\n if (facetedExportObject || facetedFallbacks.has(object.name)) {\n issues.push(`${snapshot.id}/${object.name}: allow-faceted unsupported shape leaked into manifest objects/fallbacks`);\n }\n break;\n default:\n issues.push(`${snapshot.id}/${object.name}: unexpected allow-faceted route kind for shape (${object.facetedRoute.kind})`);\n }\n continue;\n }\n\n if (object.exactRoute.kind !== 'skipped') {\n issues.push(`${snapshot.id}/${object.name}: sketch exact route should be skipped, got ${object.exactRoute.kind}`);\n }\n if (object.facetedRoute.kind !== 'skipped') {\n issues.push(`${snapshot.id}/${object.name}: sketch allow-faceted route should be skipped, got ${object.facetedRoute.kind}`);\n }\n if (!skippedObjects.has(object.name)) {\n issues.push(`${snapshot.id}/${object.name}: sketch missing from export skip list`);\n }\n if (!snapshot.scene.facetedExport.skipped.some((item) => item.name === object.name)) {\n issues.push(`${snapshot.id}/${object.name}: sketch missing from allow-faceted export skip list`);\n }\n if (object.cadqueryOcctProfile.supported && object.cadqueryOcctProfile.plan == null) {\n issues.push(`${snapshot.id}/${object.name}: CadQuery/OCCT profile marked supported without a lowered plan`);\n }\n if (!object.cadqueryOcctProfile.supported && object.cadqueryOcctProfile.diagnostics.length === 0) {\n issues.push(`${snapshot.id}/${object.name}: CadQuery/OCCT profile marked unsupported without diagnostics`);\n }\n if (object.compilePlan && object.loweredRuntime == null && object.loweredRuntimeError == null) {\n issues.push(`${snapshot.id}/${object.name}: compile-covered sketch missing lowered runtime summary`);\n }\n }\n }\n\n assert.equal(issues.length, 0, `Compiler routing integrity failed:\\n${issues.map((line) => `- ${line}`).join('\\n')}`);\n}\n\nfunction assertTopologyRewritePropagationIntegrity(snapshots: CompilerCaseSnapshot[]): void {\n const issues: string[] = [];\n\n for (const snapshot of snapshots) {\n for (const object of snapshot.scene.objects) {\n if (object.kind !== 'shape') continue;\n if (!object.compilePlan && object.topologyRewritePropagations.length > 0) {\n issues.push(`${snapshot.id}/${object.name}: propagation metadata exists without a compile plan`);\n }\n\n const seenRewriteIds = new Set<string>();\n for (const propagation of object.topologyRewritePropagations) {\n if (seenRewriteIds.has(propagation.rewriteId)) {\n issues.push(`${snapshot.id}/${object.name}: duplicate topology-rewrite id ${propagation.rewriteId}`);\n }\n seenRewriteIds.add(propagation.rewriteId);\n\n if (propagation.owner && propagation.owner.id !== propagation.rewriteId) {\n issues.push(\n `${snapshot.id}/${object.name}: propagation ${propagation.operation} owner id ${propagation.owner.id} should match rewriteId ${propagation.rewriteId}`,\n );\n }\n\n for (const entry of propagation.preservedFaces) {\n assertPropagationQueryShape(snapshot.id, object.name, propagation.rewriteId, 'preservedFaces[]', 'face', entry.query, issues);\n if ((entry.query as { kind: string }).kind !== 'propagated-face') {\n issues.push(`${snapshot.id}/${object.name}: preserved face entries must use propagated-face queries`);\n }\n }\n for (const entry of propagation.preservedEdges) {\n assertPropagationQueryShape(snapshot.id, object.name, propagation.rewriteId, 'preservedEdges[]', 'edge', entry.query, issues);\n if ((entry.query as { kind: string }).kind !== 'propagated-edge') {\n issues.push(`${snapshot.id}/${object.name}: preserved edge entries must use propagated-edge queries`);\n }\n }\n for (const entry of propagation.createdFaces) {\n assertPropagationQueryShape(snapshot.id, object.name, propagation.rewriteId, 'createdFaces[]', 'face', entry.query, issues);\n if ((entry.query as { kind: string }).kind !== 'created-face') {\n issues.push(`${snapshot.id}/${object.name}: created face entries must use created-face queries`);\n }\n }\n for (const entry of propagation.createdEdges) {\n assertPropagationQueryShape(snapshot.id, object.name, propagation.rewriteId, 'createdEdges[]', 'edge', entry.query, issues);\n if ((entry.query as { kind: string }).kind !== 'created-edge') {\n issues.push(`${snapshot.id}/${object.name}: created edge entries must use created-edge queries`);\n }\n }\n for (const diagnostic of propagation.diagnostics) {\n if (diagnostic.source) {\n assertPropagationQueryShape(\n snapshot.id,\n object.name,\n propagation.rewriteId,\n `diagnostic(${diagnostic.code}).source`,\n diagnostic.queryKind,\n diagnostic.source,\n issues,\n false,\n );\n }\n if (diagnostic.query) {\n assertPropagationQueryShape(\n snapshot.id,\n object.name,\n propagation.rewriteId,\n `diagnostic(${diagnostic.code}).query`,\n diagnostic.queryKind,\n diagnostic.query,\n issues,\n );\n }\n }\n }\n }\n }\n\n assert.equal(issues.length, 0, `Topology-rewrite propagation integrity failed:\\n${issues.map((line) => `- ${line}`).join('\\n')}`);\n}\n\nfunction readStoredSnapshots(): CompilerCaseSnapshot[] {\n return JSON.parse(readFileSync(SNAPSHOT_PATH, 'utf-8')) as CompilerCaseSnapshot[];\n}\n\nfunction writeSnapshots(snapshots: CompilerCaseSnapshot[]): void {\n mkdirSync(dirname(SNAPSHOT_PATH), { recursive: true });\n writeFileSync(SNAPSHOT_PATH, `${JSON.stringify(snapshots, null, 2)}\\n`, 'utf-8');\n}\n\nexport async function runCheckCompilerCli(argv: string[] = process.argv.slice(2)): Promise<void> {\n const { update, caseId } = parseArgs(argv);\n await init();\n setActiveBackend('manifold');\n\n const generated = generateSnapshots(caseId);\n assertLoweredRuntimeMatches(generated);\n assertCompilerRoutingIntegrity(generated);\n assertTopologyRewritePropagationIntegrity(generated);\n\n if (update) {\n writeSnapshots(generated);\n console.log(`✓ Updated compiler snapshots at ${SNAPSHOT_PATH}`);\n return;\n }\n\n const stored = readStoredSnapshots();\n const expected = caseId ? stored.filter((entry) => entry.id === caseId) : stored;\n\n assert.deepEqual(\n generated,\n expected,\n `Compiler snapshots changed. Re-run with \"forgecad check compiler --update${caseId ? ` --case ${caseId}` : ''}\" after reviewing the diff.`,\n );\n\n console.log(`✓ Compiler snapshots passed (${generated.length} case${generated.length === 1 ? '' : 's'})`);\n}\n\nrunDirectCliMain(import.meta.url, 'cli/check-compiler.ts', () => runCheckCompilerCli(process.argv.slice(2)));\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/check-query-propagation.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Query-propagation regression snapshots.\n *\n * This keeps topology-rewrite query propagation reviewable without colliding\n * with the broader compiler-routing snapshots.\n */\nimport assert from 'node:assert/strict';\nimport { mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { init, setActiveBackend } from '../src/forge/headless';\nimport {\n describeEdgeQueryRef,\n describeFaceQueryRef,\n describeTopologyRewriteDescendantContract,\n type EdgeQueryRef,\n type FaceQueryRef,\n type ShapeQueryOwner,\n type TopologyRewritePropagation,\n} from '../src/forge/queryModel';\nimport type { CompilerInspectionInput, CompilerRouteInspection, CompilerShapeInspection } from './compiler-inspection';\nimport { inspectCompilerScene, loadCompilerInspectionInput } from './compiler-inspection';\nimport { getCompilerRegressionCorpusPart } from './compiler-regression-corpus';\nimport { CHAMFER_EDGE_WORKFLOW_CODE, FILLET_EDGE_WORKFLOW_CODE } from './edge-finish-fixtures';\nimport { resolvePackagePath, runDirectCliMain } from './package-runtime';\n\ntype QueryPropagationRouteSnapshot = {\n kind: CompilerRouteInspection['kind'];\n target?: CompilerRouteInspection['target'];\n reason?: string;\n diagnosticCodes: string[];\n};\n\ntype QueryPropagationEntrySnapshot = {\n status?: 'supported' | 'ambiguous';\n query: string;\n note?: string;\n};\n\ntype QueryPropagationDiagnosticSnapshot = {\n code: string;\n category: 'ambiguous' | 'unsupported';\n queryKind: 'face' | 'edge';\n source?: string;\n query?: string;\n};\n\ntype QueryPropagationSnapshot = {\n rewriteId: string;\n operation: string;\n owner?: string;\n preservedFaces: QueryPropagationEntrySnapshot[];\n preservedEdges: QueryPropagationEntrySnapshot[];\n createdFaces: QueryPropagationEntrySnapshot[];\n createdEdges: QueryPropagationEntrySnapshot[];\n diagnostics: QueryPropagationDiagnosticSnapshot[];\n descendants: string[];\n};\n\ntype QueryPropagationObjectSnapshot = {\n name: string;\n exactRoute: QueryPropagationRouteSnapshot;\n facetedRoute: QueryPropagationRouteSnapshot;\n propagationOps: string[];\n propagations: QueryPropagationSnapshot[];\n};\n\ntype QueryPropagationCaseSnapshot = {\n id: string;\n description: string;\n objects: QueryPropagationObjectSnapshot[];\n};\n\ntype QueryPropagationObjectExpectation = {\n name: string;\n exactRouteKind: QueryPropagationRouteSnapshot['kind'];\n facetedRouteKind: QueryPropagationRouteSnapshot['kind'];\n operations: string[];\n requiredDiagnosticCodes: string[];\n requiredRouteDiagnosticCodes?: string[];\n requiredPreservedFaceQueries?: string[];\n requiredPreservedEdgeQueries?: string[];\n requiredCreatedFaceQueries?: string[];\n requiredCreatedEdgeQueries?: string[];\n};\n\ntype QueryPropagationCaseDefinition = {\n id: string;\n description: string;\n input: CompilerInspectionInput;\n expectedObjects: QueryPropagationObjectExpectation[];\n};\n\nconst SNAPSHOT_PATH = resolvePackagePath(import.meta.url, 'cli', 'snapshots', 'query-propagation-snapshots.json');\n\nconst HOLE_CUT_WORKFLOW_CODE = `\nconst base = roundedRect(90, 60, 8).extrude(24);\nconst topPocket = roundedRect(18, 10, 2)\n .onFace(base, 'top', { u: 14, v: -8, selfAnchor: 'center' });\nconst sideCut = roundedRect(16, 8, 2)\n .onFace(base, 'right', { u: -4, v: 0, selfAnchor: 'center' });\nconst body = base\n .hole('front', { diameter: 8, u: 0, v: 2 })\n .hole('top', { diameter: 6, u: -18, v: 10, depth: 10 })\n .cutout(topPocket, { depth: 6 })\n .cutout(sideCut);\nreturn [{ name: 'Workflow', shape: body }];\n`;\n\nconst ADVANCED_HOLE_CUT_VARIANTS_CODE = `\nconst base = roundedRect(68, 44, 4).extrude(20);\nconst accessPocket = roundedRect(20, 12, 2)\n .onFace(base, 'top', { u: 0, v: 0, selfAnchor: 'center' });\nconst recessed = base.cutout(accessPocket, { depth: 10 });\nconst internalFloor = recessed.face('floor');\nconst threadedHole = recessed.hole(internalFloor, {\n diameter: 4.2,\n extent: {\n forward: { upToFace: base.face('bottom') },\n reverse: { depth: 2 },\n },\n thread: { designation: 'M5x0.8', class: '6H', depth: 4 },\n});\nconst taperedPocket = roundedRect(14, 8, 2)\n .onFace(threadedHole, 'front', { u: 0, v: 2, selfAnchor: 'center' });\nconst finished = threadedHole.cutout(taperedPocket, { depth: 5, taperScale: 0.75 });\nreturn [{ name: 'Advanced Variants', shape: finished }];\n`;\n\nconst TRIM_AND_SPLIT_WORKFLOW_CODE = `\nconst body = box(40, 30, 20);\nconst trimmed = body.trimByPlane([0, 0, 1], 0);\nconst [upper, lower] = body.splitByPlane([0, 0, 1], 0);\nreturn [\n { name: 'Trimmed', shape: trimmed },\n { name: 'Upper', shape: upper },\n { name: 'Lower', shape: lower },\n];\n`;\n\nfunction inlineCase(\n id: string,\n description: string,\n code: string,\n expectedObjects: QueryPropagationObjectExpectation[],\n): QueryPropagationCaseDefinition {\n return {\n id,\n description,\n input: {\n displayPath: `inline:${id}`,\n code,\n fileName: 'main.forge.js',\n allFiles: { 'main.forge.js': code },\n },\n expectedObjects,\n };\n}\n\nfunction fileCase(\n id: string,\n description: string,\n scriptPath: string,\n expectedObjects: QueryPropagationObjectExpectation[],\n): QueryPropagationCaseDefinition {\n return {\n id,\n description,\n input: loadCompilerInspectionInput(scriptPath),\n expectedObjects,\n };\n}\n\nfunction compilerCorpusCase(\n corpusId: string,\n description: string,\n expectedObjects: QueryPropagationObjectExpectation[],\n): QueryPropagationCaseDefinition {\n const part = getCompilerRegressionCorpusPart(corpusId);\n return fileCase(part.id, description, part.scriptPath, expectedObjects);\n}\n\nlet _queryPropagationCases: QueryPropagationCaseDefinition[] | undefined;\nfunction getQueryPropagationCases(): QueryPropagationCaseDefinition[] {\n if (_queryPropagationCases) return _queryPropagationCases;\n _queryPropagationCases = [\n inlineCase(\n 'trim-and-split-created-faces',\n 'Trim and split-by-plane workflows keep the defended plane-cap created-face query visible for each surviving branch.',\n TRIM_AND_SPLIT_WORKFLOW_CODE,\n [\n {\n name: 'Trimmed',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['trimByPlane'],\n requiredDiagnosticCodes: ['trim-by-plane-preserved-face-propagation-ambiguous', 'trim-by-plane-edge-propagation-ambiguous'],\n requiredCreatedFaceQueries: ['created-face(trimByPlane:plane-cap)'],\n },\n {\n name: 'Upper',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['trimByPlane'],\n requiredDiagnosticCodes: ['trim-by-plane-preserved-face-propagation-ambiguous', 'trim-by-plane-edge-propagation-ambiguous'],\n requiredCreatedFaceQueries: ['created-face(trimByPlane:plane-cap)'],\n },\n {\n name: 'Lower',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['trimByPlane'],\n requiredDiagnosticCodes: ['trim-by-plane-preserved-face-propagation-ambiguous', 'trim-by-plane-edge-propagation-ambiguous'],\n requiredCreatedFaceQueries: ['created-face(trimByPlane:plane-cap)'],\n },\n ],\n ),\n inlineCase(\n 'hole-cut-workflows',\n 'Hole and cut workflows record ambiguous preserved-face descendants plus defended created face and edge-chain slots.',\n HOLE_CUT_WORKFLOW_CODE,\n [\n {\n name: 'Workflow',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['cut', 'cut', 'hole', 'hole'],\n requiredDiagnosticCodes: ['cut-source-face-split-ambiguous', 'hole-source-face-split-ambiguous'],\n requiredPreservedFaceQueries: [\n 'propagated-face(split <- tracked-face(side-bottom)',\n 'propagated-face(split <- tracked-face(side-top)',\n 'propagated-face(split <- propagated-face(preserved <- tracked-face(top)',\n 'propagated-face(split <- propagated-face(preserved <- propagated-face(preserved <- propagated-face(preserved <- tracked-face(side-right)',\n ],\n requiredCreatedFaceQueries: [\n 'created-face(hole:wall)',\n 'created-face(hole:floor)',\n 'created-face(cut:floor)',\n 'created-face(cut:wall-right)',\n ],\n requiredCreatedEdgeQueries: [\n 'created-edge(hole:entry-rim#edge)',\n 'created-edge(hole:forward-end-rim#edge)',\n 'created-edge(cut:entry-rim#edge)',\n 'created-edge(cut:forward-end-rim#edge)',\n ],\n },\n ],\n ),\n inlineCase(\n 'advanced-hole-cut-variants',\n 'Two-sided threaded holes and tapered cuts keep defended cap/wall ownership and created edge chains reviewable in one feature stack.',\n ADVANCED_HOLE_CUT_VARIANTS_CODE,\n [\n {\n name: 'Advanced Variants',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['cut', 'hole', 'cut'],\n requiredDiagnosticCodes: [\n 'cut-source-face-split-ambiguous',\n 'hole-source-face-split-ambiguous',\n 'hole-up-to-face-target-split-ambiguous',\n ],\n requiredCreatedFaceQueries: ['created-face(hole:cap)', 'created-face(cut:wall-right)'],\n requiredCreatedEdgeQueries: [\n 'created-edge(hole:reverse-end-rim#edge)',\n 'created-edge(hole:forward-end-rim#edge)',\n 'created-edge(cut:forward-end-rim#edge)',\n ],\n },\n ],\n ),\n inlineCase(\n 'fillet-edge-workflow',\n 'Fillet workflows keep a preserved propagated edge finishable after an ordinary union while downstream hole/cut created faces stay visible in one chain.',\n FILLET_EDGE_WORKFLOW_CODE,\n [\n {\n name: 'Filleted Body',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['boolean:difference', 'cut', 'hole', 'fillet', 'boolean:union', 'fillet'],\n requiredDiagnosticCodes: [\n 'boolean-difference-face-split-ambiguous',\n\n 'cut-source-face-split-ambiguous',\n 'hole-source-face-split-ambiguous',\n 'boolean-union-edge-inherited-ambiguity',\n 'fillet-selected-edge-merged-ambiguous',\n 'fillet-created-face-propagation-unsupported',\n ],\n requiredPreservedFaceQueries: [\n 'propagated-face(split <- propagated-face(preserved <- created-face(hole:floor)',\n 'propagated-face(split <- created-face(cut:wall-right)',\n ],\n requiredPreservedEdgeQueries: [\n 'propagated-edge(merged <- propagated-edge(preserved <- propagated-edge(preserved <- tracked-edge(vert-bl#edge)',\n ],\n },\n ],\n ),\n inlineCase(\n 'chamfer-edge-workflow',\n 'Chamfer workflows keep a preserved propagated edge finishable after an ordinary union alongside upstream hole rewrite diagnostics.',\n CHAMFER_EDGE_WORKFLOW_CODE,\n [\n {\n name: 'Chamfered Body',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['hole', 'chamfer', 'boolean:union', 'chamfer'],\n requiredDiagnosticCodes: [\n 'hole-source-face-split-ambiguous',\n 'boolean-union-edge-inherited-ambiguity',\n 'chamfer-selected-edge-merged-ambiguous',\n 'chamfer-created-face-propagation-unsupported',\n ],\n requiredPreservedEdgeQueries: [\n 'propagated-edge(merged <- propagated-edge(preserved <- propagated-edge(preserved <- tracked-edge(vert-br#edge)',\n ],\n },\n ],\n ),\n compilerCorpusCase(\n 'corpus-enclosure-shell-cuts',\n 'The enclosure corpus keeps defended shell ownership plus later boolean rewrite boundaries reviewable inside a normal product-style part.',\n [\n {\n name: 'Enclosure Shell Cuts',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['boolean:difference', 'boolean:difference', 'boolean:union', 'shell', 'boolean:union', 'boolean:union'],\n requiredDiagnosticCodes: [\n 'boolean-difference-face-split-ambiguous',\n\n 'boolean-union-face-inherited-ambiguity',\n 'boolean-union-face-merged-ambiguous',\n 'boolean-union-edge-propagation-unsupported',\n ],\n },\n ],\n ),\n compilerCorpusCase(\n 'corpus-fastener-plate-variants',\n 'The fastener-plate corpus keeps counterbore/countersink created faces and up-to-face split diagnostics reviewable through one ordinary richer hole workflow.',\n [\n {\n name: 'Fastener Plate Variants',\n exactRouteKind: 'exact',\n facetedRouteKind: 'exact',\n operations: ['cut', 'hole', 'hole', 'hole', 'hole'],\n requiredDiagnosticCodes: [\n 'cut-source-face-split-ambiguous',\n 'cut-up-to-face-target-split-ambiguous',\n 'hole-source-face-split-ambiguous',\n 'hole-up-to-face-target-split-ambiguous',\n ],\n requiredCreatedFaceQueries: [\n 'created-face(hole:counterbore-floor)',\n 'created-face(hole:counterbore-wall)',\n 'created-face(hole:countersink-wall)',\n ],\n requiredCreatedEdgeQueries: ['created-edge(hole:head-transition-rim#edge)', 'created-edge(cut:forward-end-rim#edge)'],\n requiredPreservedFaceQueries: ['propagated-face(preserved <- created-face(hole:counterbore-floor)'],\n },\n ],\n ),\n ];\n return _queryPropagationCases;\n}\n\nfunction parseArgs(argv: string[]) {\n let update = false;\n let caseId: string | undefined;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--update') {\n update = true;\n continue;\n }\n if (arg === '--case') {\n caseId = argv[index + 1];\n if (!caseId) throw new Error('--case requires an id');\n index += 1;\n continue;\n }\n throw new Error(`Unknown flag: ${arg}`);\n }\n\n return { update, caseId };\n}\n\nfunction stripUndefinedDeep<T>(value: T): T {\n if (typeof value === 'number') {\n return (Object.is(value, -0) ? 0 : value) as T;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => stripUndefinedDeep(entry)) as T;\n }\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entry]) => entry !== undefined)\n .map(([key, entry]) => [key, stripUndefinedDeep(entry)]),\n ) as T;\n }\n return value;\n}\n\nfunction describeOwner(owner: ShapeQueryOwner | undefined): string | undefined {\n if (!owner) return undefined;\n return `${owner.operation}:${owner.id}`;\n}\n\nfunction describeQuery(queryKind: 'face' | 'edge', query: FaceQueryRef | EdgeQueryRef | undefined): string | undefined {\n if (!query) return undefined;\n return queryKind === 'face' ? describeFaceQueryRef(query as FaceQueryRef) : describeEdgeQueryRef(query as EdgeQueryRef);\n}\n\nfunction summarizeRoute(route: CompilerRouteInspection): QueryPropagationRouteSnapshot {\n return {\n kind: route.kind,\n target: route.target,\n reason: route.reason,\n diagnosticCodes: route.diagnostics?.map((diagnostic) => diagnostic.code) ?? [],\n };\n}\n\nfunction summarizePropagation(propagation: TopologyRewritePropagation): QueryPropagationSnapshot {\n return {\n rewriteId: propagation.rewriteId,\n operation: propagation.operation,\n owner: describeOwner(propagation.owner),\n preservedFaces: propagation.preservedFaces.map((entry) => ({\n status: entry.status,\n query: describeFaceQueryRef(entry.query),\n note: entry.note,\n })),\n preservedEdges: propagation.preservedEdges.map((entry) => ({\n status: entry.status,\n query: describeEdgeQueryRef(entry.query),\n note: entry.note,\n })),\n createdFaces: propagation.createdFaces.map((entry) => ({\n query: describeFaceQueryRef(entry.query),\n note: entry.note,\n })),\n createdEdges: propagation.createdEdges.map((entry) => ({\n query: describeEdgeQueryRef(entry.query),\n note: entry.note,\n })),\n diagnostics: propagation.diagnostics.map((diagnostic) => ({\n code: diagnostic.code,\n category: diagnostic.category,\n queryKind: diagnostic.queryKind,\n source: describeQuery(diagnostic.queryKind, diagnostic.source as FaceQueryRef | EdgeQueryRef | undefined),\n query: describeQuery(diagnostic.queryKind, diagnostic.query as FaceQueryRef | EdgeQueryRef | undefined),\n })),\n descendants: propagation.descendants.map((contract) => describeTopologyRewriteDescendantContract(contract)),\n };\n}\n\nfunction summarizeShapeObject(object: CompilerShapeInspection): QueryPropagationObjectSnapshot {\n return {\n name: object.name,\n exactRoute: summarizeRoute(object.exactRoute),\n facetedRoute: summarizeRoute(object.facetedRoute),\n propagationOps: object.topologyRewritePropagations.map((entry) => entry.operation),\n propagations: object.topologyRewritePropagations.map((entry) => summarizePropagation(entry)),\n };\n}\n\nfunction generateSnapshots(caseId?: string): QueryPropagationCaseSnapshot[] {\n const selected = caseId ? getQueryPropagationCases().filter((entry) => entry.id === caseId) : getQueryPropagationCases();\n if (selected.length === 0) {\n throw new Error(`Unknown query-propagation snapshot case: ${caseId}`);\n }\n\n return selected.map((entry) => {\n const scene = inspectCompilerScene(entry.input);\n const objects = scene.objects\n .filter((object): object is CompilerShapeInspection => object.kind === 'shape' && object.topologyRewritePropagations.length > 0)\n .map((object) => summarizeShapeObject(object));\n\n return stripUndefinedDeep({\n id: entry.id,\n description: entry.description,\n objects,\n });\n });\n}\n\nfunction collectEntryQueries(\n objects: QueryPropagationObjectSnapshot,\n key: 'preservedFaces' | 'preservedEdges' | 'createdFaces' | 'createdEdges',\n): string[] {\n return objects.propagations.flatMap((propagation) => propagation[key].map((entry) => entry.query));\n}\n\nfunction assertIncludesAll(\n caseId: string,\n objectName: string,\n label: string,\n actual: string[],\n expectedFragments: string[] | undefined,\n): void {\n if (!expectedFragments || expectedFragments.length === 0) return;\n for (const fragment of expectedFragments) {\n assert(\n actual.some((value) => value.includes(fragment)),\n `${caseId}/${objectName}: missing ${label} fragment \"${fragment}\" in ${JSON.stringify(actual)}`,\n );\n }\n}\n\nfunction assertExpectedCoverage(snapshots: QueryPropagationCaseSnapshot[]): void {\n const definitions = new Map(getQueryPropagationCases().map((entry) => [entry.id, entry]));\n\n for (const snapshot of snapshots) {\n const definition = definitions.get(snapshot.id);\n assert(definition, `Missing definition for query-propagation case ${snapshot.id}`);\n assert.equal(\n snapshot.objects.length,\n definition.expectedObjects.length,\n `${snapshot.id}: expected ${definition.expectedObjects.length} shape object(s) with propagation, got ${snapshot.objects.length}`,\n );\n\n for (const expected of definition.expectedObjects) {\n const object = snapshot.objects.find((entry) => entry.name === expected.name);\n assert(object, `${snapshot.id}: missing propagated shape \"${expected.name}\"`);\n assert.equal(\n object!.exactRoute.kind,\n expected.exactRouteKind,\n `${snapshot.id}/${expected.name}: expected exact route ${expected.exactRouteKind}, got ${object!.exactRoute.kind}`,\n );\n assert.equal(\n object!.facetedRoute.kind,\n expected.facetedRouteKind,\n `${snapshot.id}/${expected.name}: expected allow-faceted route ${expected.facetedRouteKind}, got ${object!.facetedRoute.kind}`,\n );\n assert.deepEqual(object!.propagationOps, expected.operations, `${snapshot.id}/${expected.name}: propagation ordering changed`);\n\n const diagnosticCodes = object!.propagations.flatMap((propagation) => propagation.diagnostics.map((diagnostic) => diagnostic.code));\n for (const code of expected.requiredDiagnosticCodes) {\n assert(diagnosticCodes.includes(code), `${snapshot.id}/${expected.name}: missing propagation diagnostic ${code}`);\n }\n\n for (const code of expected.requiredRouteDiagnosticCodes ?? []) {\n assert(\n object!.exactRoute.diagnosticCodes.includes(code) || object!.facetedRoute.diagnosticCodes.includes(code),\n `${snapshot.id}/${expected.name}: missing route diagnostic ${code}`,\n );\n }\n\n assertIncludesAll(\n snapshot.id,\n expected.name,\n 'preserved-face query',\n collectEntryQueries(object!, 'preservedFaces'),\n expected.requiredPreservedFaceQueries,\n );\n assertIncludesAll(\n snapshot.id,\n expected.name,\n 'preserved-edge query',\n collectEntryQueries(object!, 'preservedEdges'),\n expected.requiredPreservedEdgeQueries,\n );\n assertIncludesAll(\n snapshot.id,\n expected.name,\n 'created-face query',\n collectEntryQueries(object!, 'createdFaces'),\n expected.requiredCreatedFaceQueries,\n );\n assertIncludesAll(\n snapshot.id,\n expected.name,\n 'created-edge query',\n collectEntryQueries(object!, 'createdEdges'),\n expected.requiredCreatedEdgeQueries,\n );\n }\n }\n}\n\nfunction readStoredSnapshots(): QueryPropagationCaseSnapshot[] {\n return JSON.parse(readFileSync(SNAPSHOT_PATH, 'utf-8')) as QueryPropagationCaseSnapshot[];\n}\n\nfunction writeSnapshots(snapshots: QueryPropagationCaseSnapshot[]): void {\n mkdirSync(dirname(SNAPSHOT_PATH), { recursive: true });\n writeFileSync(SNAPSHOT_PATH, `${JSON.stringify(snapshots, null, 2)}\\n`, 'utf-8');\n}\n\nexport async function runCheckQueryPropagationCli(argv: string[] = process.argv.slice(2)): Promise<void> {\n const { update, caseId } = parseArgs(argv);\n await init();\n setActiveBackend('manifold');\n\n const generated = generateSnapshots(caseId);\n assertExpectedCoverage(generated);\n\n if (update) {\n writeSnapshots(generated);\n console.log(`✓ Updated query-propagation snapshots at ${SNAPSHOT_PATH}`);\n return;\n }\n\n const stored = readStoredSnapshots();\n const expected = caseId ? stored.filter((entry) => entry.id === caseId) : stored;\n\n assert.deepEqual(\n generated,\n expected,\n `Query-propagation snapshots changed. Re-run with \"forgecad check query-propagation --update${caseId ? ` --case ${caseId}` : ''}\" after reviewing the diff.`,\n );\n\n console.log(`✓ Query-propagation snapshots passed (${generated.length} case${generated.length === 1 ? '' : 's'})`);\n}\n\nrunDirectCliMain(import.meta.url, 'cli/check-query-propagation.ts', () => runCheckQueryPropagationCli(process.argv.slice(2)));\n"],"mappings":";;;;;;;;;;;;;;;;;AAOA,OAAO,YAAY;AACnB,SAAS,WAAW,cAAc,qBAAqB;AACvD,SAAS,eAAe;AAoFxB,IAAM,gBAAgB,mBAAmB,YAAY,KAAK,OAAO,aAAa,kCAAkC;AAEhH,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc/B,IAAM,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBxC,IAAM,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWrC,SAAS,WACP,IACA,aACA,MACA,iBACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,aAAa,UAAU,EAAE;AAAA,MACzB;AAAA,MACA,UAAU;AAAA,MACV,UAAU,EAAE,iBAAiB,KAAK;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,SACP,IACA,aACA,YACA,iBACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,4BAA4B,UAAU;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,SAAS,mBACP,UACA,aACA,iBACgC;AAChC,QAAM,OAAO,gCAAgC,QAAQ;AACrD,SAAO,SAAS,KAAK,IAAI,aAAa,KAAK,YAAY,eAAe;AACxE;AAEA,IAAI;AACJ,SAAS,2BAA6D;AACpE,MAAI,uBAAwB,QAAO;AACnC,2BAAyB;AAAA,IACvB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,aAAa;AAAA,UAC1B,yBAAyB,CAAC,sDAAsD,0CAA0C;AAAA,UAC1H,4BAA4B,CAAC,qCAAqC;AAAA,QACpE;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,aAAa;AAAA,UAC1B,yBAAyB,CAAC,sDAAsD,0CAA0C;AAAA,UAC1H,4BAA4B,CAAC,qCAAqC;AAAA,QACpE;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,aAAa;AAAA,UAC1B,yBAAyB,CAAC,sDAAsD,0CAA0C;AAAA,UAC1H,4BAA4B,CAAC,qCAAqC;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,OAAO,OAAO,QAAQ,MAAM;AAAA,UACzC,yBAAyB,CAAC,mCAAmC,kCAAkC;AAAA,UAC/F,8BAA8B;AAAA,YAC5B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,4BAA4B;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,4BAA4B;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,OAAO,QAAQ,KAAK;AAAA,UACjC,yBAAyB;AAAA,YACvB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,4BAA4B,CAAC,0BAA0B,8BAA8B;AAAA,UACrF,4BAA4B;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,sBAAsB,OAAO,QAAQ,UAAU,iBAAiB,QAAQ;AAAA,UACrF,yBAAyB;AAAA,YACvB;AAAA,YAEA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,8BAA8B;AAAA,YAC5B;AAAA,YACA;AAAA,UACF;AAAA,UACA,8BAA8B;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,QAAQ,WAAW,iBAAiB,SAAS;AAAA,UAC1D,yBAAyB;AAAA,YACvB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,8BAA8B;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,sBAAsB,sBAAsB,iBAAiB,SAAS,iBAAiB,eAAe;AAAA,UACnH,yBAAyB;AAAA,YACvB;AAAA,YAEA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,YAAY,CAAC,OAAO,QAAQ,QAAQ,QAAQ,MAAM;AAAA,UAClD,yBAAyB;AAAA,YACvB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,4BAA4B;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,4BAA4B,CAAC,+CAA+C,wCAAwC;AAAA,UACpH,8BAA8B,CAAC,mEAAmE;AAAA,QACpG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAgB;AACjC,MAAI,SAAS;AACb,MAAI;AAEJ,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,QAAQ,YAAY;AACtB,eAAS;AACT;AAAA,IACF;AACA,QAAI,QAAQ,UAAU;AACpB,eAAS,KAAK,QAAQ,CAAC;AACvB,UAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,uBAAuB;AACpD,eAAS;AACT;AAAA,IACF;AACA,UAAM,IAAI,MAAM,iBAAiB,GAAG,EAAE;AAAA,EACxC;AAEA,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAEA,SAAS,mBAAsB,OAAa;AAC1C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAQ,OAAO,GAAG,OAAO,EAAE,IAAI,IAAI;AAAA,EACrC;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAAA,EACvD;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAK,EACjB,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS,EACzC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,mBAAmB,KAAK,CAAC,CAAC;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAwD;AAC7E,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,GAAG,MAAM,SAAS,IAAI,MAAM,EAAE;AACvC;AAEA,SAAS,cAAc,WAA4B,OAAoE;AACrH,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,cAAc,SAAS,qBAAqB,KAAqB,IAAI,qBAAqB,KAAqB;AACxH;AAEA,SAAS,eAAe,OAA+D;AACrF,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,iBAAiB,MAAM,aAAa,IAAI,CAAC,eAAe,WAAW,IAAI,KAAK,CAAC;AAAA,EAC/E;AACF;AAEA,SAAS,qBAAqB,aAAmE;AAC/F,SAAO;AAAA,IACL,WAAW,YAAY;AAAA,IACvB,WAAW,YAAY;AAAA,IACvB,OAAO,cAAc,YAAY,KAAK;AAAA,IACtC,gBAAgB,YAAY,eAAe,IAAI,CAAC,WAAW;AAAA,MACzD,QAAQ,MAAM;AAAA,MACd,OAAO,qBAAqB,MAAM,KAAK;AAAA,MACvC,MAAM,MAAM;AAAA,IACd,EAAE;AAAA,IACF,gBAAgB,YAAY,eAAe,IAAI,CAAC,WAAW;AAAA,MACzD,QAAQ,MAAM;AAAA,MACd,OAAO,qBAAqB,MAAM,KAAK;AAAA,MACvC,MAAM,MAAM;AAAA,IACd,EAAE;AAAA,IACF,cAAc,YAAY,aAAa,IAAI,CAAC,WAAW;AAAA,MACrD,OAAO,qBAAqB,MAAM,KAAK;AAAA,MACvC,MAAM,MAAM;AAAA,IACd,EAAE;AAAA,IACF,cAAc,YAAY,aAAa,IAAI,CAAC,WAAW;AAAA,MACrD,OAAO,qBAAqB,MAAM,KAAK;AAAA,MACvC,MAAM,MAAM;AAAA,IACd,EAAE;AAAA,IACF,aAAa,YAAY,YAAY,IAAI,CAAC,gBAAgB;AAAA,MACxD,MAAM,WAAW;AAAA,MACjB,UAAU,WAAW;AAAA,MACrB,WAAW,WAAW;AAAA,MACtB,QAAQ,cAAc,WAAW,WAAW,WAAW,MAAiD;AAAA,MACxG,OAAO,cAAc,WAAW,WAAW,WAAW,KAAgD;AAAA,IACxG,EAAE;AAAA,IACF,aAAa,YAAY,YAAY,IAAI,CAAC,aAAa,0CAA0C,QAAQ,CAAC;AAAA,EAC5G;AACF;AAEA,SAAS,qBAAqB,QAAiE;AAC7F,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,YAAY,eAAe,OAAO,UAAU;AAAA,IAC5C,cAAc,eAAe,OAAO,YAAY;AAAA,IAChD,gBAAgB,OAAO,4BAA4B,IAAI,CAAC,UAAU,MAAM,SAAS;AAAA,IACjF,cAAc,OAAO,4BAA4B,IAAI,CAAC,UAAU,qBAAqB,KAAK,CAAC;AAAA,EAC7F;AACF;AAEA,SAAS,kBAAkB,QAAiD;AAC1E,QAAM,WAAW,SAAS,yBAAyB,EAAE,OAAO,CAAC,UAAU,MAAM,OAAO,MAAM,IAAI,yBAAyB;AACvH,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,MAAM,4CAA4C,MAAM,EAAE;AAAA,EACtE;AAEA,SAAO,SAAS,IAAI,CAAC,UAAU;AAC7B,UAAM,QAAQ,qBAAqB,MAAM,KAAK;AAC9C,UAAM,UAAU,MAAM,QACnB,OAAO,CAAC,WAA8C,OAAO,SAAS,WAAW,OAAO,4BAA4B,SAAS,CAAC,EAC9H,IAAI,CAAC,WAAW,qBAAqB,MAAM,CAAC;AAE/C,WAAO,mBAAmB;AAAA,MACxB,IAAI,MAAM;AAAA,MACV,aAAa,MAAM;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,oBACP,SACA,KACU;AACV,SAAO,QAAQ,aAAa,QAAQ,CAAC,gBAAgB,YAAY,GAAG,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AACnG;AAEA,SAAS,kBACP,QACA,YACA,OACA,QACA,mBACM;AACN,MAAI,CAAC,qBAAqB,kBAAkB,WAAW,EAAG;AAC1D,aAAW,YAAY,mBAAmB;AACxC;AAAA,MACE,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,QAAQ,CAAC;AAAA,MAC/C,GAAG,MAAM,IAAI,UAAU,aAAa,KAAK,cAAc,QAAQ,QAAQ,KAAK,UAAU,MAAM,CAAC;AAAA,IAC/F;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,WAAiD;AAC/E,QAAM,cAAc,IAAI,IAAI,yBAAyB,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AAExF,aAAW,YAAY,WAAW;AAChC,UAAM,aAAa,YAAY,IAAI,SAAS,EAAE;AAC9C,WAAO,YAAY,iDAAiD,SAAS,EAAE,EAAE;AACjF,WAAO;AAAA,MACL,SAAS,QAAQ;AAAA,MACjB,WAAW,gBAAgB;AAAA,MAC3B,GAAG,SAAS,EAAE,cAAc,WAAW,gBAAgB,MAAM,0CAA0C,SAAS,QAAQ,MAAM;AAAA,IAChI;AAEA,eAAW,YAAY,WAAW,iBAAiB;AACjD,YAAM,SAAS,SAAS,QAAQ,KAAK,CAAC,UAAU,MAAM,SAAS,SAAS,IAAI;AAC5E,aAAO,QAAQ,GAAG,SAAS,EAAE,+BAA+B,SAAS,IAAI,GAAG;AAC5E,aAAO;AAAA,QACL,OAAQ,WAAW;AAAA,QACnB,SAAS;AAAA,QACT,GAAG,SAAS,EAAE,IAAI,SAAS,IAAI,0BAA0B,SAAS,cAAc,SAAS,OAAQ,WAAW,IAAI;AAAA,MAClH;AACA,aAAO;AAAA,QACL,OAAQ,aAAa;AAAA,QACrB,SAAS;AAAA,QACT,GAAG,SAAS,EAAE,IAAI,SAAS,IAAI,kCAAkC,SAAS,gBAAgB,SAAS,OAAQ,aAAa,IAAI;AAAA,MAC9H;AACA,aAAO,UAAU,OAAQ,gBAAgB,SAAS,YAAY,GAAG,SAAS,EAAE,IAAI,SAAS,IAAI,gCAAgC;AAE7H,YAAM,kBAAkB,OAAQ,aAAa,QAAQ,CAAC,gBAAgB,YAAY,YAAY,IAAI,CAAC,eAAe,WAAW,IAAI,CAAC;AAClI,iBAAW,QAAQ,SAAS,yBAAyB;AACnD,eAAO,gBAAgB,SAAS,IAAI,GAAG,GAAG,SAAS,EAAE,IAAI,SAAS,IAAI,oCAAoC,IAAI,EAAE;AAAA,MAClH;AAEA,iBAAW,QAAQ,SAAS,gCAAgC,CAAC,GAAG;AAC9D;AAAA,UACE,OAAQ,WAAW,gBAAgB,SAAS,IAAI,KAAK,OAAQ,aAAa,gBAAgB,SAAS,IAAI;AAAA,UACvG,GAAG,SAAS,EAAE,IAAI,SAAS,IAAI,8BAA8B,IAAI;AAAA,QACnE;AAAA,MACF;AAEA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA,oBAAoB,QAAS,gBAAgB;AAAA,QAC7C,SAAS;AAAA,MACX;AACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA,oBAAoB,QAAS,gBAAgB;AAAA,QAC7C,SAAS;AAAA,MACX;AACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA,oBAAoB,QAAS,cAAc;AAAA,QAC3C,SAAS;AAAA,MACX;AACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA,oBAAoB,QAAS,cAAc;AAAA,QAC3C,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBAAsD;AAC7D,SAAO,KAAK,MAAM,aAAa,eAAe,OAAO,CAAC;AACxD;AAEA,SAAS,eAAe,WAAiD;AACvE,YAAU,QAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,gBAAc,eAAe,GAAG,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACjF;AAEA,eAAsB,4BAA4B,OAAiB,QAAQ,KAAK,MAAM,CAAC,GAAkB;AACvG,QAAM,EAAE,QAAQ,OAAO,IAAI,UAAU,IAAI;AACzC,QAAM,KAAK;AACX,mBAAiB,UAAU;AAE3B,QAAM,YAAY,kBAAkB,MAAM;AAC1C,yBAAuB,SAAS;AAEhC,MAAI,QAAQ;AACV,mBAAe,SAAS;AACxB,YAAQ,IAAI,iDAA4C,aAAa,EAAE;AACvE;AAAA,EACF;AAEA,QAAM,SAAS,oBAAoB;AACnC,QAAM,WAAW,SAAS,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO,MAAM,IAAI;AAE1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,8FAA8F,SAAS,WAAW,MAAM,KAAK,EAAE;AAAA,EACjI;AAEA,UAAQ,IAAI,8CAAyC,UAAU,MAAM,QAAQ,UAAU,WAAW,IAAI,KAAK,GAAG,GAAG;AACnH;AAEA,iBAAiB,YAAY,KAAK,kCAAkC,MAAM,4BAA4B,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC;","names":[]}
|