diff --git a/.agents/skills/cad-router b/.agents/skills/cad-router new file mode 120000 index 0000000..5d16688 --- /dev/null +++ b/.agents/skills/cad-router @@ -0,0 +1 @@ +/Users/lk/Projects/cadSet/text-to-cad/skills/cad-router \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9bf0e88..147204c 100644 --- a/.gitignore +++ b/.gitignore @@ -13,15 +13,12 @@ **/node_modules/ **/.next/ **/.cache/ +models/ # Undownloaded upstream Git LFS demo/catalog pointers text-to-cad/assets/ text-to-cad/benchmarks/*.gif -text-to-cad/models/benchmarks/ -text-to-cad/models/fun/ -text-to-cad/models/mechanisms/ -text-to-cad/models/robots/ -text-to-cad/models/simple/ +text-to-cad/models/ # Local editors and temporary files **/.idea/ diff --git a/cad-experience-library/library.json b/cad-experience-library/library.json index 0551839..a908c85 100644 --- a/cad-experience-library/library.json +++ b/cad-experience-library/library.json @@ -1,7 +1,7 @@ { "schema_version": "2.0", "library_kind": "generalized_cad_experience", - "generated_at": "2026-07-23T11:56:44+00:00", + "generated_at": "2026-07-23T08:16:40+00:00", "induction_mode": "llm_proposals_with_deterministic_evidence_verification", "status": "ready", "policy": { @@ -15,82 +15,24 @@ "minimum_confidence": 0.8 }, "corpus_summary": { - "accepted_case_count": 1000, + "accepted_case_count": 2, "duplicate_case_count": 0, "rejected_case_count": 0, "family_count": 11 }, "experience_summary": { - "llm_proposal_count": 133, - "promoted_experience_count": 130, - "candidate_experience_count": 3, - "by_kind": [ + "llm_proposal_count": 4, + "promoted_experience_count": 0, + "candidate_experience_count": 4, + "by_kind": [], + "by_scope": [], + "candidate_by_kind": [ { "kind": "constraint", - "count": 30 - }, - { - "kind": "dimensionless_distribution", - "count": 60 + "count": 1 }, { "kind": "feature_motif", - "count": 22 - }, - { - "kind": "reconstruction_grammar", - "count": 9 - }, - { - "kind": "validation_rule", - "count": 9 - } - ], - "by_scope": [ - { - "scope": "flanged_rotational_part", - "count": 20 - }, - { - "scope": "general_mechanical_part", - "count": 4 - }, - { - "scope": "hollow_or_stepped_shaft", - "count": 15 - }, - { - "scope": "multi_axis_manifold", - "count": 12 - }, - { - "scope": "patterned_plate", - "count": 16 - }, - { - "scope": "patterned_prismatic_part", - "count": 18 - }, - { - "scope": "plate_or_bracket", - "count": 7 - }, - { - "scope": "prismatic_block", - "count": 9 - }, - { - "scope": "rotational_part", - "count": 14 - }, - { - "scope": "shaft", - "count": 15 - } - ], - "candidate_by_kind": [ - { - "kind": "reconstruction_grammar", "count": 2 }, { @@ -101,2168 +43,65 @@ }, "experiences": [ { - "id": "constraint.flanged_rotational_part.coaxial_stack", - "kind": "constraint", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "features": [ - "circular_equal_radius_pattern" - ], - "relations": [ - "coaxial_stack" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 48, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.flanged_rotational_part.common_pattern_radius", - "kind": "constraint", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "features": [ - "circular_equal_radius_pattern" - ], - "relations": [ - "common_pattern_radius" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 48, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.flanged_rotational_part.dominant_axis_alignment", - "kind": "constraint", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "features": [ - "circular_equal_radius_pattern" - ], - "relations": [ - "dominant_axis_alignment" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 48, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.flanged_rotational_part.repeated_radius_group", - "kind": "constraint", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "features": [ - "circular_equal_radius_pattern" - ], - "relations": [ - "repeated_radius_group" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 48, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.flanged_rotational_part.shared_passage_axis", - "kind": "constraint", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "features": [ - "circular_equal_radius_pattern" - ], - "relations": [ - "shared_passage_axis" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 48, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.flanged_rotational_part.transition_axis_continuity", - "kind": "constraint", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "features": [ - "conical_transition" - ], - "relations": [ - "transition_axis_continuity" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 23, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.hollow_or_stepped_shaft.coaxial_stack", - "kind": "constraint", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "features": [ - "central_passage" - ], - "relations": [ - "coaxial_stack" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 46, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.hollow_or_stepped_shaft.dominant_axis_alignment", - "kind": "constraint", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "features": [ - "central_passage" - ], - "relations": [ - "dominant_axis_alignment" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 46, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.hollow_or_stepped_shaft.shared_passage_axis", - "kind": "constraint", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "features": [ - "central_passage" - ], - "relations": [ - "shared_passage_axis" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 46, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.hollow_or_stepped_shaft.transition_axis_continuity", - "kind": "constraint", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "features": [ - "conical_transition" - ], - "relations": [ - "transition_axis_continuity" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 35, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.multi_axis_manifold.multiple_axis_system", - "kind": "constraint", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "features": [ - "compact_body" - ], - "relations": [ - "multiple_axis_system" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 21, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.multi_axis_manifold.shared_passage_axis", - "kind": "constraint", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "features": [ - "stepped_cylindrical_passage" - ], - "relations": [ - "shared_passage_axis" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 21, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_plate.common_pattern_radius", - "kind": "constraint", - "scope": [ - "patterned_plate" - ], - "when": { - "features": [ - "circular_equal_radius_pattern" - ], - "relations": [ - "common_pattern_radius" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 66, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_plate.multiple_axis_system", - "kind": "constraint", - "scope": [ - "patterned_plate" - ], - "when": { - "features": [ - "multi_axis_passage" - ], - "relations": [ - "multiple_axis_system" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 76, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_plate.repeated_radius_group", - "kind": "constraint", - "scope": [ - "patterned_plate" - ], - "when": { - "features": [ - "circular_equal_radius_pattern" - ], - "relations": [ - "repeated_radius_group" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 66, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_plate.shared_passage_axis", - "kind": "constraint", - "scope": [ - "patterned_plate" - ], - "when": { - "features": [ - "stepped_cylindrical_passage" - ], - "relations": [ - "shared_passage_axis" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 108, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_plate.transition_axis_continuity", - "kind": "constraint", - "scope": [ - "patterned_plate" - ], - "when": { - "features": [ - "conical_transition" - ], - "relations": [ - "transition_axis_continuity" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 54, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_prismatic_part.common_pattern_radius", - "kind": "constraint", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "features": [ - "circular_equal_radius_pattern" - ], - "relations": [ - "common_pattern_radius" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 159, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_prismatic_part.multiple_axis_system", - "kind": "constraint", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "features": [ - "multi_axis_passage" - ], - "relations": [ - "multiple_axis_system" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 156, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_prismatic_part.repeated_radius_group", - "kind": "constraint", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "features": [ - "conical_transition" - ], - "relations": [ - "repeated_radius_group" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 87, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_prismatic_part.shared_passage_axis", - "kind": "constraint", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "features": [ - "stepped_cylindrical_passage" - ], - "relations": [ - "shared_passage_axis" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 167, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.patterned_prismatic_part.transition_axis_continuity", - "kind": "constraint", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "features": [ - "conical_transition" - ], - "relations": [ - "transition_axis_continuity" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 87, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.rotational_part.coaxial_stack", + "id": "constraint.rotational_part.shared_dominant_axis", "kind": "constraint", "scope": [ "rotational_part" ], - "when": { - "features": [ - "coaxial_cylindrical_stack" - ], - "relations": [ - "coaxial_stack" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 123, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.rotational_part.dominant_axis_alignment", - "kind": "constraint", - "scope": [ - "rotational_part" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack" - ], - "relations": [ - "dominant_axis_alignment" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 123, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.rotational_part.shared_passage_axis", - "kind": "constraint", - "scope": [ - "rotational_part" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack" - ], - "relations": [ - "shared_passage_axis" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 123, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.rotational_part.transition_axis_continuity", - "kind": "constraint", - "scope": [ - "rotational_part" - ], - "when": { - "features": [ - "conical_transition" - ], - "relations": [ - "transition_axis_continuity" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 59, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.shaft.coaxial_stack", - "kind": "constraint", - "scope": [ - "shaft" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack" - ], - "relations": [ - "coaxial_stack" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 40, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.shaft.dominant_axis_alignment", - "kind": "constraint", - "scope": [ - "shaft" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack" - ], - "relations": [ - "dominant_axis_alignment" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 40, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.shaft.shared_passage_axis", - "kind": "constraint", - "scope": [ - "shaft" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack" - ], - "relations": [ - "shared_passage_axis" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 40, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "constraint.shaft.transition_axis_continuity", - "kind": "constraint", - "scope": [ - "shaft" - ], - "when": { - "features": [ - "conical_transition" - ], - "relations": [ - "transition_axis_continuity" - ] - }, - "guidance": "Preserve this semantic relationship whenever the participating feature roles are instantiated.", - "semantic_rationale": "The relationship remains meaningful when dimensions and feature counts vary.", - "support": 27, - "confidence": 1.0, - "check": "Verify the participating features retain the intended shared geometric relationship." - }, - { - "id": "distribution.flanged_rotational_part.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.01, - "p10": 0.174882, - "median": 0.902597, - "p90": 1.0, - "max": 1.0 - } - }, - { - "id": "distribution.flanged_rotational_part.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.005, - "p10": 0.039066, - "median": 0.275, - "p90": 0.647113, - "max": 0.886752 - } - }, - { - "id": "distribution.flanged_rotational_part.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.024972, - "p10": 0.098071, - "median": 0.315931, - "p90": 0.654045, - "max": 0.790983 - } - }, - { - "id": "distribution.flanged_rotational_part.largest_coaxial_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "largest_coaxial_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.002586, - "p10": 0.094383, - "median": 0.42875, - "p90": 0.5, - "max": 0.657143 - } - }, - { - "id": "distribution.flanged_rotational_part.pattern_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "pattern_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.113333, - "p10": 0.263632, - "median": 0.411932, - "p90": 0.514398, - "max": 0.587836 - } - }, - { - "id": "distribution.flanged_rotational_part.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.139254, - "p10": 0.318228, - "median": 0.680179, - "p90": 0.901929, - "max": 0.975028 - } - }, - { - "id": "distribution.flanged_rotational_part.repeated_feature_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "repeated_feature_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.001172, - "p10": 0.0077, - "median": 0.033654, - "p90": 0.085498, - "max": 0.313751 - } - }, - { - "id": "distribution.flanged_rotational_part.smallest_to_largest_coaxial_radius", - "kind": "dimensionless_distribution", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "smallest_coaxial_radius", - "denominator_role": "largest_coaxial_radius" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.057143, - "p10": 0.17219, - "median": 0.441667, - "p90": 0.782459, - "max": 0.974786 - } - }, - { - "id": "distribution.general_mechanical_part.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "general_mechanical_part" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 20, - "confidence": 1.0, - "distribution": { - "sample_count": 20, - "min": 0.0, - "p10": 0.015724, - "median": 0.112837, - "p90": 0.392145, - "max": 0.866025 - } - }, - { - "id": "distribution.general_mechanical_part.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "general_mechanical_part" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 20, - "confidence": 1.0, - "distribution": { - "sample_count": 20, - "min": 0.0, - "p10": 0.015724, - "median": 0.112837, - "p90": 0.346355, - "max": 0.433013 - } - }, - { - "id": "distribution.general_mechanical_part.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "general_mechanical_part" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 20, - "confidence": 1.0, - "distribution": { - "sample_count": 20, - "min": 0.0, - "p10": 0.690689, - "median": 0.924961, - "p90": 0.985887, - "max": 1.0 - } - }, - { - "id": "distribution.general_mechanical_part.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "general_mechanical_part" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 20, - "confidence": 1.0, - "distribution": { - "sample_count": 20, - "min": 0.0, - "p10": 0.003469, - "median": 0.052351, - "p90": 0.168652, - "max": 0.546904 - } - }, - { - "id": "distribution.hollow_or_stepped_shaft.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 46, - "confidence": 1.0, - "distribution": { - "sample_count": 46, - "min": 0.029762, - "p10": 0.066024, - "median": 0.17739, - "p90": 0.275666, - "max": 0.333333 - } - }, - { - "id": "distribution.hollow_or_stepped_shaft.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 46, - "confidence": 1.0, - "distribution": { - "sample_count": 46, - "min": 0.029762, - "p10": 0.066024, - "median": 0.17739, - "p90": 0.275494, - "max": 0.333333 - } - }, - { - "id": "distribution.hollow_or_stepped_shaft.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 46, - "confidence": 1.0, - "distribution": { - "sample_count": 46, - "min": 0.009277, - "p10": 0.672519, - "median": 0.838041, - "p90": 0.965847, - "max": 0.986218 - } - }, - { - "id": "distribution.hollow_or_stepped_shaft.largest_coaxial_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "ratio": { - "numerator_role": "largest_coaxial_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 46, - "confidence": 1.0, - "distribution": { - "sample_count": 46, - "min": 0.175334, - "p10": 0.5, - "median": 0.5, - "p90": 0.5, - "max": 0.55 - } - }, - { - "id": "distribution.hollow_or_stepped_shaft.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 46, - "confidence": 1.0, - "distribution": { - "sample_count": 46, - "min": 0.013782, - "p10": 0.029085, - "median": 0.110078, - "p90": 0.254798, - "max": 0.328811 - } - }, - { - "id": "distribution.hollow_or_stepped_shaft.smallest_to_largest_coaxial_radius", - "kind": "dimensionless_distribution", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "ratio": { - "numerator_role": "smallest_coaxial_radius", - "denominator_role": "largest_coaxial_radius" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 46, - "confidence": 1.0, - "distribution": { - "sample_count": 46, - "min": 0.14, - "p10": 0.236718, - "median": 0.345513, - "p90": 0.737214, - "max": 0.882353 - } - }, - { - "id": "distribution.multi_axis_manifold.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.018939, - "p10": 0.210295, - "median": 0.545455, - "p90": 0.934131, - "max": 1.0 - } - }, - { - "id": "distribution.multi_axis_manifold.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.0175, - "p10": 0.079546, - "median": 0.3, - "p90": 0.693875, - "max": 0.833333 - } - }, - { - "id": "distribution.multi_axis_manifold.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.009143, - "p10": 0.050841, - "median": 0.132265, - "p90": 0.534539, - "max": 0.864691 - } - }, - { - "id": "distribution.multi_axis_manifold.pattern_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "ratio": { - "numerator_role": "pattern_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 50, - "confidence": 1.0, - "distribution": { - "sample_count": 50, - "min": 0.021429, - "p10": 0.1225, - "median": 0.290119, - "p90": 0.507007, - "max": 1.806003 - } - }, - { - "id": "distribution.multi_axis_manifold.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 55, - "confidence": 1.0, - "distribution": { - "sample_count": 55, - "min": 0.135309, - "p10": 0.351032, - "median": 0.85919, - "p90": 0.949159, - "max": 0.990857 - } - }, - { - "id": "distribution.multi_axis_manifold.repeated_feature_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "ratio": { - "numerator_role": "repeated_feature_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 50, - "confidence": 1.0, - "distribution": { - "sample_count": 50, - "min": 0.003676, - "p10": 0.034035, - "median": 0.090454, - "p90": 0.335473, - "max": 1.900495 - } - }, - { - "id": "distribution.patterned_plate.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_plate" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 209, - "confidence": 1.0, - "distribution": { - "sample_count": 209, - "min": 0.347826, - "p10": 0.395721, - "median": 0.663265, - "p90": 0.971699, - "max": 1.0 - } - }, - { - "id": "distribution.patterned_plate.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_plate" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 209, - "confidence": 1.0, - "distribution": { - "sample_count": 209, - "min": 0.001092, - "p10": 0.017606, - "median": 0.076923, - "p90": 0.15, - "max": 0.214286 - } - }, - { - "id": "distribution.patterned_plate.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_plate" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 209, - "confidence": 1.0, - "distribution": { - "sample_count": 209, - "min": 0.000133, - "p10": 0.012468, - "median": 0.069802, - "p90": 0.191394, - "max": 0.996549 - } - }, - { - "id": "distribution.patterned_plate.pattern_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_plate" - ], - "when": { - "ratio": { - "numerator_role": "pattern_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 209, - "confidence": 1.0, - "distribution": { - "sample_count": 209, - "min": 0.088996, - "p10": 0.25, - "median": 0.388304, - "p90": 0.513597, - "max": 0.643742 - } - }, - { - "id": "distribution.patterned_plate.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_plate" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 209, - "confidence": 1.0, - "distribution": { - "sample_count": 209, - "min": 0.003451, - "p10": 0.801314, - "median": 0.927227, - "p90": 0.983973, - "max": 0.999867 - } - }, - { - "id": "distribution.patterned_plate.repeated_feature_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_plate" - ], - "when": { - "ratio": { - "numerator_role": "repeated_feature_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 209, - "confidence": 1.0, - "distribution": { - "sample_count": 209, - "min": 0.001522, - "p10": 0.00657, - "median": 0.025, - "p90": 0.053303, - "max": 0.304846 - } - }, - { - "id": "distribution.patterned_prismatic_part.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 339, - "confidence": 1.0, - "distribution": { - "sample_count": 339, - "min": 0.009341, - "p10": 0.074884, - "median": 0.365854, - "p90": 0.853398, - "max": 1.0 - } - }, - { - "id": "distribution.patterned_prismatic_part.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 339, - "confidence": 1.0, - "distribution": { - "sample_count": 339, - "min": 0.000667, - "p10": 0.026082, - "median": 0.2, - "p90": 0.506667, - "max": 0.961145 - } - }, - { - "id": "distribution.patterned_prismatic_part.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 339, - "confidence": 1.0, - "distribution": { - "sample_count": 339, - "min": 0.000252, - "p10": 0.024748, - "median": 0.113412, - "p90": 0.299477, - "max": 0.820212 - } - }, - { - "id": "distribution.patterned_prismatic_part.largest_coaxial_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "ratio": { - "numerator_role": "largest_coaxial_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 33, - "confidence": 1.0, - "distribution": { - "sample_count": 33, - "min": 0.00431, - "p10": 0.014977, - "median": 0.0875, - "p90": 0.209382, - "max": 0.45 - } - }, - { - "id": "distribution.patterned_prismatic_part.pattern_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "ratio": { - "numerator_role": "pattern_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 339, - "confidence": 1.0, - "distribution": { - "sample_count": 339, - "min": 0.010638, - "p10": 0.212193, - "median": 0.333599, - "p90": 0.482526, - "max": 0.64955 - } - }, - { - "id": "distribution.patterned_prismatic_part.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 339, - "confidence": 1.0, - "distribution": { - "sample_count": 339, - "min": 0.142723, - "p10": 0.683922, - "median": 0.88492, - "p90": 0.973808, - "max": 0.999748 - } - }, - { - "id": "distribution.patterned_prismatic_part.repeated_feature_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "ratio": { - "numerator_role": "repeated_feature_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 339, - "confidence": 1.0, - "distribution": { - "sample_count": 339, - "min": 0.000833, - "p10": 0.0075, - "median": 0.035, - "p90": 0.111111, - "max": 0.483198 - } - }, - { - "id": "distribution.patterned_prismatic_part.smallest_to_largest_coaxial_radius", - "kind": "dimensionless_distribution", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "ratio": { - "numerator_role": "smallest_coaxial_radius", - "denominator_role": "largest_coaxial_radius" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 33, - "confidence": 1.0, - "distribution": { - "sample_count": 33, - "min": 1.0, - "p10": 1.0, - "median": 1.0, - "p90": 1.0, - "max": 1.0 - } - }, - { - "id": "distribution.plate_or_bracket.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "plate_or_bracket" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 37, - "confidence": 1.0, - "distribution": { - "sample_count": 37, - "min": 0.363636, - "p10": 0.441666, - "median": 0.637255, - "p90": 1.0, - "max": 1.0 - } - }, - { - "id": "distribution.plate_or_bracket.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "plate_or_bracket" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 37, - "confidence": 1.0, - "distribution": { - "sample_count": 37, - "min": 0.002381, - "p10": 0.00639, - "median": 0.045455, - "p90": 0.149714, - "max": 0.214286 - } - }, - { - "id": "distribution.plate_or_bracket.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "plate_or_bracket" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 37, - "confidence": 1.0, - "distribution": { - "sample_count": 37, - "min": 0.0, - "p10": 0.0, - "median": 0.0, - "p90": 0.039962, - "max": 0.253783 - } - }, - { - "id": "distribution.plate_or_bracket.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "plate_or_bracket" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 37, - "confidence": 1.0, - "distribution": { - "sample_count": 37, - "min": 0.746217, - "p10": 0.958585, - "median": 1.0, - "p90": 1.0, - "max": 1.0 - } - }, - { - "id": "distribution.prismatic_block.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "prismatic_block" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 72, - "confidence": 1.0, - "distribution": { - "sample_count": 72, - "min": 0.009231, - "p10": 0.050836, - "median": 0.401005, - "p90": 0.866025, - "max": 1.0 - } - }, - { - "id": "distribution.prismatic_block.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "prismatic_block" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 72, - "confidence": 1.0, - "distribution": { - "sample_count": 72, - "min": 0.0, - "p10": 0.010426, - "median": 0.2008, - "p90": 0.545129, - "max": 0.95 - } - }, - { - "id": "distribution.prismatic_block.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "prismatic_block" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 72, - "confidence": 1.0, - "distribution": { - "sample_count": 72, - "min": 0.0, - "p10": 0.0, - "median": 0.030749, - "p90": 0.238869, - "max": 0.351376 - } - }, - { - "id": "distribution.prismatic_block.pattern_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "prismatic_block" - ], - "when": { - "ratio": { - "numerator_role": "pattern_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 25, - "confidence": 1.0, - "distribution": { - "sample_count": 25, - "min": 0.027273, - "p10": 0.070947, - "median": 0.324561, - "p90": 0.60353, - "max": 0.707107 - } - }, - { - "id": "distribution.prismatic_block.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "prismatic_block" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 72, - "confidence": 1.0, - "distribution": { - "sample_count": 72, - "min": 0.60741, - "p10": 0.678579, - "median": 0.963402, - "p90": 1.0, - "max": 1.0 - } - }, - { - "id": "distribution.prismatic_block.repeated_feature_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "prismatic_block" - ], - "when": { - "ratio": { - "numerator_role": "repeated_feature_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 25, - "confidence": 1.0, - "distribution": { - "sample_count": 25, - "min": 0.006932, - "p10": 0.015009, - "median": 0.08, - "p90": 0.245733, - "max": 1.0 - } - }, - { - "id": "distribution.rotational_part.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 123, - "confidence": 1.0, - "distribution": { - "sample_count": 123, - "min": 0.333507, - "p10": 0.393271, - "median": 1.0, - "p90": 1.0, - "max": 1.0 - } - }, - { - "id": "distribution.rotational_part.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 123, - "confidence": 1.0, - "distribution": { - "sample_count": 123, - "min": 0.033654, - "p10": 0.125, - "median": 0.410256, - "p90": 0.830952, - "max": 1.0 - } - }, - { - "id": "distribution.rotational_part.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 123, - "confidence": 1.0, - "distribution": { - "sample_count": 123, - "min": 0.079284, - "p10": 0.224996, - "median": 0.541667, - "p90": 0.817692, - "max": 0.977011 - } - }, - { - "id": "distribution.rotational_part.largest_coaxial_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "largest_coaxial_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 123, - "confidence": 1.0, - "distribution": { - "sample_count": 123, - "min": 0.13, - "p10": 0.405553, - "median": 0.5, - "p90": 0.5, - "max": 0.5 - } - }, - { - "id": "distribution.rotational_part.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 123, - "confidence": 1.0, - "distribution": { - "sample_count": 123, - "min": 0.01974, - "p10": 0.143071, - "median": 0.33689, - "p90": 0.664368, - "max": 0.88406 - } - }, - { - "id": "distribution.rotational_part.smallest_to_largest_coaxial_radius", - "kind": "dimensionless_distribution", - "scope": [ - "rotational_part" - ], - "when": { - "ratio": { - "numerator_role": "smallest_coaxial_radius", - "denominator_role": "largest_coaxial_radius" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 123, - "confidence": 1.0, - "distribution": { - "sample_count": 123, - "min": 0.092308, - "p10": 0.23, - "median": 0.480389, - "p90": 0.813062, - "max": 0.95 - } - }, - { - "id": "distribution.shaft.bbox_middle_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "shaft" - ], - "when": { - "ratio": { - "numerator_role": "middle_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 40, - "confidence": 1.0, - "distribution": { - "sample_count": 40, - "min": 0.03871, - "p10": 0.052165, - "median": 0.15095, - "p90": 0.302, - "max": 0.333333 - } - }, - { - "id": "distribution.shaft.bbox_short_to_long", - "kind": "dimensionless_distribution", - "scope": [ - "shaft" - ], - "when": { - "ratio": { - "numerator_role": "short_bounding_span", - "denominator_role": "long_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 40, - "confidence": 1.0, - "distribution": { - "sample_count": 40, - "min": 0.03871, - "p10": 0.052165, - "median": 0.149074, - "p90": 0.287143, - "max": 0.333333 - } - }, - { - "id": "distribution.shaft.cylindrical_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "shaft" - ], - "when": { - "ratio": { - "numerator_role": "cylindrical_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 40, - "confidence": 1.0, - "distribution": { - "sample_count": 40, - "min": 0.084584, - "p10": 0.316214, - "median": 0.917311, - "p90": 0.96565, - "max": 0.996933 - } - }, - { - "id": "distribution.shaft.largest_coaxial_radius_to_transverse_span", - "kind": "dimensionless_distribution", - "scope": [ - "shaft" - ], - "when": { - "ratio": { - "numerator_role": "largest_coaxial_radius", - "denominator_role": "transverse_bounding_span" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 40, - "confidence": 1.0, - "distribution": { - "sample_count": 40, - "min": 0.13125, - "p10": 0.363481, - "median": 0.5, - "p90": 0.5, - "max": 0.5 - } - }, - { - "id": "distribution.shaft.planar_area_fraction", - "kind": "dimensionless_distribution", - "scope": [ - "shaft" - ], - "when": { - "ratio": { - "numerator_role": "planar_surface_area", - "denominator_role": "total_surface_area" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 40, - "confidence": 1.0, - "distribution": { - "sample_count": 40, - "min": 0.003067, - "p10": 0.021978, - "median": 0.067524, - "p90": 0.571665, - "max": 0.908523 - } - }, - { - "id": "distribution.shaft.smallest_to_largest_coaxial_radius", - "kind": "dimensionless_distribution", - "scope": [ - "shaft" - ], - "when": { - "ratio": { - "numerator_role": "smallest_coaxial_radius", - "denominator_role": "largest_coaxial_radius" - } - }, - "guidance": "Use the learned dimensionless range only when the user leaves the corresponding relationship unspecified.", - "semantic_rationale": "A normalized relationship transfers across scale while explicit user dimensions remain authoritative.", - "support": 40, - "confidence": 1.0, - "distribution": { - "sample_count": 40, - "min": 0.2, - "p10": 0.32825, - "median": 0.666667, - "p90": 0.93875, - "max": 0.96 - } - }, - { - "id": "motif.flanged_rotational_part.coaxial_cylindrical_stack+stepped_cylindrical_passage", - "kind": "feature_motif", - "scope": [ - "flanged_rotational_part" - ], "when": { "features": [ "coaxial_cylindrical_stack", - "stepped_cylindrical_passage" + "rotational_body" ], - "relations": [] + "relations": [ + "dominant_axis_alignment" + ] }, - "guidance": "Treat the participating feature roles as one coordinated composition rather than unrelated primitives.", - "semantic_rationale": "The composition recurs across independent dimensional variants in the same family.", - "support": 55, - "confidence": 1.0 + "guidance": "Preserve the dominant axis as the organizing datum for rotational feature roles.", + "semantic_rationale": "The datum transfers because axis alignment is independent of the individual component dimensions.", + "support": 2, + "confidence": 1.0, + "check": "Confirm that rotational feature roles remain aligned to the same organizing datum.", + "promotion_state": "candidate", + "required_support": 20, + "remaining_support": 18, + "required_confidence": 0.8, + "consumer_policy": "visible_for_review_but_not_available_to_cad_router" }, { - "id": "motif.flanged_rotational_part.planar_dominant_body+multi_level_planar_profile", + "id": "motif.rotational_part.coaxial_core_with_center_passage", "kind": "feature_motif", "scope": [ - "flanged_rotational_part" + "rotational_part" ], "when": { "features": [ - "multi_level_planar_profile", - "planar_dominant_body" + "circular_equal_radius_pattern" ], - "relations": [] + "relations": [ + "shared_passage_axis" + ] }, - "guidance": "Treat the participating feature roles as one coordinated composition rather than unrelated primitives.", - "semantic_rationale": "The composition recurs across independent dimensional variants in the same family.", - "support": 29, - "confidence": 1.0 + "guidance": "Treat the rotational body, coaxial cylindrical stack, and central passage as one shared-axis core.", + "semantic_rationale": "The relationship transfers because the participating roles describe axis organization rather than a particular size.", + "support": 2, + "confidence": 1.0, + "check": "Confirm that the rotational body, stacked cylindrical roles, and central passage retain their intended common axis.", + "promotion_state": "candidate", + "required_support": 20, + "remaining_support": 18, + "required_confidence": 0.8, + "consumer_policy": "visible_for_review_but_not_available_to_cad_router" }, { - "id": "motif.flanged_rotational_part.repeated_axial_hole_pattern+circular_equal_radius_pattern", + "id": "motif.rotational_part.patterned_axial_mounting", "kind": "feature_motif", "scope": [ - "flanged_rotational_part" + "rotational_part" ], "when": { "features": [ - "circular_equal_radius_pattern", - "repeated_axial_hole_pattern" - ], - "relations": [] - }, - "guidance": "Treat the participating feature roles as one coordinated composition rather than unrelated primitives.", - "semantic_rationale": "The composition recurs across independent dimensional variants in the same family.", - "support": 48, - "confidence": 1.0 - }, - { - "id": "motif.flanged_rotational_part.rotational_body+coaxial_cylindrical_stack", - "kind": "feature_motif", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack", + "repeated_axial_hole_pattern", "rotational_body" ], "relations": [] @@ -2612,1513 +451,42 @@ "rotational_body", "stepped_cylindrical_passage" ], - "relations": [ - "coaxial_stack", - "common_pattern_radius", - "dominant_axis_alignment", - "repeated_radius_group", - "shared_passage_axis" - ] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 37, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "axial_segment_length_roles", - "coaxial_diameter_roles", - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "passage_axis_offset_roles", - "passage_diameter_roles", - "passage_extent_roles", - "pattern_angular_or_linear_phase_role", - "pattern_member_diameter_role", - "pattern_radius_or_spacing_role", - "planar_level_offset_roles", - "primary_axis_span", - "primary_transverse_span", - "profile_length_roles", - "profile_width_roles", - "secondary_transverse_span", - "shoulder_position_roles" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "circular_equal_radius_pattern", - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "multi_level_planar_profile", - "repeated_axial_hole_pattern", - "rotational_body", - "stepped_cylindrical_passage" - ], - "relation_roles": [ - "coaxial_stack", - "common_pattern_radius", - "dominant_axis_alignment", - "repeated_radius_group", - "shared_passage_axis" - ], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "revolve_profile", - "feature_roles": [ - "rotational_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "establish_planar_levels", - "operation": "add_or_remove_profile_levels", - "feature_roles": [ - "multi_level_planar_profile" - ], - "reference_roles": [ - "primary_transverse_plane" - ] - }, - { - "id": "construct_coaxial_stack", - "operation": "add_or_cut_coaxial_profiles", - "feature_roles": [ - "coaxial_cylindrical_stack" - ], - "reference_roles": [ - "primary_axis" - ] - }, - { - "id": "construct_passage_network", - "operation": "cut_semantic_passages", - "feature_roles": [ - "cylindrical_feature_network", - "stepped_cylindrical_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "construct_repeated_feature_pattern", - "operation": "pattern_semantic_feature", - "feature_roles": [ - "circular_equal_radius_pattern", - "repeated_axial_hole_pattern" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "circular_equal_radius_pattern", - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "multi_level_planar_profile", - "repeated_axial_hole_pattern", - "rotational_body", - "stepped_cylindrical_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "coaxial_stack", - "common_pattern_radius", - "dominant_axis_alignment", - "repeated_radius_group", - "shared_passage_axis", - "surface_mix_consistency" - ] - } - }, - { - "id": "reconstruction.hollow_or_stepped_shaft.primary", - "kind": "reconstruction_grammar", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "elongated_body", - "multi_level_planar_profile", - "rotational_body", - "stepped_cylindrical_passage" - ], - "relations": [ - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis" - ] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 39, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "axial_segment_length_roles", - "coaxial_diameter_roles", - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "passage_axis_offset_roles", - "passage_diameter_roles", - "passage_extent_roles", - "planar_level_offset_roles", - "primary_axis_span", - "primary_transverse_span", - "profile_length_roles", - "profile_width_roles", - "secondary_transverse_span", - "shoulder_position_roles" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "elongated_body", - "multi_level_planar_profile", - "rotational_body", - "stepped_cylindrical_passage" - ], - "relation_roles": [ - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis" - ], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "revolve_profile", - "feature_roles": [ - "elongated_body", - "rotational_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "establish_planar_levels", - "operation": "add_or_remove_profile_levels", - "feature_roles": [ - "multi_level_planar_profile" - ], - "reference_roles": [ - "primary_transverse_plane" - ] - }, - { - "id": "construct_coaxial_stack", - "operation": "add_or_cut_coaxial_profiles", - "feature_roles": [ - "coaxial_cylindrical_stack" - ], - "reference_roles": [ - "primary_axis" - ] - }, - { - "id": "construct_passage_network", - "operation": "cut_semantic_passages", - "feature_roles": [ - "cylindrical_feature_network", - "stepped_cylindrical_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "elongated_body", - "multi_level_planar_profile", - "rotational_body", - "stepped_cylindrical_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis", - "surface_mix_consistency" - ] - } - }, - { - "id": "reconstruction.multi_axis_manifold.primary", - "kind": "reconstruction_grammar", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "features": [ - "cylindrical_feature_network", - "multi_axis_passage", - "multi_level_planar_profile", - "planar_dominant_body" - ], - "relations": [ - "multiple_axis_system" - ] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 44, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "passage_axis_offset_roles", - "passage_diameter_roles", - "passage_extent_roles", - "planar_level_offset_roles", - "primary_axis_span", - "primary_transverse_span", - "profile_length_roles", - "profile_width_roles", - "secondary_transverse_span" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "cylindrical_feature_network", - "multi_axis_passage", - "multi_level_planar_profile", - "planar_dominant_body" - ], - "relation_roles": [ - "multiple_axis_system" - ], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "extrude_profile", - "feature_roles": [ - "planar_dominant_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "establish_planar_levels", - "operation": "add_or_remove_profile_levels", - "feature_roles": [ - "multi_level_planar_profile" - ], - "reference_roles": [ - "primary_transverse_plane" - ] - }, - { - "id": "construct_passage_network", - "operation": "cut_semantic_passages", - "feature_roles": [ - "cylindrical_feature_network", - "multi_axis_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "cylindrical_feature_network", - "multi_axis_passage", - "multi_level_planar_profile", - "planar_dominant_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "multiple_axis_system", - "surface_mix_consistency" - ] - } - }, - { - "id": "reconstruction.patterned_plate.primary", - "kind": "reconstruction_grammar", - "scope": [ - "patterned_plate" - ], - "when": { - "features": [ - "cylindrical_feature_network", - "multi_level_planar_profile", - "planar_dominant_body", - "plate_like_body", - "repeated_axial_hole_pattern" - ], "relations": [ "repeated_radius_group" ] }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 202, + "guidance": "Represent repeated axial holes as a symmetric mounting pattern tied to the rotational body.", + "semantic_rationale": "The motif remains useful across variants because it captures repeated functional placement around a rotational form.", + "support": 2, "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "passage_axis_offset_roles", - "passage_diameter_roles", - "passage_extent_roles", - "pattern_angular_or_linear_phase_role", - "pattern_member_diameter_role", - "pattern_radius_or_spacing_role", - "planar_level_offset_roles", - "primary_axis_span", - "primary_transverse_span", - "profile_length_roles", - "profile_width_roles", - "secondary_transverse_span" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "cylindrical_feature_network", - "multi_level_planar_profile", - "planar_dominant_body", - "plate_like_body", - "repeated_axial_hole_pattern" - ], - "relation_roles": [ - "repeated_radius_group" - ], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "extrude_profile", - "feature_roles": [ - "planar_dominant_body", - "plate_like_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "establish_planar_levels", - "operation": "add_or_remove_profile_levels", - "feature_roles": [ - "multi_level_planar_profile" - ], - "reference_roles": [ - "primary_transverse_plane" - ] - }, - { - "id": "construct_passage_network", - "operation": "cut_semantic_passages", - "feature_roles": [ - "cylindrical_feature_network" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "construct_repeated_feature_pattern", - "operation": "pattern_semantic_feature", - "feature_roles": [ - "repeated_axial_hole_pattern" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "cylindrical_feature_network", - "multi_level_planar_profile", - "planar_dominant_body", - "plate_like_body", - "repeated_axial_hole_pattern" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "repeated_radius_group", - "surface_mix_consistency" - ] - } + "check": "Confirm that repeated axial holes remain grouped consistently around the rotational body.", + "promotion_state": "candidate", + "required_support": 20, + "remaining_support": 18, + "required_confidence": 0.8, + "consumer_policy": "visible_for_review_but_not_available_to_cad_router" }, { - "id": "reconstruction.patterned_prismatic_part.primary", - "kind": "reconstruction_grammar", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "features": [ - "cylindrical_feature_network", - "multi_level_planar_profile", - "planar_dominant_body", - "repeated_axial_hole_pattern" - ], - "relations": [ - "repeated_radius_group" - ] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 323, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "passage_axis_offset_roles", - "passage_diameter_roles", - "passage_extent_roles", - "pattern_angular_or_linear_phase_role", - "pattern_member_diameter_role", - "pattern_radius_or_spacing_role", - "planar_level_offset_roles", - "primary_axis_span", - "primary_transverse_span", - "profile_length_roles", - "profile_width_roles", - "secondary_transverse_span" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "cylindrical_feature_network", - "multi_level_planar_profile", - "planar_dominant_body", - "repeated_axial_hole_pattern" - ], - "relation_roles": [ - "repeated_radius_group" - ], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "extrude_profile", - "feature_roles": [ - "planar_dominant_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "establish_planar_levels", - "operation": "add_or_remove_profile_levels", - "feature_roles": [ - "multi_level_planar_profile" - ], - "reference_roles": [ - "primary_transverse_plane" - ] - }, - { - "id": "construct_passage_network", - "operation": "cut_semantic_passages", - "feature_roles": [ - "cylindrical_feature_network" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "construct_repeated_feature_pattern", - "operation": "pattern_semantic_feature", - "feature_roles": [ - "repeated_axial_hole_pattern" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "cylindrical_feature_network", - "multi_level_planar_profile", - "planar_dominant_body", - "repeated_axial_hole_pattern" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "repeated_radius_group", - "surface_mix_consistency" - ] - } - }, - { - "id": "reconstruction.plate_or_bracket.primary", - "kind": "reconstruction_grammar", - "scope": [ - "plate_or_bracket" - ], - "when": { - "features": [ - "multi_level_planar_profile", - "planar_dominant_body", - "plate_like_body" - ], - "relations": [] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 35, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "planar_level_offset_roles", - "primary_axis_span", - "primary_transverse_span", - "profile_length_roles", - "profile_width_roles", - "secondary_transverse_span" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "multi_level_planar_profile", - "planar_dominant_body", - "plate_like_body" - ], - "relation_roles": [], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "extrude_profile", - "feature_roles": [ - "planar_dominant_body", - "plate_like_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "establish_planar_levels", - "operation": "add_or_remove_profile_levels", - "feature_roles": [ - "multi_level_planar_profile" - ], - "reference_roles": [ - "primary_transverse_plane" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "multi_level_planar_profile", - "planar_dominant_body", - "plate_like_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "surface_mix_consistency" - ] - } - }, - { - "id": "reconstruction.prismatic_block.primary", - "kind": "reconstruction_grammar", - "scope": [ - "prismatic_block" - ], - "when": { - "features": [ - "multi_level_planar_profile", - "planar_dominant_body" - ], - "relations": [] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 67, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "planar_level_offset_roles", - "primary_axis_span", - "primary_transverse_span", - "profile_length_roles", - "profile_width_roles", - "secondary_transverse_span" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "multi_level_planar_profile", - "planar_dominant_body" - ], - "relation_roles": [], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "extrude_profile", - "feature_roles": [ - "planar_dominant_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "establish_planar_levels", - "operation": "add_or_remove_profile_levels", - "feature_roles": [ - "multi_level_planar_profile" - ], - "reference_roles": [ - "primary_transverse_plane" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "multi_level_planar_profile", - "planar_dominant_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "surface_mix_consistency" - ] - } - }, - { - "id": "reconstruction.rotational_part.primary", - "kind": "reconstruction_grammar", - "scope": [ - "rotational_part" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "rotational_body", - "stepped_cylindrical_passage" - ], - "relations": [ - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis" - ] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 123, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "axial_segment_length_roles", - "coaxial_diameter_roles", - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "passage_axis_offset_roles", - "passage_diameter_roles", - "passage_extent_roles", - "primary_axis_span", - "primary_transverse_span", - "secondary_transverse_span", - "shoulder_position_roles" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "rotational_body", - "stepped_cylindrical_passage" - ], - "relation_roles": [ - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis" - ], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "revolve_profile", - "feature_roles": [ - "rotational_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "construct_coaxial_stack", - "operation": "add_or_cut_coaxial_profiles", - "feature_roles": [ - "coaxial_cylindrical_stack" - ], - "reference_roles": [ - "primary_axis" - ] - }, - { - "id": "construct_passage_network", - "operation": "cut_semantic_passages", - "feature_roles": [ - "cylindrical_feature_network", - "stepped_cylindrical_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "rotational_body", - "stepped_cylindrical_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis", - "surface_mix_consistency" - ] - } - }, - { - "id": "reconstruction.shaft.primary", - "kind": "reconstruction_grammar", - "scope": [ - "shaft" - ], - "when": { - "features": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "elongated_body", - "rotational_body", - "stepped_cylindrical_passage" - ], - "relations": [ - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis" - ] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 40, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "axial_segment_length_roles", - "coaxial_diameter_roles", - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "passage_axis_offset_roles", - "passage_diameter_roles", - "passage_extent_roles", - "primary_axis_span", - "primary_transverse_span", - "secondary_transverse_span", - "shoulder_position_roles" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "elongated_body", - "rotational_body", - "stepped_cylindrical_passage" - ], - "relation_roles": [ - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis" - ], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "revolve_profile", - "feature_roles": [ - "elongated_body", - "rotational_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "construct_coaxial_stack", - "operation": "add_or_cut_coaxial_profiles", - "feature_roles": [ - "coaxial_cylindrical_stack" - ], - "reference_roles": [ - "primary_axis" - ] - }, - { - "id": "construct_passage_network", - "operation": "cut_semantic_passages", - "feature_roles": [ - "cylindrical_feature_network", - "stepped_cylindrical_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "coaxial_cylindrical_stack", - "cylindrical_feature_network", - "elongated_body", - "rotational_body", - "stepped_cylindrical_passage" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "coaxial_stack", - "dominant_axis_alignment", - "shared_passage_axis", - "surface_mix_consistency" - ] - } - }, - { - "id": "validation.flanged_rotational_part.family_structure", - "kind": "validation_rule", - "scope": [ - "flanged_rotational_part" - ], - "when": { - "features": [ - "rotational_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 55, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - }, - { - "id": "validation.hollow_or_stepped_shaft.family_structure", - "kind": "validation_rule", - "scope": [ - "hollow_or_stepped_shaft" - ], - "when": { - "features": [ - "rotational_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 46, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - }, - { - "id": "validation.multi_axis_manifold.family_structure", - "kind": "validation_rule", - "scope": [ - "multi_axis_manifold" - ], - "when": { - "features": [ - "planar_dominant_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 44, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - }, - { - "id": "validation.patterned_plate.family_structure", - "kind": "validation_rule", - "scope": [ - "patterned_plate" - ], - "when": { - "features": [ - "planar_dominant_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 207, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - }, - { - "id": "validation.patterned_prismatic_part.family_structure", - "kind": "validation_rule", - "scope": [ - "patterned_prismatic_part" - ], - "when": { - "features": [ - "planar_dominant_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 324, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - }, - { - "id": "validation.plate_or_bracket.family_structure", - "kind": "validation_rule", - "scope": [ - "plate_or_bracket" - ], - "when": { - "features": [ - "planar_dominant_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 37, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - }, - { - "id": "validation.prismatic_block.family_structure", - "kind": "validation_rule", - "scope": [ - "prismatic_block" - ], - "when": { - "features": [ - "planar_dominant_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 72, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - }, - { - "id": "validation.rotational_part.family_structure", + "id": "validation.rotational_part.axis_and_pattern_consistency", "kind": "validation_rule", "scope": [ "rotational_part" ], "when": { "features": [ - "rotational_body" + "central_passage", + "repeated_axial_hole_pattern" ], "relations": [] }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 123, + "guidance": "Validate both the shared rotational axis and the grouped repeated-hole relationship before handoff.", + "semantic_rationale": "These checks protect transferable intent without relying on instance geometry.", + "support": 2, "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - }, - { - "id": "validation.shaft.family_structure", - "kind": "validation_rule", - "scope": [ - "shaft" - ], - "when": { - "features": [ - "rotational_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 40, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships." - } - ], - "candidate_experiences": [ - { - "id": "reconstruction.general_mechanical_part.primary", - "kind": "reconstruction_grammar", - "scope": [ - "general_mechanical_part" - ], - "when": { - "features": [ - "cylindrical_feature_network", - "elongated_body" - ], - "relations": [] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 16, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "passage_axis_offset_roles", - "passage_diameter_roles", - "passage_extent_roles", - "primary_axis_span", - "primary_transverse_span", - "secondary_transverse_span" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [ - "cylindrical_feature_network", - "elongated_body" - ], - "relation_roles": [], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "extrude_profile", - "feature_roles": [ - "elongated_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "construct_passage_network", - "operation": "cut_semantic_passages", - "feature_roles": [ - "cylindrical_feature_network" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [ - "cylindrical_feature_network", - "elongated_body" - ], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "surface_mix_consistency" - ] - }, + "check": "Confirm shared-axis alignment and repeated-hole grouping before treating the model as ready.", "promotion_state": "candidate", "required_support": 20, - "remaining_support": 4, - "required_confidence": 0.8, - "consumer_policy": "visible_for_review_but_not_available_to_cad_router" - }, - { - "id": "reconstruction.hybrid_freeform_part.primary", - "kind": "reconstruction_grammar", - "scope": [ - "hybrid_freeform_part" - ], - "when": { - "features": [], - "relations": [] - }, - "guidance": "Establish semantic datums and a primary envelope before composing passages, repeated features, and finishing regions.", - "semantic_rationale": "The symbolic reconstruction stages preserve family structure while allowing every dimension to vary.", - "support": 4, - "confidence": 1.0, - "check": "Confirm the reconstructed part preserves the requested feature roles, datum relationships, and closed solid topology.", - "reconstruction_grammar": { - "parameter_roles": [ - "overall_long_span", - "overall_middle_span", - "overall_short_span", - "primary_axis_span", - "primary_transverse_span", - "secondary_transverse_span" - ], - "datum_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ], - "feature_roles": [], - "relation_roles": [], - "canonical_stages": [ - { - "id": "establish_reference_frame", - "operation": "define_datums", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis", - "primary_transverse_plane", - "secondary_transverse_plane" - ] - }, - { - "id": "construct_primary_envelope", - "operation": "extrude_profile", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis" - ] - }, - { - "id": "validate_reconstructed_shape", - "operation": "validate_geometry_and_relations", - "feature_roles": [], - "reference_roles": [ - "part_center", - "primary_axis" - ] - } - ], - "cardinality_classes": [], - "validation_roles": [ - "bounding_proportion_consistency", - "closed_solid", - "surface_mix_consistency" - ] - }, - "promotion_state": "candidate", - "required_support": 20, - "remaining_support": 16, - "required_confidence": 0.8, - "consumer_policy": "visible_for_review_but_not_available_to_cad_router" - }, - { - "id": "validation.general_mechanical_part.family_structure", - "kind": "validation_rule", - "scope": [ - "general_mechanical_part" - ], - "when": { - "features": [ - "elongated_body" - ], - "relations": [] - }, - "guidance": "Validate the family envelope, feature-role presence, datum relationships, and solid topology together.", - "semantic_rationale": "Joint validation catches structurally wrong reconstructions that isolated dimension checks can miss.", - "support": 16, - "confidence": 1.0, - "check": "Confirm a closed solid with the expected family envelope, feature roles, and datum relationships.", - "promotion_state": "candidate", - "required_support": 20, - "remaining_support": 4, + "remaining_support": 18, "required_confidence": 0.8, "consumer_policy": "visible_for_review_but_not_available_to_cad_router" } diff --git a/text-to-cad/.gitignore b/text-to-cad/.gitignore index 0ab7bad..d8d6253 100644 --- a/text-to-cad/.gitignore +++ b/text-to-cad/.gitignore @@ -20,6 +20,7 @@ htmlcov/ .agents/ .vite node_modules +.next dist coverage @@ -34,6 +35,8 @@ coverage *.step.glb.lock *.stp.glb.lock tmp/ +models/ +models/agent-studio/ # Local printer credentials /bambu-printers.json diff --git a/text-to-cad/apps/cad-agent-studio/README.md b/text-to-cad/apps/cad-agent-studio/README.md new file mode 100644 index 0000000..3a4cecb --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/README.md @@ -0,0 +1,50 @@ +# CAD Agent Studio + +CAD Agent Studio is a two-pane web app for agent-driven CAD work: + +- left pane: agent chat, uploads, provider/model selection, and Viewer context cards +- right pane: embedded 3D preview and CAD edit toolbar + +## Setup + +Configure providers in `../../config/llm.config.yaml`. Prefer putting secrets in +the environment: + +```bash +OPENAI_API_KEY=... +OPENAI_BASE_URL=https://api.openai.com/v1 +DEEPSEEK_API_KEY=... +``` + +`OPENAI_BASE_URL` can point at an OpenAI-compatible third-party endpoint. + +For local-only setups, providers may also use `apiKey: sk-...` directly in the +YAML. If `apiKeyEnv` accidentally contains a key value instead of an environment +variable name, the server treats it as a direct key for compatibility. + +## Run + +```bash +npm install +npm run dev -- -H 127.0.0.1 -p 53821 +``` + +Open `http://127.0.0.1:53821`. + +## CAD Flow + +Uploads are stored under `../../models/agent-studio/`. STEP/STP uploads +write a `cad-task.json` manifest and are converted to an STL preview sidecar +for the embedded right-pane WebGL renderer. + +CAD Agent Studio does not start the standalone CAD Viewer service. Generated +models keep STEP as the primary CAD artifact and export STL as a preview mesh. +The right-pane toolbar mirrors the CAD Viewer edit tool set and interaction +shape, but tool picks are attached to the next agent request as structured +`cadViewer.editIntent` / `cadViewer.selection` context instead of being copied +to the clipboard. The handoff is silent in the UI: no success modal, no copied +text panel. + +Modification requests create revision folders with `edit-request.json`. The +generation adapter should apply that request to the editable source recorded in +`cad-task.json`; STEP-only uploads are marked as reconstructed edits. diff --git a/text-to-cad/apps/cad-agent-studio/agent.md b/text-to-cad/apps/cad-agent-studio/agent.md new file mode 100644 index 0000000..550da4b --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/agent.md @@ -0,0 +1,9 @@ +# CAD Agent Studio Agent Rules + +- 必须严格执行真实 agent 生成流程。任何 CAD 生成或修改都必须由模型调用服务端工具完成,并在工具成功写出真实 artifact 后才允许告诉用户“已生成”。 +- 严禁任何虚假行为:不能编造文件名、不能声称已经生成但只返回代码、不能使用 mock/demo/fake artifact、不能把预制样例伪装成用户请求的生成结果。 +- 严禁为具体零件写硬编码生成分支或关键词模板,例如根据“法兰”“连杆”等关键词直接走固定源码。零件几何必须由 agent 针对当前用户上下文实时生成源码并交给工具执行。 +- 如果模型没有调用生成工具、工具执行失败、STEP/STL 文件为空或不存在,必须明确说明没有生成成功,不得触发右侧预览。 +- 普通聊天、确认、说明、提问不得自动生成 CAD。只有明确的 CAD 生成/修改意图,或用户确认上一轮 agent 明确提出的 CAD 生成方案时,才可以调用生成工具。 +- STEP 是主 CAD artifact;STL/GLB 只能作为页面预览或可视化 sidecar。后续修改应优先基于 `cad-task.json` 中记录的 editable source。 +- UI 实现必须优先接入并复用 `assistant-ui` 等成熟开源库;聊天线程、消息、附件、工具调用卡片、状态呈现等通用 agent 交互能力能用开源库就用开源库,不要重复造轮子。只有项目特有的 CAD Viewer、CAD artifact、拓扑选择和生成/修改流程才自定义实现。 diff --git a/text-to-cad/apps/cad-agent-studio/next-env.d.ts b/text-to-cad/apps/cad-agent-studio/next-env.d.ts new file mode 100644 index 0000000..c4b7818 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +import "./.next/dev/types/routes.d.ts"; + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/text-to-cad/apps/cad-agent-studio/next.config.ts b/text-to-cad/apps/cad-agent-studio/next.config.ts new file mode 100644 index 0000000..4bbe600 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/next.config.ts @@ -0,0 +1,42 @@ +import type { NextConfig } from "next"; +import path from "node:path"; + +const appRoot = __dirname; +const repoRoot = path.resolve(appRoot, "../.."); +const viewerRoot = path.join(repoRoot, "viewer"); +const viewerNodeModules = path.join(viewerRoot, "node_modules"); +const cadJsSrc = path.join(appRoot, "src", "viewer-cadjs"); + +const nextConfig: NextConfig = { + allowedDevOrigins: ["127.0.0.1", "localhost"], + transpilePackages: ["cadjs", "three", "three-mesh-bvh"], + turbopack: { + resolveAlias: { + cadjs: "./src/viewer-cadjs", + three: "./node_modules/three", + "three/examples": "./node_modules/three/examples", + "three-mesh-bvh": "./node_modules/three-mesh-bvh", + gifenc: "./node_modules/gifenc/dist/gifenc.esm.js", + }, + resolveExtensions: [".tsx", ".ts", ".jsx", ".js", ".mjs", ".json"], + }, + webpack(config) { + config.resolve = config.resolve || {}; + config.resolve.alias = { + ...(config.resolve.alias || {}), + cadjs: cadJsSrc, + three: path.join(viewerNodeModules, "three"), + "three/examples": path.join(viewerNodeModules, "three", "examples"), + "three-mesh-bvh": path.join(viewerNodeModules, "three-mesh-bvh"), + gifenc: path.join(viewerNodeModules, "gifenc", "dist", "gifenc.esm.js"), + }; + config.resolve.extensions = [ + ...(config.resolve.extensions || []), + ".js", + ".mjs", + ]; + return config; + }, +}; + +export default nextConfig; diff --git a/text-to-cad/apps/cad-agent-studio/package-lock.json b/text-to-cad/apps/cad-agent-studio/package-lock.json new file mode 100644 index 0000000..7a37a96 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/package-lock.json @@ -0,0 +1,4692 @@ +{ + "name": "cad-agent-studio", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cad-agent-studio", + "version": "0.1.0", + "dependencies": { + "@ai-sdk/openai": "latest", + "@ai-sdk/openai-compatible": "latest", + "@ai-sdk/react": "latest", + "@assistant-ui/react": "latest", + "@assistant-ui/react-ai-sdk": "latest", + "ai": "latest", + "animejs": "^4.5.0", + "cadjs": "file:../../viewer/packages/cadjs", + "clsx": "^2.1.1", + "gifenc": "file:../../viewer/node_modules/gifenc", + "lucide-react": "^1.14.0", + "next": "16.2.6", + "react": "19.2.4", + "react-dom": "19.2.4", + "tailwind-merge": "^3.5.0", + "three": "file:../../viewer/node_modules/three", + "three-mesh-bvh": "file:../../viewer/node_modules/three-mesh-bvh", + "tsx": "^4.20.6", + "yaml": "^2.8.1", + "zod": "^4.2.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "../../packages/cadjs": { + "version": "0.3.9", + "extraneous": true, + "dependencies": { + "gifenc": "^1.0.3", + "three": "0.160.0" + } + }, + "../../viewer/node_modules/gifenc": { + "version": "1.0.3", + "license": "MIT", + "devDependencies": { + "ava": "^3.15.0", + "canvas-sketch-util": "^1.10.0", + "esbuild": "^0.8.52", + "esm": "^3.2.25", + "get-pixels": "^3.3.2", + "serve": "^11.3.2" + } + }, + "../../viewer/node_modules/three": { + "version": "0.160.0", + "license": "MIT", + "peer": true, + "devDependencies": { + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-terser": "^0.4.0", + "chalk": "^5.2.0", + "concurrently": "^8.0.1", + "dpdm": "^3.14.0", + "eslint": "^8.37.0", + "eslint-config-mdcs": "^5.0.0", + "eslint-plugin-compat": "^4.1.2", + "eslint-plugin-html": "^7.1.0", + "eslint-plugin-import": "^2.27.5", + "failonlyreporter": "^1.0.0", + "jimp": "^0.22.7", + "magic-string": "^0.30.0", + "pixelmatch": "^5.3.0", + "puppeteer": "^21.5.1", + "qunit": "^2.19.4", + "rollup": "^4.6.0", + "rollup-plugin-filesize": "^10.0.0", + "rollup-plugin-visualizer": "^5.9.0", + "servez": "^2.0.0" + } + }, + "../../viewer/node_modules/three-mesh-bvh": { + "version": "0.8.0", + "license": "MIT", + "devDependencies": { + "@babel/core": "^7.15.5", + "@babel/preset-env": "^7.15.4", + "@types/eslint": "^7.28.1", + "@types/jest": "^27.0.2", + "@types/three": "^0.166.0", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", + "babel-jest": "^27.2.4", + "concurrently": "^8.2.1", + "eslint": "^8.56.0", + "eslint-config-mdcs": "^5.0.0", + "eslint-plugin-jest": "^28.6.0", + "glob": "^10.3.3", + "jest": "^27.2.4", + "preprocess": "^3.2.0", + "rollup": "^3.28.1", + "script-loader": "^0.7.2", + "simple-git": "^3.19.1", + "simplex-noise": "^2.4.0", + "static-server": "^2.2.1", + "stats.js": "^0.17.0", + "three": "^0.166.1", + "typescript": "^5.1.3", + "vite": "^5.2.13" + }, + "peerDependencies": { + "three": ">= 0.158.0" + } + }, + "../../viewer/packages/cadjs": { + "version": "0.3.9", + "dependencies": { + "gifenc": "^1.0.3", + "three": "0.160.0" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "4.0.28", + "resolved": "https://registry.npmmirror.com/@ai-sdk/gateway/-/gateway-4.0.28.tgz", + "integrity": "sha512-ee9TsNO3mkgHDWmTmJ8Fvltr6PFh52zhrV2+FaKJY3F3iu7kWZi5tCRJCR1HVhhlpj6lHniUb28nLQdPHkA/1Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "4.0.3", + "@ai-sdk/provider-utils": "5.0.12", + "@vercel/oidc": "3.2.0" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/mcp": { + "version": "2.0.16", + "resolved": "https://registry.npmmirror.com/@ai-sdk/mcp/-/mcp-2.0.16.tgz", + "integrity": "sha512-jC2r+StEuk8uIldfP4j8nBwOEBJ2TRwy/bz71SHMZ3NG6PSbvRPXGfyoHHR6JTm1O5GcIww0f6B8LznzkrseDA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "4.0.3", + "@ai-sdk/provider-utils": "5.0.12", + "pkce-challenge": "^5.0.1" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "4.0.20", + "resolved": "https://registry.npmmirror.com/@ai-sdk/openai/-/openai-4.0.20.tgz", + "integrity": "sha512-/Hu+btLIO2zuYqCp//vBBAGdM/BeN4gds+NWrlv7Y9WrcTXwnEEwh6P3QZIWh2Tt1I1lswuDIpAJ4t/c/rws3Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "4.0.3", + "@ai-sdk/provider-utils": "5.0.12" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/openai-compatible": { + "version": "3.0.14", + "resolved": "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-3.0.14.tgz", + "integrity": "sha512-nUl7dBHUDTqcnuWGnEbKMwDDqL94BxRfibLwYv8uWp+kZn8Zqdxy7tUBt4sv2hpHQi+S2P6bUyqW18xmbykErw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "4.0.3", + "@ai-sdk/provider-utils": "5.0.12" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-4.0.3.tgz", + "integrity": "sha512-e0CpNWJUY7OxAFAnCZkw+ri9QOHWwTs1tXP42782KFGCU07qt8NiXCrCVowyCB5dP2r5/Uls+g2oPd8kOJn9dw==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "5.0.12", + "resolved": "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-5.0.12.tgz", + "integrity": "sha512-bbhlOgHeYwrIGheLkM6fhS8hVger8uFPmcOLg+kxc9EFh7y30XYorWhthlYAgpadO3SJhFZrIcEknN7qEqEVvA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "4.0.3", + "@standard-schema/spec": "^1.1.0", + "@workflow/serde": "4.1.0", + "eventsource-parser": "^3.0.8" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "4.0.39", + "resolved": "https://registry.npmmirror.com/@ai-sdk/react/-/react-4.0.39.tgz", + "integrity": "sha512-Fwkwt/xpVUHs9esMsvzeA1MYRILdDNLOTlYB9aAB5wNaABFvNhowpqYOekQJSI1b56ATx1+XC/mhSX2/zkzE8A==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/mcp": "2.0.16", + "@ai-sdk/provider": "4.0.3", + "@ai-sdk/provider-utils": "5.0.12", + "ai": "7.0.36", + "swr": "^2.4.1", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" + } + }, + "node_modules/@ai-sdk/react/node_modules/@ai-sdk/gateway": { + "version": "4.0.27", + "resolved": "https://registry.npmmirror.com/@ai-sdk/gateway/-/gateway-4.0.27.tgz", + "integrity": "sha512-gqTMvV0N8/JirIZ3OzwjSZRYxzwZu/PeOFCKb8NB9fstWH39tI+L6CkeMNVou5/HCKEYAw6RCOHW59Vhquv8vA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "4.0.3", + "@ai-sdk/provider-utils": "5.0.12", + "@vercel/oidc": "3.2.0" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/react/node_modules/ai": { + "version": "7.0.36", + "resolved": "https://registry.npmmirror.com/ai/-/ai-7.0.36.tgz", + "integrity": "sha512-1XJjua58GVQ0CyO2Xbioyladt85x71Joup2U8qKrjHUl8tHYwrDw8iFRtav6e94AxSVCn9FVgTS17oX1OCquKA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "4.0.27", + "@ai-sdk/provider": "4.0.3", + "@ai-sdk/provider-utils": "5.0.12" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@assistant-ui/core": { + "version": "0.2.21", + "resolved": "https://registry.npmmirror.com/@assistant-ui/core/-/core-0.2.21.tgz", + "integrity": "sha512-Kwv9EywvtTsvoSmqFS0uonsQmN9iuo0GaIpqPGkxnfu4o8/slMw8gNDFNc+2+mzAdNCXcwkkLxh52gws7vhf0w==", + "license": "MIT", + "dependencies": { + "assistant-stream": "^0.3.26", + "nanoid": "^6.0.0" + }, + "peerDependencies": { + "@assistant-ui/store": "^0.2.13", + "@assistant-ui/tap": "^0.9.0", + "@types/react": "*", + "assistant-cloud": "^0.1.31", + "react": "^18 || ^19", + "zustand": "^5.0.11" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "assistant-cloud": { + "optional": true + }, + "react": { + "optional": true + }, + "zustand": { + "optional": true + } + } + }, + "node_modules/@assistant-ui/react": { + "version": "0.14.27", + "resolved": "https://registry.npmmirror.com/@assistant-ui/react/-/react-0.14.27.tgz", + "integrity": "sha512-zV49HS6+pxu3BLdTI8TCH2j6vrx7aQtgJFmsPjfs6JVrahKvCojIUDF8dhpfzUtMyfi6VFrrXe496x319bqoDQ==", + "license": "MIT", + "dependencies": { + "@assistant-ui/core": "^0.2.21", + "@assistant-ui/store": "^0.2.20", + "@assistant-ui/tap": "^0.9.4", + "@radix-ui/primitive": "^1.1.5", + "@radix-ui/react-collection": "^1.1.12", + "@radix-ui/react-compose-refs": "^1.1.3", + "@radix-ui/react-context": "^1.2.0", + "@radix-ui/react-primitive": "^2.1.7", + "@radix-ui/react-use-callback-ref": "^1.1.2", + "@radix-ui/react-use-controllable-state": "^1.2.3", + "@radix-ui/react-use-escape-keydown": "^1.1.3", + "assistant-cloud": "^0.1.35", + "assistant-stream": "^0.3.26", + "nanoid": "^6.0.0", + "radix-ui": "^1.6.2", + "react-textarea-autosize": "^8.5.9", + "safe-content-frame": "^0.0.23", + "zod": "^4.4.3", + "zustand": "^5.0.14" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@assistant-ui/react-ai-sdk": { + "version": "1.3.41", + "resolved": "https://registry.npmmirror.com/@assistant-ui/react-ai-sdk/-/react-ai-sdk-1.3.41.tgz", + "integrity": "sha512-WLwdaIXfk+w48dXUY2BtwKTQjktwGh1PSRPjzYwAXi+iPBxFJBgz4Tz0oW8mP6RetM/Q3qC6v9K/1059Pm/94g==", + "license": "MIT", + "dependencies": { + "@ai-sdk/mcp": "^2.0.13", + "@ai-sdk/react": "^4.0.30", + "@assistant-ui/core": "^0.2.21", + "@assistant-ui/store": "^0.2.20", + "ai": "^7.0.28", + "assistant-cloud": "*", + "assistant-stream": "^0.3.26" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@assistant-ui/store": { + "version": "0.2.20", + "resolved": "https://registry.npmmirror.com/@assistant-ui/store/-/store-0.2.20.tgz", + "integrity": "sha512-g+iHnov+JMZmVAPKhfs9YqCXWFcCBWCyi+oqsc/kAR9zMsE0+qbE36iyRYfsJFrhMDm+6Ev7/2UTO+1HwTiZfA==", + "license": "MIT", + "peer": true, + "dependencies": { + "use-effect-event": "^2.0.3" + }, + "peerDependencies": { + "@assistant-ui/tap": "^0.5.16 || ^0.7.1 || ^0.8.1 || ^0.9.0", + "@types/react": "*", + "react": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@assistant-ui/tap": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/@assistant-ui/tap/-/tap-0.9.4.tgz", + "integrity": "sha512-l44CfXvWrokaXQWBGsFGf574rlM9h5ii9mbcSJ8VoPV6KIpK5zlRqhkSxWWKuke4Q70tQygLaZm1BdiPwIP0bA==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "*", + "react": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.13", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.13.tgz", + "integrity": "sha512-2/0RrtTngKZVkOFYDlvhe6JIsUravRnYGwH1iJ+qt+wPu8/fPu3HTLRkQptyIkpLovAy8qvHHJs9cvYJ3Uyqqg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-visually-hidden": "1.2.9" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.18", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-accordion/-/react-accordion-1.2.18.tgz", + "integrity": "sha512-CGuUFvhjScXBF/bhjaU9xlgai2ikYqJRazXhMzngoUaZI7QaxAw24Ae3S/pR0b69p8GqW6i+CKJmx9JPNnZ4QQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collapsible": "1.1.18", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.21.tgz", + "integrity": "sha512-VbSR148lNkE8JdWnOsYX72YdivmCAtcrot1dl8UmT0ZZRKNR3hHJUpQxJOw7jWlY/JFemn4oaDXxCxpD594B7Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dialog": "1.1.21", + "@radix-ui/react-primitive": "2.1.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.13", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.13.tgz", + "integrity": "sha512-0Q310knIY0K+mkmncU9FxLggfW7V49Ok2oY+iu27KkERTsQXxYCIC8XW5QoK4w7Jp1z00vT5xj3oxTcn7QlcTg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.13", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.13.tgz", + "integrity": "sha512-dD/EvbOiLskcdBKgNAeUmbTBCJfdCGp85fpFe3lmziE4ASbXuFERQCAB3sR41yvM+P711kJsTBNL9piP60urbA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-avatar/-/react-avatar-1.2.4.tgz", + "integrity": "sha512-u4Sz6ajq2WobGMqbsNXnFI/3JP/o7TUBkEmQ4BRUYofPDQawdO3WWYy5907c9VgOFX+ETjKI3VxnnrKYAF7Pmg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-is-hydrated": "0.1.2", + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.9", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-checkbox/-/react-checkbox-1.3.9.tgz", + "integrity": "sha512-YPXZlqjrKVqKtVD2F828CApHwu+PEu30i7x0Y9gg6SbQ3fJbcaQlDkGPT0gW6HjxoCjAEt8uJ494F1S61KpIjQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-size": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.18", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.18.tgz", + "integrity": "sha512-aNMp8humfYzWERz5gxGb/eLNkB0ZthypLbNlNolzdgzFTeN78e/rnn9rxCdOaSsg/zClTOJ/OkjXYx9PUEPATw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.13", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.13.tgz", + "integrity": "sha512-Q8xYqNRFObXPmi45bFSkGdM2JA5hjBeYGFqzg6lZR3wp6b+cciraVq8DdneTabtws+uOYqjmsvmKOufk/M9Cyg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.4.tgz", + "integrity": "sha512-pWJo6lQAfR6uy1n7ii7PaCc9dLPwTXDYbQpORZU5B548Aqvl2pP1SM1vJGKyxIFqZMHRopRO4CQYX2iXAIB5jA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.2.1.tgz", + "integrity": "sha512-EraVbFjiIjibpLr6EjvEDmSCYJU2SlKDMiO+qEK/D9GOWnQoAQlpQo2occGYC1UM9MBeEx5Bek3UtW/Qi57vAg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-context-menu/-/react-context-menu-2.3.5.tgz", + "integrity": "sha512-wbvSjqc7r0xKmfhrMCiCPxSTv/aSHU0cCAy0tELthJbaIzT7dkAcevKuoGKbDLiPG2VePgMVqLi2sWb6tDnzvQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-menu": "2.1.22", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.1.21.tgz", + "integrity": "sha512-h+7qMDDmZJ8qTSPrwNyKb/PACY0ehtN8QOBlCz+C2C1jgehKekdhmHddG9YQk8BF/sHJqglPjte+jA1Jrp9HcA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.1.3.tgz", + "integrity": "sha512-OdgAA/xb6WOQMKNn0mtbYoruMG6YMaBOnq+evWxSpMmiEMBdeFZawnIWRfPPeVXCRm+0lnN8jpJLjhD7/UIxWw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.17", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.17.tgz", + "integrity": "sha512-QAXwa38pG0xNAYh1pjdSaf86NrkqsMoDNmget/Y7X8O8E/C3Iqlj9GAPE4DfX9BPLXc7WH2TWSzMRnIoCdcjzQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-effect-event": "0.0.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.22", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.22.tgz", + "integrity": "sha512-wZRLTjZaJf1HTxx0YepFKZUuo+SZMi+Cr4kJ2fuA5FxDSUE0vHDTscahUaU+jfz6LFk4OuguwqJs5K0JsIsIBA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-menu": "2.1.22", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.5.tgz", + "integrity": "sha512-UQvlB7L/BYh3P8MLvwZnQkH521EDos40Rwnbt5+Qpg4Vbk0z3xJjRUmR6+aka4aT1IQQXFdO5bNPoE7cvFl5xQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.14", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.14.tgz", + "integrity": "sha512-/x4htnJfmW53MplkrePaDpf1o/rN1C++g88WpVobULXbSyC19NtLkXmewuJ/HCaceSmfKDNL5gOXcBGnuAvnvQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-form": { + "version": "0.1.14", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-form/-/react-form-0.1.14.tgz", + "integrity": "sha512-ZCuPb54PQ3ZQEdQ6G1PrMBfXXzAyaVoCI9Fl+bWOwYZKTOcFjPHL7JQ3tCb6CX6Ut81GZLWKgIpV6OS3n5z5Ig==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-label": "2.1.13", + "@radix-ui/react-primitive": "2.1.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-hover-card/-/react-hover-card-1.1.21.tgz", + "integrity": "sha512-ByFLyi+kdTGkObxIt5wKB3Ru3rtJRuYUqPEtqiv1HNYqutqbn1wDuNmVzI6iwus9qfY3vwpNgvx/UVZUGTWC1A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.3.tgz", + "integrity": "sha512-f/Wxm0ctyMymUJK0fqTSQlm85rbzdAkoNbPXJQ5+6caowVO8Yx+NWGjGz/oGhs/D+WIbbQpOrU0hU2Li2/42xQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.13", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-label/-/react-label-2.1.13.tgz", + "integrity": "sha512-kj7BXyM4uG0dyeoEdVmPQAOFN291+iJOtiGTvkXe1ijJWLQbAHpFNkopvqquaMVn+zjqTZRhnefESAinMErHKg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.22", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-menu/-/react-menu-2.1.22.tgz", + "integrity": "sha512-xCFrVLttGDPwMjIPI6GS+tm3IGUNKsPXffrJQIPpQJuE9Qy1bU9GNUCkwranU/pEqyBlwMxcBIK/FUJFAZ9SqQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-callback-ref": "1.1.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.22", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-menubar/-/react-menubar-1.1.22.tgz", + "integrity": "sha512-jDkcZXd5rN4b/S9nnEv9KZajaQ7+RO98OCWqAxrULTJtkSvODlNOO+EIxNG/d4QIF6QOqK5ZZrTF9MYl6eQdiQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-menu": "2.1.22", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-use-controllable-state": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.20", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.20.tgz", + "integrity": "sha512-in/exCQPatmmBmQZrtQkK4UrysEp8VGEuw5o8Bx3ozxbfg7DBb4H5j3DgxGz4N59J02NRVzhsWFtujZgy5ue3w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-previous": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-one-time-password-field": { + "version": "0.1.14", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.14.tgz", + "integrity": "sha512-F3vMSK+d+huI3a4Zm6j2hUsS+/gByVbsechJwp/ZCZBCrusXHvBeZZz9aMqXqqYNYu23mtvVMt6AeHDds8EU7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-effect-event": "0.0.4", + "@radix-ui/react-use-is-hydrated": "0.1.2", + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-password-toggle-field": { + "version": "0.1.9", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.9.tgz", + "integrity": "sha512-JFkmnwZFD357odQkpzfxz++bpohQpaGCT/4PK6oRd4R/Rxzg02uFDucFzZDOTIOz6vWSluIlz91zelleg9BheA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-effect-event": "0.0.4", + "@radix-ui/react-use-is-hydrated": "0.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-popover/-/react-popover-1.1.21.tgz", + "integrity": "sha512-+AJ7P5oRcFqFtv7MaCD8fOuK3l5qQBAMdWEOnUOYd3JfHOeIUe7TnHHSSP15CtWwH4KrotyDCTzodOIoONh8vw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.3.5.tgz", + "integrity": "sha512-6hLng2Rs45IZcvZ31BNvMeaFEMMEbtsog4xPcb8LZrGfyoV9fdAXqB9UKhLpTHtL0+E2DhSr6VW54Tehd6ksAQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-rect": "1.1.3", + "@radix-ui/react-use-size": "1.1.3", + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.15.tgz", + "integrity": "sha512-kAfBVJUKNNKZuyGQXXG6rKolAV2KAmxxVkPXJgoq9dEFTl39286RufHQFNTL8rzha4vP8159BJ6hMGpB+bqv7A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.9.tgz", + "integrity": "sha512-LTi1v05bprIb8/GSY/GWusI0jfsYjQ3CD3Nin8o7jVxnpHzVQfzjOQJoJTQkE9bdmOnsS7SFdhkXiBv8PrYnxw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.1.8.tgz", + "integrity": "sha512-DOlK1BdcIeYYUcFkSYFka4v1h95XTov93b0jCgW1EEiZuIhdwHY2NlE1teLIh+p0uBsuZI5A+voay+iVWpprfA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.14", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-progress/-/react-progress-1.1.14.tgz", + "integrity": "sha512-lq5VXWp/t/b8MaqbRMAItXICc/jwhzJt0ZZ+au/CBtTYkX9EfAsSyGQL5brUVBgf9tUTKCoJEZlDl+uJF/08xQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.4.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-radio-group/-/react-radio-group-1.4.5.tgz", + "integrity": "sha512-BM1xQgw1gpgPSw05U4hJCMDX9GmAS6b6vKZANuNQZo0vf/ah7NZDAnjLd4tPg3z2vMvlI0CV+B2CFM9Z19oQDA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-size": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.17", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.17.tgz", + "integrity": "sha512-YdJmjETw7Py+4Nziv71jgZ6fH7xQgB5p+pQ5rV8Iufyrm0RHSijec/UV1zPfQoK/YcfzB9nOl/2bi1zf1SjRMQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-is-hydrated": "0.1.2", + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.16", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.16.tgz", + "integrity": "sha512-kEcmCenIJ+W5xlCv1u9VKDdPmzzGyfrJwEneY+02GH+lJRXrGpkiTkyjrfkspuRw6DXt4uduwT5c4xD8HTv27Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-select/-/react-select-2.3.5.tgz", + "integrity": "sha512-6CQx0xtdarAkSCsqgLJaz+coYQaru7rt8K6gMItR2rA+WP8/Ig6kRAzP6Zw88RccG98IZnszqJlJx9hejYOL3A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-previous": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.13", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-separator/-/react-separator-1.1.13.tgz", + "integrity": "sha512-wbagLhy4grekqiT6hU0WNP09FpmemTXbNWg4QEawaw9dix7hRIcrmDNnLDasOsKVLtArEznhgZKe5Gm4U6oPXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.4.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-slider/-/react-slider-1.4.5.tgz", + "integrity": "sha512-7E8C13SdQKQxYganILiVZGEwM0NSbfbFcnNJ93kP++wD2pMT1SMsG3c04PFUlbPpaSXgicYgPeBndgJTvV3NKg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-previous": "1.1.3", + "@radix-ui/react-use-size": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.3.1.tgz", + "integrity": "sha512-Bu/aAQHFFh6/QAvXAeUMurJ9fbW0JUIqlojU/yBXZ7cAVqy75Y7JYYyuCr9zLNF0p4WWoJYV54CTUIf4l7FzTw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-switch/-/react-switch-1.3.5.tgz", + "integrity": "sha512-e1YrvGvEjIqDhqKjQ4Q+IDkMfiY30u3FPz9CZXZMlQ8mU3kZ2PdeBM8Gssc48CDopPizNorKumGhjySBfO7BDQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-size": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-tabs/-/react-tabs-1.1.19.tgz", + "integrity": "sha512-4wbGf98pX2ZwYqHMVB/dakeMPyH4xSJ9MSDaCCWXlIpYt0VYY6mtZxKSTiGS/F3tk0yrEYmXE1V8uwG7TxDCcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-use-controllable-state": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.21", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-toast/-/react-toast-1.2.21.tgz", + "integrity": "sha512-/o8uHzH2z6ZM59Dt1UPFj8aYJ0DjPu0EuQXQ7uuYJTQLH5mNqxa1KuBfbpnklgXOOjyAtTp/tll0Nm+Nkz+bEg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.16", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle/-/react-toggle-1.1.16.tgz", + "integrity": "sha512-pp4TLY3N4osN9IB4TLEaaZRGooBmCi/XJD65gSCs5tvsKofM9WgiBToNtGrmR0k3sG4jFj4Nw4utsIvQraWA9g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-use-controllable-state": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.17", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.17.tgz", + "integrity": "sha512-KKsrxb1cZREc2RI5DOGwlUSpaPW40xIaK1/DXXqYDb7slRE8pkRa+iF2aFbYiuMJ+aNWpCSChiN5gFe3bVveaQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-toggle": "1.1.16", + "@radix-ui/react-use-controllable-state": "1.2.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toolbar": { + "version": "1.1.17", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-toolbar/-/react-toolbar-1.1.17.tgz", + "integrity": "sha512-MjorZ0XQiWfCrrpStNXw/hX0HnG7VEzCgcSV226Ox8/WzS5yq0SiMhsLFE3LlXhdghlakFRFdE6eegtmUQW7Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-separator": "1.1.13", + "@radix-ui/react-toggle-group": "1.1.17" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.14", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-tooltip/-/react-tooltip-1.2.14.tgz", + "integrity": "sha512-C/JxCKJJac+wtHPW1yFBSN8Ssuaufy2jYQMgyiJYyW4Fw0WJfDWXQDAly1qsbd1YDznH+sYitaljhf8igPCvmA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-id": "1.1.3", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.3.tgz", + "integrity": "sha512-AUS7HoBBAncIsGMLNG+CcpLuJ+JIBbZzmyM8Qdb1eIThX0AlhSSC6wn40xfBlPE+ypx/vSSiRWnklUAjy3U3UA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.5.tgz", + "integrity": "sha512-UB1dXpxvHjR48poyKdKdTm7jT0kp3elkUKdKQiOkirlbYumqXinSJtrjDsr9maXNPvL12bKI4CDSmydms/9Aeg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.4", + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.4.tgz", + "integrity": "sha512-XYcfa6wlXDCwQtePuEiPmXLSAhGL4DWtedSyRgGbG3y10mw+OnrLp6SyeY1gJFMiYF0Dx0nMAX9InylKbLEFQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.4.tgz", + "integrity": "sha512-4MSb5SPbMH02uUn19tLkO5Bav66ZQg/zFbedo7FWLWGFg9r8Z9xSog7QGnq9ZceurzBVIAIwgzANg6ExWc8HkQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.2.tgz", + "integrity": "sha512-2+gAVu9uaSLbopCTvvuWX9MIgEOlyqXC1Ok+KLCO7cZPSHLENs7dL0KbFQUGFIcFKmDW/bmaQRJtd8E3cnMRUw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.3.tgz", + "integrity": "sha512-rDiah9wvtqihWtWz02XreeRKIxt2EJF8y5D9rtY9l5A2zxePAtcPiOMpDugNRw5bFHz+1/8viVoc7ZVKiJknCw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.3.tgz", + "integrity": "sha512-kbefNKla5AGhgvMqrg/qS7mYVLXTEHQLqoFIS03nKN2dAfQQ5PK5Tp+2LxS7BV6a6l4HHv4jTg6rtV2Uajwe2w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.3.tgz", + "integrity": "sha512-W0GSYZFKEfi6raMiMEfJSngvVbFDIyxtW5JuVg5NoQBY59l0dVQVGLbhog/tOdwq0qtZ+TXuX1ikSNan4/IZXA==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.1.3.tgz", + "integrity": "sha512-jJq6tQQLvO/z4uWbztjwPV+1a/+H4rCaWypasLB/ac8DEdd6+p7dIm7o3F6P2KZPGkPMqD4s5424EdAdoU+GLA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.9", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.9.tgz", + "integrity": "sha512-seuZXNZVCz1kLSQMRO/TdNOSahBI3S5nXE4jzO7u7aFRWQlMAnwyrr8vKMkEU115fCLEyzR2YyjnP+aRMxK34w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@tailwindcss/postcss/-/postcss-4.3.3.tgz", + "integrity": "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "postcss": "^8.5.16", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vercel/oidc": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@vercel/oidc/-/oidc-3.2.0.tgz", + "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@workflow/serde": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/@workflow/serde/-/serde-4.1.0.tgz", + "integrity": "sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==", + "license": "Apache-2.0" + }, + "node_modules/ai": { + "version": "7.0.37", + "resolved": "https://registry.npmmirror.com/ai/-/ai-7.0.37.tgz", + "integrity": "sha512-stF+SEQJgKY3Qfe3FwNzqUrehHviOp2l7LemoI8YMOa0Zk5PxKsRNgUk3cHXz0RAue9RRyCAis2fz6LSCP6EKw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "4.0.28", + "@ai-sdk/provider": "4.0.3", + "@ai-sdk/provider-utils": "5.0.12" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/animejs": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/animejs/-/animejs-4.5.0.tgz", + "integrity": "sha512-NQimYX+lz8WaXonGS9zVVoviCIAjONeJayxacUditaivYLqyXgGjFKjuyl0aUUhFKm5MriX9ty1TGovNzoJQWA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/juliangarnier" + }, + "peerDependencies": { + "@types/three": ">=0.150.0", + "three": ">=0.150.0" + }, + "peerDependenciesMeta": { + "@types/three": { + "optional": true + }, + "three": { + "optional": true + } + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/assistant-cloud": { + "version": "0.1.35", + "resolved": "https://registry.npmmirror.com/assistant-cloud/-/assistant-cloud-0.1.35.tgz", + "integrity": "sha512-SiMvAXalCwM9GcnyIiJfQTZda00E2VE/jZWqSdX4WPxQyHeVNK7uBzw3AaFpBQT1vXbS1UYdKVlZdUJ3vRftCg==", + "license": "MIT", + "dependencies": { + "assistant-stream": "^0.3.26" + } + }, + "node_modules/assistant-stream": { + "version": "0.3.26", + "resolved": "https://registry.npmmirror.com/assistant-stream/-/assistant-stream-0.3.26.tgz", + "integrity": "sha512-qjYrK9c5Mpuz3U6oG6YDpBbiICANhNTN86MLNcI47iRYXalqvCZL2Tzmh9pQcGWDX3PltSJtGIFAIHdRDXIg+A==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "nanoid": "^6.0.0", + "secure-json-parse": "^4.1.0" + }, + "peerDependencies": { + "ioredis": "^5.10.1", + "redis": "^5.12.1" + }, + "peerDependenciesMeta": { + "ioredis": { + "optional": true + }, + "redis": { + "optional": true + } + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.1", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.1.tgz", + "integrity": "sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cadjs": { + "resolved": "../../viewer/packages/cadjs", + "link": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.24.3", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", + "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/gifenc": { + "resolved": "../../viewer/node_modules/gifenc", + "link": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lucide-react": { + "version": "1.26.0", + "resolved": "https://registry.npmmirror.com/lucide-react/-/lucide-react-1.26.0.tgz", + "integrity": "sha512-raglYVR2+VkMfJL158krjVmE+rV5ST2lzA/KQm1FRSjMHT4MnWaegHxoVEpmc2So3nOEhp9oGejJwAPX8MoAjg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/nanoid": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-6.0.0.tgz", + "integrity": "sha512-mkUH+rPkwU2qPadJ0oJZOjeZ5Mxn8Q1UhevwkTRWNuUZzyia3h4rhzK39hxaHTk0o2OxB8W2SQ6A8k23ZDi1pQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^22 || ^24 || >=26" + } + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/postcss": { + "version": "8.5.22", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.22.tgz", + "integrity": "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/radix-ui": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/radix-ui/-/radix-ui-1.6.5.tgz", + "integrity": "sha512-HVHPWDoOXBYxxiwvWR45KPcmvrjoa/NTFUbPbGmYoZv7BFYOIpZKiPQZWcpFJTX5z4LeoGenGCUgoafdYHuPWA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-accessible-icon": "1.1.13", + "@radix-ui/react-accordion": "1.2.18", + "@radix-ui/react-alert-dialog": "1.1.21", + "@radix-ui/react-arrow": "1.1.13", + "@radix-ui/react-aspect-ratio": "1.1.13", + "@radix-ui/react-avatar": "1.2.4", + "@radix-ui/react-checkbox": "1.3.9", + "@radix-ui/react-collapsible": "1.1.18", + "@radix-ui/react-collection": "1.1.13", + "@radix-ui/react-compose-refs": "1.1.4", + "@radix-ui/react-context": "1.2.1", + "@radix-ui/react-context-menu": "2.3.5", + "@radix-ui/react-dialog": "1.1.21", + "@radix-ui/react-direction": "1.1.3", + "@radix-ui/react-dismissable-layer": "1.1.17", + "@radix-ui/react-dropdown-menu": "2.1.22", + "@radix-ui/react-focus-guards": "1.1.5", + "@radix-ui/react-focus-scope": "1.1.14", + "@radix-ui/react-form": "0.1.14", + "@radix-ui/react-hover-card": "1.1.21", + "@radix-ui/react-label": "2.1.13", + "@radix-ui/react-menu": "2.1.22", + "@radix-ui/react-menubar": "1.1.22", + "@radix-ui/react-navigation-menu": "1.2.20", + "@radix-ui/react-one-time-password-field": "0.1.14", + "@radix-ui/react-password-toggle-field": "0.1.9", + "@radix-ui/react-popover": "1.1.21", + "@radix-ui/react-popper": "1.3.5", + "@radix-ui/react-portal": "1.1.15", + "@radix-ui/react-presence": "1.1.9", + "@radix-ui/react-primitive": "2.1.8", + "@radix-ui/react-progress": "1.1.14", + "@radix-ui/react-radio-group": "1.4.5", + "@radix-ui/react-roving-focus": "1.1.17", + "@radix-ui/react-scroll-area": "1.2.16", + "@radix-ui/react-select": "2.3.5", + "@radix-ui/react-separator": "1.1.13", + "@radix-ui/react-slider": "1.4.5", + "@radix-ui/react-slot": "1.3.1", + "@radix-ui/react-switch": "1.3.5", + "@radix-ui/react-tabs": "1.1.19", + "@radix-ui/react-toast": "1.2.21", + "@radix-ui/react-toggle": "1.1.16", + "@radix-ui/react-toggle-group": "1.1.17", + "@radix-ui/react-toolbar": "1.1.17", + "@radix-ui/react-tooltip": "1.2.14", + "@radix-ui/react-use-callback-ref": "1.1.3", + "@radix-ui/react-use-controllable-state": "1.2.5", + "@radix-ui/react-use-effect-event": "0.0.4", + "@radix-ui/react-use-escape-keydown": "1.1.4", + "@radix-ui/react-use-is-hydrated": "0.1.2", + "@radix-ui/react-use-layout-effect": "1.1.3", + "@radix-ui/react-use-size": "1.1.3", + "@radix-ui/react-visually-hidden": "1.2.9" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmmirror.com/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.5.9", + "resolved": "https://registry.npmmirror.com/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", + "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/safe-content-frame": { + "version": "0.0.23", + "resolved": "https://registry.npmmirror.com/safe-content-frame/-/safe-content-frame-0.0.23.tgz", + "integrity": "sha512-iIxZS0aEyYXp2CazwEeu1qhvar4sOctzjZQSlfvXzeGEqIpeCThXW1dV2t6HJ3FiixgWiDqdFMKzBq0mOCDmEQ==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/swr": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/swr/-/swr-2.4.2.tgz", + "integrity": "sha512-ej644Y2bvkIajfR32KGeSSdBXQW+ScjGjkybZgSE7kFpk9eGnV44XY9FJylXi+W75pavSX1PVNB57W5EbhGIYw==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/three": { + "resolved": "../../viewer/node_modules/three", + "link": true + }, + "node_modules/three-mesh-bvh": { + "resolved": "../../viewer/node_modules/three-mesh-bvh", + "link": true + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.23.1", + "resolved": "https://registry.npmmirror.com/tsx/-/tsx-4.23.1.tgz", + "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-composed-ref": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/use-composed-ref/-/use-composed-ref-1.4.0.tgz", + "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-effect-event": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/use-effect-event/-/use-effect-event-2.0.3.tgz", + "integrity": "sha512-fz1en+z3fYXCXx3nMB8hXDMuygBltifNKZq29zDx+xNJ+1vEs6oJlYd9sK31vxJ0YI534VUsHEBY0k2BATsmBQ==", + "license": "MIT", + "peerDependencies": { + "react": "^18.3 || ^19.0.0-0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/use-latest/-/use-latest-1.3.0.tgz", + "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", + "license": "MIT", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "5.0.14", + "resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.14.tgz", + "integrity": "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/text-to-cad/apps/cad-agent-studio/package.json b/text-to-cad/apps/cad-agent-studio/package.json new file mode 100644 index 0000000..de39fa8 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/package.json @@ -0,0 +1,42 @@ +{ + "name": "cad-agent-studio", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "next dev --webpack", + "build": "next build --webpack", + "start": "next start", + "test": "tsx --test src/**/*.test.ts" + }, + "dependencies": { + "@ai-sdk/openai": "latest", + "@ai-sdk/openai-compatible": "latest", + "@ai-sdk/react": "latest", + "@assistant-ui/react": "latest", + "@assistant-ui/react-ai-sdk": "latest", + "ai": "latest", + "animejs": "^4.5.0", + "cadjs": "file:../../viewer/packages/cadjs", + "clsx": "^2.1.1", + "gifenc": "file:../../viewer/node_modules/gifenc", + "lucide-react": "^1.14.0", + "next": "16.2.6", + "react": "19.2.4", + "react-dom": "19.2.4", + "tailwind-merge": "^3.5.0", + "three": "file:../../viewer/node_modules/three", + "three-mesh-bvh": "file:../../viewer/node_modules/three-mesh-bvh", + "tsx": "^4.20.6", + "yaml": "^2.8.1", + "zod": "^4.2.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/text-to-cad/apps/cad-agent-studio/postcss.config.mjs b/text-to-cad/apps/cad-agent-studio/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/text-to-cad/apps/cad-agent-studio/src/app/api/chat/route.ts b/text-to-cad/apps/cad-agent-studio/src/app/api/chat/route.ts new file mode 100644 index 0000000..8c7219c --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/api/chat/route.ts @@ -0,0 +1,22 @@ +import { NextRequest, NextResponse } from "next/server"; +import { streamAgentResponse } from "@/lib/chat"; + +export const runtime = "nodejs"; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + return streamAgentResponse({ + messages: Array.isArray(body.messages) ? body.messages : [], + attachments: Array.isArray(body.attachments) ? body.attachments : [], + viewerContext: Array.isArray(body.viewerContext) ? body.viewerContext : [], + provider: body.provider, + model: body.model, + selectedTaskId: body.selectedTaskId, + }); + } catch (error) { + return NextResponse.json({ + error: error instanceof Error ? error.message : "Failed to stream chat response.", + }, { status: 500 }); + } +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/api/config/route.ts b/text-to-cad/apps/cad-agent-studio/src/app/api/config/route.ts new file mode 100644 index 0000000..800cb99 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/api/config/route.ts @@ -0,0 +1,8 @@ +import { NextResponse } from "next/server"; +import { publicConfig } from "@/lib/config"; + +export const runtime = "nodejs"; + +export async function GET() { + return NextResponse.json(publicConfig()); +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/artifacts/[...artifactPath]/route.ts b/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/artifacts/[...artifactPath]/route.ts new file mode 100644 index 0000000..0caccd3 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/artifacts/[...artifactPath]/route.ts @@ -0,0 +1,25 @@ +import { NextRequest, NextResponse } from "next/server"; +import { contentTypeForArtifact, readArtifact } from "@/lib/preview-artifacts"; + +export const runtime = "nodejs"; + +export async function GET( + _request: NextRequest, + context: { params: Promise<{ taskId: string; artifactPath: string[] }> }, +) { + const { taskId, artifactPath } = await context.params; + const relativePath = artifactPath.join("/"); + try { + const artifact = await readArtifact(taskId, relativePath); + return new NextResponse(artifact.data, { + headers: { + "Cache-Control": "no-store", + "Content-Type": contentTypeForArtifact(relativePath), + }, + }); + } catch (error) { + return NextResponse.json({ + error: error instanceof Error ? error.message : "Failed to read artifact.", + }, { status: 404 }); + } +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/modify/route.ts b/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/modify/route.ts new file mode 100644 index 0000000..6367cea --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/modify/route.ts @@ -0,0 +1,21 @@ +import { NextRequest, NextResponse } from "next/server"; +import { createModificationRevision } from "@/lib/task-store"; + +export const runtime = "nodejs"; + +export async function POST(request: NextRequest, context: { params: Promise<{ taskId: string }> }) { + const { taskId } = await context.params; + const body = await request.json().catch(() => ({})); + try { + const result = await createModificationRevision({ + taskId, + instruction: String(body.instruction || ""), + viewerContext: Array.isArray(body.viewerContext) ? body.viewerContext : [], + }); + return NextResponse.json(result); + } catch (error) { + return NextResponse.json({ + error: error instanceof Error ? error.message : "Failed to create modification revision.", + }, { status: 500 }); + } +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/route.ts b/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/route.ts new file mode 100644 index 0000000..8d3d1bc --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/[taskId]/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from "next/server"; +import { readTask } from "@/lib/task-store"; + +export const runtime = "nodejs"; + +export async function GET(_request: NextRequest, context: { params: Promise<{ taskId: string }> }) { + const { taskId } = await context.params; + try { + return NextResponse.json(await readTask(taskId)); + } catch (error) { + return NextResponse.json({ + error: error instanceof Error ? error.message : "Failed to read task.", + }, { status: 404 }); + } +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/route.ts b/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/route.ts new file mode 100644 index 0000000..198b1af --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/api/tasks/route.ts @@ -0,0 +1,16 @@ +import { NextRequest, NextResponse } from "next/server"; +import { ensureTask, upsertManifest } from "@/lib/task-store"; + +export const runtime = "nodejs"; + +export async function POST(request: NextRequest) { + const body = await request.json().catch(() => ({})); + const task = await ensureTask(body.taskId); + const manifest = await upsertManifest(task.taskId, { + request: String(body.request || "CAD Agent Studio task"), + studio: { + createdAt: new Date().toISOString(), + }, + }); + return NextResponse.json({ taskId: task.taskId, dir: task.dir, manifest }); +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/api/upload/route.ts b/text-to-cad/apps/cad-agent-studio/src/app/api/upload/route.ts new file mode 100644 index 0000000..6cdc5e7 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/api/upload/route.ts @@ -0,0 +1,26 @@ +import { NextRequest, NextResponse } from "next/server"; +import { validateUpload } from "@/lib/upload-validation"; +import { writeUploadedFile } from "@/lib/task-store"; + +export const runtime = "nodejs"; + +export async function POST(request: NextRequest) { + const formData = await request.formData(); + const file = formData.get("file"); + const taskId = String(formData.get("taskId") || "").trim() || undefined; + if (!(file instanceof File)) { + return NextResponse.json({ error: "Missing file upload." }, { status: 400 }); + } + const validation = validateUpload(file.name, file.type, file.size); + if (!validation.ok) { + return NextResponse.json({ error: validation.error }, { status: 400 }); + } + const data = Buffer.from(await file.arrayBuffer()); + const attachment = await writeUploadedFile({ + taskId, + filename: file.name, + mime: file.type || "application/octet-stream", + data, + }); + return NextResponse.json(attachment); +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/globals.css b/text-to-cad/apps/cad-agent-studio/src/app/globals.css new file mode 100644 index 0000000..6e5dca1 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/globals.css @@ -0,0 +1,89 @@ +@import "tailwindcss"; + +:root { + color-scheme: dark; + --background: #111315; + --foreground: #e8e8e3; + --panel: #171a1d; + --panel-2: #1e2226; + --muted: #969b9f; + --border: #2d3339; + --accent: #7dc8cf; + --accent-2: #d8b66c; + --danger: #e56f72; + --radius: 0.625rem; + --sidebar: #15181b; + --sidebar-foreground: #e8e8e3; + --sidebar-accent: #22272c; + --sidebar-accent-foreground: #f2f4f4; + --sidebar-border: #2d3339; + --sidebar-ring: #7dc8cf; + --popover: #15181b; + --popover-foreground: #e8e8e3; + --primary: #7dc8cf; + --primary-foreground: #101315; + --muted-foreground: #969b9f; + --ui-glass-blur: 26px; + --ui-glass-saturation: 1.4; + --ui-glass-surface: rgb(22 22 25 / 82%); + --ui-glass-popover: rgb(24 24 27 / 86%); + --ui-glass-control: rgb(13 13 16 / 64%); +} + +* { + box-sizing: border-box; +} + +html, +body { + height: 100%; + margin: 0; + background: var(--background); + color: var(--foreground); + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; + letter-spacing: 0; +} + +button, +input, +textarea, +select { + font: inherit; +} + +button { + cursor: pointer; +} + +button:disabled { + cursor: not-allowed; + opacity: 0.58; +} + +::selection { + background: rgb(125 200 207 / 0.24); +} + +.scrollbar-thin { + scrollbar-width: thin; + scrollbar-color: #3a424a transparent; +} + +.cad-glass-surface, +.cad-glass-popover, +.cad-glass-control { + -webkit-backdrop-filter: blur(var(--ui-glass-blur)) saturate(var(--ui-glass-saturation)); + backdrop-filter: blur(var(--ui-glass-blur)) saturate(var(--ui-glass-saturation)); +} + +.cad-glass-surface { + background-color: var(--ui-glass-surface) !important; +} + +.cad-glass-popover { + background-color: var(--ui-glass-popover) !important; +} + +.cad-glass-control { + background-color: var(--ui-glass-control) !important; +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/layout.tsx b/text-to-cad/apps/cad-agent-studio/src/app/layout.tsx new file mode 100644 index 0000000..157858b --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/layout.tsx @@ -0,0 +1,15 @@ +import type { Metadata } from "next"; +import "./globals.css"; + +export const metadata: Metadata = { + title: "CAD Agent Studio", + description: "Agent chat with CAD Viewer preview and structured viewer tools.", +}; + +export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { + return ( + + {children} + + ); +} diff --git a/text-to-cad/apps/cad-agent-studio/src/app/page.tsx b/text-to-cad/apps/cad-agent-studio/src/app/page.tsx new file mode 100644 index 0000000..0a0535d --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/app/page.tsx @@ -0,0 +1,5 @@ +import { AgentStudio } from "@/components/agent-studio"; + +export default function Page() { + return ; +} diff --git a/text-to-cad/apps/cad-agent-studio/src/components/agent-studio.tsx b/text-to-cad/apps/cad-agent-studio/src/components/agent-studio.tsx new file mode 100644 index 0000000..c8d8ee2 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/components/agent-studio.tsx @@ -0,0 +1,652 @@ +"use client"; + +import type { DragEvent } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { + AssistantRuntimeProvider, + ComposerPrimitive, + MessagePartPrimitive, + MessagePrimitive, + ThreadPrimitive, + useMessage, + type DataMessagePartProps, + type ToolCallMessagePartProps, +} from "@assistant-ui/react"; +import { AssistantChatTransport, useChatRuntime } from "@assistant-ui/react-ai-sdk"; +import type { UIMessage } from "ai"; +import { CadViewerPreview } from "@/components/cad-viewer-preview"; +import { AiSelectionMode } from "@/lib/cad-edit-tools"; +import { + Bot, + Box, + Check, + CircleAlert, + FileImage, + FileUp, + Loader2, + MessageSquare, + Paperclip, + Send, + Settings2, + Sparkles, + Square, + Wrench, +} from "lucide-react"; + +type Attachment = { + id: string; + taskId: string; + name: string; + kind: "image" | "step" | "source" | "manifest" | "other"; + path: string; + size: number; + sha256: string; + mime: string; + artifactUrl?: string; + previewPath?: string; + previewUrl?: string; + viewerAssetPath?: string; + viewerAssetUrl?: string; + previewError?: string; +}; + +type ViewerContext = { + id: string; + type: string; + payload: Record; + createdAt: string; +}; + +type CadResult = { + taskId: string; + sourcePath?: string; + artifactPath?: string; + artifactUrl?: string; + previewPath?: string; + previewUrl?: string; + viewerAssetPath?: string; + viewerAssetUrl?: string; + summary?: string; +}; + +type CadProgress = { + step: string; + label: string; + status: "pending" | "running" | "success" | "error"; + message?: string; +}; + +type CadError = { + stage?: string; + message: string; +}; + +type PublicConfig = { + defaultProvider: string; + defaultModel: string; + providers: Record; + }>; + uploads: { + maxImageMB: number; + maxStepMB: number; + }; +}; + +const initialMessages: UIMessage[] = [{ + id: "welcome", + role: "assistant", + parts: [{ + type: "text", + text: "CAD Agent Studio 已就绪。上传图片、STEP 或其他文件,或直接描述要生成/修改的模型。", + }], +}]; + +const DEEPSEEK_PROVIDER_ID = "deepseek"; + +function uniqueId(prefix: string) { + return `${prefix}_${Math.random().toString(36).slice(2, 10)}`; +} + +function formatBytes(size: number) { + if (size < 1024) return `${size} B`; + if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`; + return `${(size / 1024 / 1024).toFixed(1)} MB`; +} + +function isStepFile(file: File) { + return /\.(step|stp)$/i.test(file.name); +} + +function extractCadResult(text: string) { + const match = /::cad-result\{base64="([^"]+)"\}/.exec(text); + if (!match) return null; + try { + return JSON.parse(atob(match[1])) as CadResult; + } catch { + return null; + } +} + +function setIfChanged(setter: (value: string | ((current: string) => string)) => void, nextValue = "") { + setter((current) => (current === nextValue ? current : nextValue)); +} + +function UploadedAttachmentCard({ attachment }: { attachment: Attachment }) { + return ( +
+ {attachment.kind === "image" ? : } + {attachment.name} + {attachment.kind === "step" ? ( + 重建参考 + ) : null} + {formatBytes(attachment.size)} +
+ ); +} + +function CadProgressCard({ data }: DataMessagePartProps) { + const icon = data.status === "running" + ? + : data.status === "success" + ? + : data.status === "error" + ? + : ; + return ( +
+
+ {icon} + {data.label} + {data.status} +
+ {data.message ?
{data.message}
: null} +
+ ); +} + +function CadArtifactCard({ data }: DataMessagePartProps) { + return ( +
+
+ + CAD 结果 +
+
+
{data.taskId}
+ {data.sourcePath ?
{data.sourcePath}
: null} + {data.artifactPath ?
{data.artifactPath}
: null} +
+ {data.artifactUrl ? ( + + 下载 STEP + + ) : null} +
+ ); +} + +function CadErrorCard({ data }: DataMessagePartProps) { + return ( +
+
+ + {data.stage ? `${data.stage} 失败` : "CAD 操作失败"} +
+
{data.message}
+
+ ); +} + +function CadToolCallCard(props: ToolCallMessagePartProps) { + const status = String(props.status?.type || props.status || ""); + return ( +
+
+ {status.includes("running") || status.includes("input-streaming") ? : } + {props.toolName} + {status || "tool call"} +
+
+ ); +} + +function DataFallback({ name, data }: DataMessagePartProps) { + return ( +
+ {name}: {JSON.stringify(data).slice(0, 500)} +
+ ); +} + +function MessageText() { + return ( + ( +

+ +

+ ), + data: { + by_name: { + "cad-progress": CadProgressCard, + "cad-result": CadArtifactCard, + "cad-error": CadErrorCard, + }, + Fallback: DataFallback, + }, + tools: { + Fallback: CadToolCallCard, + }, + }} + /> + ); +} + +function UserMessage() { + return ( + +
+ + You +
+ +
+ ); +} + +function AssistantMessage() { + return ( + +
+ + Agent +
+ + +
+ Agent 请求失败,请检查服务端日志和模型配置。 +
+
+
+ ); +} + +function AnyMessage() { + const message = useMessage(); + if (message.role === "user") return ; + if (message.role === "assistant") return ; + return null; +} + +export function AgentStudio() { + const [config, setConfig] = useState(null); + const [provider, setProvider] = useState(DEEPSEEK_PROVIDER_ID); + const [model, setModel] = useState(""); + const [attachments, setAttachments] = useState([]); + const [pendingViewerContexts, setPendingViewerContexts] = useState([]); + const [currentTaskId, setCurrentTaskId] = useState(""); + const [previewUrl, setPreviewUrl] = useState(""); + const [artifactUrl, setArtifactUrl] = useState(""); + const [artifactPath, setArtifactPath] = useState(""); + const [viewerAssetUrl, setViewerAssetUrl] = useState(""); + const [activeEditToolId, setActiveEditToolId] = useState(""); + const [aiSelectionMode, setAiSelectionMode] = useState("point"); + const [uploading, setUploading] = useState(false); + const [draggingUpload, setDraggingUpload] = useState(false); + const [error, setError] = useState(""); + const dragDepthRef = useRef(0); + const fileInputRef = useRef(null); + + const applyCadResult = useCallback((result: CadResult) => { + if (!result.taskId) return; + setIfChanged(setCurrentTaskId, result.taskId); + setIfChanged(setArtifactPath, result.artifactPath || ""); + setIfChanged(setArtifactUrl, result.artifactUrl || ""); + setIfChanged(setPreviewUrl, result.previewUrl || ""); + setIfChanged(setViewerAssetUrl, result.viewerAssetUrl || ""); + setActiveEditToolId(""); + setAiSelectionMode("point"); + }, []); + + const handleData = useCallback((dataPart: { type?: string; data?: unknown }) => { + if (dataPart.type === "data-cad-result") { + applyCadResult(dataPart.data as CadResult); + setPendingViewerContexts([]); + return; + } + if (dataPart.type === "data-cad-error") { + const data = dataPart.data as CadError; + setError(data.message || "CAD 生成失败"); + } + }, [applyCadResult]); + + const transport = useMemo(() => new AssistantChatTransport({ + api: "/api/chat", + body: { + provider: DEEPSEEK_PROVIDER_ID, + model, + attachments, + viewerContext: pendingViewerContexts, + selectedTaskId: currentTaskId, + }, + }), [attachments, currentTaskId, model, pendingViewerContexts]); + + const runtime = useChatRuntime({ + messages: initialMessages, + transport, + onData: handleData, + onError: (nextError) => { + setError(nextError instanceof Error ? nextError.message : "Agent 回复失败"); + }, + }); + + useEffect(() => { + void fetch("/api/config") + .then((response) => response.json()) + .then((nextConfig: PublicConfig) => { + setConfig(nextConfig); + setProvider(DEEPSEEK_PROVIDER_ID); + const deepseekProvider = nextConfig.providers[DEEPSEEK_PROVIDER_ID]; + setModel(deepseekProvider?.models?.default || ""); + }) + .catch((nextError) => { + setError(nextError instanceof Error ? nextError.message : "配置加载失败"); + }); + }, []); + + const providerModels = useMemo(() => { + const models = config?.providers?.[DEEPSEEK_PROVIDER_ID]?.models || {}; + return Object.entries(models); + }, [config]); + + const pushViewerContext = useCallback((type: string, payload: Record) => { + if (!currentTaskId) { + setError("请先生成或上传一个模型,再使用右侧工具栏。"); + return; + } + const context: ViewerContext = { + id: uniqueId("viewer"), + type, + createdAt: new Date().toISOString(), + payload, + }; + setPendingViewerContexts((current) => { + const nextCurrent = type === "cadViewer.selection" + ? current.filter((item) => item.type !== "cadViewer.selection") + : current; + return [context, ...nextCurrent].slice(0, 8); + }); + }, [currentTaskId]); + + const handleEditIntent = useCallback((intent: Record) => { + if (!currentTaskId) return; + pushViewerContext("cadViewer.editIntent", { + ...intent, + viewerState: { + viewerAssetUrl, + renderer: "cad-viewer.ported", + }, + }); + }, [currentTaskId, pushViewerContext, viewerAssetUrl]); + + const handleGeometrySelection = useCallback((selectionIntent: Record) => { + if (!currentTaskId) return; + pushViewerContext("cadViewer.selection", { + ...selectionIntent, + viewerState: { + viewerAssetUrl, + renderer: "cad-viewer.ported", + }, + }); + }, [currentTaskId, pushViewerContext, viewerAssetUrl]); + + const handleUpload = useCallback(async (files: FileList | null) => { + if (!files?.length) return; + setUploading(true); + setError(""); + try { + for (const file of Array.from(files)) { + const form = new FormData(); + form.append("file", file); + const stepUpload = isStepFile(file); + if (currentTaskId && !stepUpload) { + form.append("taskId", currentTaskId); + } + const response = await fetch("/api/upload", { + method: "POST", + body: form, + }); + const attachment = await response.json(); + if (!response.ok) { + throw new Error(attachment.error || `${file.name} 上传失败`); + } + setAttachments((current) => [attachment, ...current]); + if (attachment.kind === "step") { + continue; + } + setCurrentTaskId(attachment.taskId); + if (attachment.artifactUrl) { + setArtifactUrl(attachment.artifactUrl); + setArtifactPath(attachment.path); + } + if (attachment.previewUrl) { + setPreviewUrl(attachment.previewUrl); + } + if (attachment.viewerAssetUrl) { + setViewerAssetUrl(attachment.viewerAssetUrl); + } + if (attachment.previewError) { + setError(`STEP 已上传,但预览网格生成失败:${attachment.previewError}`); + } + } + } catch (nextError) { + setError(nextError instanceof Error ? nextError.message : "上传失败"); + } finally { + setUploading(false); + if (fileInputRef.current) { + fileInputRef.current.value = ""; + } + } + }, [currentTaskId]); + + const handleDragEnter = useCallback((event: DragEvent) => { + event.preventDefault(); + event.stopPropagation(); + dragDepthRef.current += 1; + if (event.dataTransfer.types.includes("Files")) { + setDraggingUpload(true); + } + }, []); + + const handleDragOver = useCallback((event: DragEvent) => { + event.preventDefault(); + event.stopPropagation(); + event.dataTransfer.dropEffect = "copy"; + if (event.dataTransfer.types.includes("Files")) { + setDraggingUpload(true); + } + }, []); + + const handleDragLeave = useCallback((event: DragEvent) => { + event.preventDefault(); + event.stopPropagation(); + dragDepthRef.current = Math.max(0, dragDepthRef.current - 1); + if (dragDepthRef.current === 0) { + setDraggingUpload(false); + } + }, []); + + const handleDrop = useCallback((event: DragEvent) => { + event.preventDefault(); + event.stopPropagation(); + dragDepthRef.current = 0; + setDraggingUpload(false); + void handleUpload(event.dataTransfer.files); + }, [handleUpload]); + + return ( + +
+
+
+
+
+
+
+ +
+
+ +
+
+ {draggingUpload ? ( +
+
+ +
拖放文件上传
+
支持图片、STEP/STP 和其他参考文件
+
+
+ ) : null} +
+
+
+ void handleUpload(event.target.files)} + /> +
+ + + + {error ? ( +
+ + {error} +
+ ) : null} + + {attachments.length ? ( +
+ {attachments.slice(0, 5).map((attachment) => ( + + ))} +
+ ) : null} + +
+ +
+
+ +
+ + +
+
+ + Enter 发送,Shift + Enter 换行 +
+
+ + + + 发送 + +
+
+
+
+
+
+ +
+ {viewerAssetUrl ? ( + + ) : ( +
+
+ +
3D 预览等待模型
+
+ 上传文件会进入 Agent 上下文。生成、重建或修改完成后会切换到真实输出结果。 +
+
+
+ )} + {artifactUrl ? ( + + + STEP + + ) : null} +
+
+
+
+ ); +} diff --git a/text-to-cad/apps/cad-agent-studio/src/components/cad-viewer-preview.tsx b/text-to-cad/apps/cad-agent-studio/src/components/cad-viewer-preview.tsx new file mode 100644 index 0000000..cd29429 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/components/cad-viewer-preview.tsx @@ -0,0 +1,984 @@ +"use client"; + +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { Loader2 } from "lucide-react"; +import { EmbeddedCadEditToolbar } from "@/components/embedded-cad-toolbar"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { FloatingPanel } from "@/components/ui/panel"; +import { Select } from "@/components/ui/select"; +import { + AiSelectionMode, + CAD_EDIT_TOOLS, + buildEmbeddedCadEditIntent, + buildEmbeddedGeometrySelectionIntent, + cadEditToolNextPickKind, + cadEditToolPickComplete, + cadEditToolForOperation, + defaultCadEditParameters, +} from "@/lib/cad-edit-tools"; +import CadViewer from "@/viewer-port/components/CadViewer"; +import { RENDER_FORMAT } from "@/viewer-port/workbench/constants"; +import { + loadRenderDisplayEdgeBundle, + loadRenderGlb, + loadRenderSelectorBundle, +} from "cadjs/lib/renderAssetClient"; +import { + buildDisplayEdgeRuntime, + buildSelectorRuntime, +} from "cadjs/lib/selectors/runtime"; + +type LoadState = + | { kind: "idle" | "loading" } + | { + kind: "ready"; + viewerAssetUrl: string; + meshData: unknown; + selectorRuntime: Record | null; + displayEdgeRuntime: Record | null; + references: Array>; + isRefreshing?: boolean; + } + | { kind: "error"; message: string }; + +type EditToolParameters = Record; + +type AiSelectionDraft = { + active?: boolean; + points?: Array<{ x: number; y: number }>; +} | null; + +const EMPTY_REFERENCES: Array> = []; +const EMPTY_REFERENCE_IDS: string[] = []; +const EMPTY_EDIT_PARAMETERS: EditToolParameters = {}; +const VIEWPORT_FRAME_INSETS = { top: 0, right: 0, bottom: 0, left: 0 }; + +function referenceId(value: unknown) { + return String((value as { referenceId?: string })?.referenceId || "").trim(); +} + +function uniqueStringList(values: unknown[]) { + const seen = new Set(); + const result: string[] = []; + for (const value of values) { + const normalized = String(value || "").trim(); + if (!normalized || seen.has(normalized)) continue; + seen.add(normalized); + result.push(normalized); + } + return result; +} + +function selectionReferenceIds(selection: Record | null | undefined, { includePick = false } = {}) { + const entities = Array.isArray(selection?.entities) ? selection.entities : []; + const values = [ + ...(Array.isArray(selection?.referenceIds) ? selection.referenceIds : []), + ...entities.map((entity) => referenceId(entity)), + ]; + if (includePick) { + values.push(referenceId(selection?.pick)); + } + return uniqueStringList(values); +} + +function runtimeReferenceId(value: unknown) { + const record = value as { id?: string; referenceId?: string }; + return String(record?.id || record?.referenceId || "").trim(); +} + +function referenceKind(reference: Record) { + return String(reference.selectorType || reference.entityType || "").toLowerCase(); +} + +function finiteVector(value: unknown) { + const raw = Array.isArray(value) + ? value + : value && typeof value === "object" + ? [(value as { x?: unknown }).x, (value as { y?: unknown }).y, (value as { z?: unknown }).z] + : null; + if (!Array.isArray(raw) || raw.length < 3) return null; + const vector = raw.slice(0, 3).map((component) => Number(component)); + return vector.every(Number.isFinite) ? vector : null; +} + +function vectorSignature(value: unknown) { + return (finiteVector(value) || []) + .map((component) => component.toFixed(5)) + .join(","); +} + +function editPickSignature(value: Record | null) { + if (!value) return ""; + return [ + String(value.kind || ""), + referenceId(value), + vectorSignature(value.pointModel), + vectorSignature(value.pointWorld), + Number.isFinite(Number(value.clientX)) ? Number(value.clientX).toFixed(1) : "", + Number.isFinite(Number(value.clientY)) ? Number(value.clientY).toFixed(1) : "", + ].join("|"); +} + +function compactSurface(surface: unknown) { + const record = surface && typeof surface === "object" ? surface as Record : {}; + return { + type: String(record.type || "").trim(), + radius: Number.isFinite(Number(record.radius)) ? Number(record.radius) : null, + origin: finiteVector(record.origin), + axis: finiteVector(record.axis), + normal: finiteVector(record.normal), + xDir: finiteVector(record.xDir), + yDir: finiteVector(record.yDir), + }; +} + +function compactReference(reference: Record) { + const pickData = reference.pickData && typeof reference.pickData === "object" + ? reference.pickData as Record + : {}; + return { + referenceId: runtimeReferenceId(reference), + selector: String(reference.displaySelector || reference.normalizedSelector || "").trim(), + normalizedSelector: String(reference.normalizedSelector || reference.displaySelector || "").trim(), + partId: String(reference.partId || "").trim(), + entityType: String(reference.entityType || "").trim(), + selectorType: referenceKind(reference), + rowIndex: Number.isInteger(Number(reference.rowIndex ?? pickData.rowIndex)) + ? Number(reference.rowIndex ?? pickData.rowIndex) + : null, + center: finiteVector(pickData.center || reference.center), + normal: finiteVector(pickData.normal || reference.normal || (pickData.surface as { normal?: unknown })?.normal), + surfaceType: String(pickData.surfaceType || (pickData.surface as { type?: unknown })?.type || reference.surfaceType || "").trim(), + surface: compactSurface(pickData.surface || reference.surface), + bbox: pickData.bbox || reference.bbox || null, + adjacentSelectors: Array.isArray(pickData.adjacentSelectors) ? pickData.adjacentSelectors : [], + loopCount: Number.isFinite(Number(reference.loopCount ?? pickData.loopCount)) ? Number(reference.loopCount ?? pickData.loopCount) : null, + }; +} + +function buildSingleReferenceSelection(reference: Record, referenceId: string) { + const entity = Object.keys(reference).length ? compactReference(reference) : { referenceId }; + return { + kind: "single_reference_activation", + selectionSource: "single_click", + scope: "selected_reference_only", + referenceIds: [referenceId], + entities: [entity], + instruction: "Only modify the single selected topology reference unless the user explicitly asks to modify every repeated/symmetric feature.", + }; +} + +function buildSlotSelection(picks: Array>) { + const start = picks[0]; + const end = picks[1]; + return { + kind: "surface_segment", + referenceId: referenceId(start), + selector: String(start?.selector || ""), + partId: String(start?.partId || ""), + entityType: String(start?.entityType || ""), + selectorType: String(start?.selectorType || ""), + start, + end, + normal: start?.normal || end?.normal || null, + surface: start?.surface || end?.surface || null, + }; +} + +function finiteClientPoint(pick: Record | null) { + const x = Number(pick?.clientX); + const y = Number(pick?.clientY); + return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null; +} + +function editToolPickMarkerLabel(activeToolId: string, pick: Record, index: number) { + if (activeToolId === "add_slot") { + return index === 0 ? "起点" : "终点"; + } + if (pick?.kind === "edge") { + return "边"; + } + if (activeToolId === "add_hole_pattern") { + return "中心"; + } + return "位置"; +} + +function numericEditParameter(parameters: EditToolParameters, name: string, fallback: number) { + const value = Number(parameters?.[name]); + return Number.isFinite(value) ? value : fallback; +} + +function previewPixelsFromMm(valueMm: number, { + scale = 5, + min = 12, + max = 180, +} = {}) { + const value = Math.abs(Number(valueMm)); + if (!Number.isFinite(value) || value <= 0) { + return min; + } + return Math.min(Math.max(value * scale, min), max); +} + +function virtualPreviewSpec(activeToolId: string, parameters: EditToolParameters, anchorPoint: { x: number; y: number } | null) { + if (!activeToolId || !anchorPoint) { + return null; + } + if (activeToolId === "add_hole") { + return { + kind: "circle", + point: anchorPoint, + diameterPx: previewPixelsFromMm(numericEditParameter(parameters, "holeDiameter", 2)), + }; + } + if (activeToolId === "add_counterbore") { + return { + kind: "double_circle", + point: anchorPoint, + innerDiameterPx: previewPixelsFromMm(numericEditParameter(parameters, "holeDiameter", 3)), + outerDiameterPx: previewPixelsFromMm(numericEditParameter(parameters, "counterboreDiameter", 6)), + }; + } + if (activeToolId === "add_countersink") { + return { + kind: "countersink", + point: anchorPoint, + innerDiameterPx: previewPixelsFromMm(numericEditParameter(parameters, "holeDiameter", 3)), + outerDiameterPx: previewPixelsFromMm(numericEditParameter(parameters, "countersinkDiameter", 6)), + }; + } + if (activeToolId === "add_circular_pocket") { + return { + kind: "circle", + point: anchorPoint, + diameterPx: previewPixelsFromMm(numericEditParameter(parameters, "diameter", 8), { scale: 4, min: 18, max: 220 }), + }; + } + if (activeToolId === "add_pocket") { + return { + kind: "rect", + point: anchorPoint, + widthPx: previewPixelsFromMm(numericEditParameter(parameters, "width", 10), { scale: 4, min: 24, max: 240 }), + heightPx: previewPixelsFromMm(numericEditParameter(parameters, "height", 6), { scale: 4, min: 18, max: 180 }), + }; + } + if (activeToolId === "add_hole_pattern") { + return { + kind: "hole_pattern", + point: anchorPoint, + holeDiameterPx: previewPixelsFromMm(numericEditParameter(parameters, "holeDiameter", 2), { scale: 4, min: 8, max: 48 }), + rows: Math.min(Math.max(Math.round(numericEditParameter(parameters, "rows", 2)), 1), 8), + columns: Math.min(Math.max(Math.round(numericEditParameter(parameters, "columns", 2)), 1), 8), + pitchXPx: previewPixelsFromMm(numericEditParameter(parameters, "pitchX", 8), { scale: 3, min: 18, max: 90 }), + pitchYPx: previewPixelsFromMm(numericEditParameter(parameters, "pitchY", 8), { scale: 3, min: 18, max: 90 }), + }; + } + return null; +} + +function EditToolVirtualPreview({ + spec, +}: { + spec: ReturnType; +}) { + if (!spec?.point) { + return null; + } + if (spec.kind === "circle") { + const diameterPx = Number(spec.diameterPx) || 0; + return ( + + ); + } + if (spec.kind === "double_circle" || spec.kind === "countersink") { + const outerDiameterPx = Number(spec.outerDiameterPx) || 0; + const innerDiameterPx = Number(spec.innerDiameterPx) || 0; + return ( + + + + + ); + } + if (spec.kind === "rect") { + const widthPx = Number(spec.widthPx) || 0; + const heightPx = Number(spec.heightPx) || 0; + return ( + + ); + } + if (spec.kind === "hole_pattern") { + const rows = Number(spec.rows) || 1; + const columns = Number(spec.columns) || 1; + const pitchXPx = Number(spec.pitchXPx) || 0; + const pitchYPx = Number(spec.pitchYPx) || 0; + const holeDiameterPx = Number(spec.holeDiameterPx) || 0; + const startX = spec.point.x - ((columns - 1) * pitchXPx) / 2; + const startY = spec.point.y - ((rows - 1) * pitchYPx) / 2; + const holes = []; + for (let row = 0; row < rows; row += 1) { + for (let column = 0; column < columns; column += 1) { + holes.push({ + x: startX + column * pitchXPx, + y: startY + row * pitchYPx, + }); + } + } + return ( + + {holes.map((hole, index) => ( + + ))} + + ); + } + return null; +} + +function slotPreviewWidthPx(parameters: EditToolParameters) { + return previewPixelsFromMm(numericEditParameter(parameters, "slotWidth", 2), { scale: 5, min: 12, max: 80 }); +} + +function EditToolPickOverlay({ + activeToolId, + picks, + hoverPick, + parameters, +}: { + activeToolId: string; + picks: Array>; + hoverPick: Record | null; + parameters: EditToolParameters; +}) { + if (!activeToolId) { + return null; + } + const points = picks + .map((pick, index) => ({ + pick, + index, + hover: false, + point: finiteClientPoint(pick), + })) + .filter((entry): entry is { + pick: Record; + index: number; + hover: false; + point: { x: number; y: number }; + } => Boolean(entry.point)); + const hoverPoint = finiteClientPoint(hoverPick); + const hoverEntry = hoverPoint && !points.some((entry) => ( + Math.hypot(entry.point.x - hoverPoint.x, entry.point.y - hoverPoint.y) < 1 + )) + ? { + pick: hoverPick || {}, + index: points.length, + hover: true, + point: hoverPoint, + } + : null; + const allPoints = hoverEntry ? [...points, hoverEntry] : points; + if (!allPoints.length) { + return null; + } + const slotLine = activeToolId === "add_slot" && allPoints.length >= 2 + ? { start: allPoints[0].point, end: allPoints[1].point, preview: allPoints[1].hover } + : null; + const anchorPoint = activeToolId === "add_slot" + ? null + : (points[points.length - 1]?.point || hoverEntry?.point || null); + const previewSpec = virtualPreviewSpec(activeToolId, parameters, anchorPoint); + const slotWidthPx = slotLine ? slotPreviewWidthPx(parameters) : 0; + return ( + + ); +} + +function AiSelectionOverlay({ + draft, +}: { + draft: AiSelectionDraft; +}) { + const draftPoints = Array.isArray(draft?.points) ? draft.points : []; + const points = draft?.active ? draftPoints : []; + const polylinePoints = points + .map((point) => `${Number(point.x)},${Number(point.y)}`) + .join(" "); + if (!polylinePoints) { + return null; + } + return ( + + ); +} + +function coerceEditToolParameters(activeToolId: string, parameters: EditToolParameters) { + const tool = cadEditToolForOperation(activeToolId); + return Object.fromEntries( + Object.entries(parameters).map(([name, value]) => { + const field = tool.parameterFields.find((entry) => entry.name === name); + if (field?.type !== "number" || value === "") { + return [name, value]; + } + const numericValue = Number(value); + return [name, Number.isFinite(numericValue) ? numericValue : value]; + }), + ); +} + +function EditToolParameterPanel({ + activeToolId, + parameters, + selectionReady, + onParameterChange, + onSubmit, + onCancel, +}: { + activeToolId: string; + parameters: EditToolParameters; + selectionReady: boolean; + onParameterChange: (name: string, value: string | number) => void; + onSubmit: () => void; + onCancel: () => void; +}) { + const activeTool = CAD_EDIT_TOOLS.find((tool) => tool.id === activeToolId) || null; + if (!activeTool || !selectionReady) { + return null; + } + return ( + event.stopPropagation()} + > +
+
+
{activeTool.label}
+
编辑参数
+
+ +
+
+ {activeTool.parameterFields.map((field) => { + const value = parameters[field.name] ?? ""; + return ( + + ); + })} +
+
+ + +
+
+ ); +} + +export function CadViewerPreview({ + taskId, + artifactPath, + viewerAssetUrl, + activeEditToolId, + aiSelectionMode, + onSelectTool, + onSelectionModeChange, + onEditIntent, + onGeometrySelection, +}: { + taskId: string; + artifactPath: string; + viewerAssetUrl: string; + activeEditToolId: string; + aiSelectionMode: AiSelectionMode; + onSelectTool: (toolId: string) => void; + onSelectionModeChange: (mode: AiSelectionMode) => void; + onEditIntent: (payload: Record) => void; + onGeometrySelection: (payload: Record) => void; +}) { + const [loadState, setLoadState] = useState({ kind: "idle" }); + const [hoveredReferenceId, setHoveredReferenceId] = useState(""); + const [selectedReferenceIds, setSelectedReferenceIds] = useState([]); + const [editToolPicks, setEditToolPicks] = useState>>([]); + const [editToolHoverPick, setEditToolHoverPick] = useState | null>(null); + const [editToolSelectionReady, setEditToolSelectionReady] = useState(false); + const [editToolParameters, setEditToolParameters] = useState(() => defaultCadEditParameters(activeEditToolId)); + const [aiSelectionDraft, setAiSelectionDraft] = useState(null); + const aiGeometrySelectionRef = useRef | null>(null); + const lastActivatedReferenceIdRef = useRef(""); + + useEffect(() => { + setHoveredReferenceId(""); + setSelectedReferenceIds([]); + setEditToolPicks([]); + setEditToolHoverPick(null); + setEditToolSelectionReady(false); + setAiSelectionDraft(null); + aiGeometrySelectionRef.current = null; + lastActivatedReferenceIdRef.current = ""; + }, [viewerAssetUrl]); + + useEffect(() => { + setEditToolPicks([]); + setEditToolHoverPick(null); + setEditToolSelectionReady(false); + setEditToolParameters(defaultCadEditParameters(activeEditToolId)); + }, [activeEditToolId]); + + useEffect(() => { + if (aiSelectionMode !== "lasso") { + setAiSelectionDraft(null); + } + }, [aiSelectionMode]); + + useEffect(() => { + if (!viewerAssetUrl) { + setLoadState({ kind: "error", message: "当前任务缺少 CAD Viewer GLB/topology 资产。" }); + return undefined; + } + const controller = new AbortController(); + setLoadState((current) => ( + current.kind === "ready" + ? { ...current, isRefreshing: true } + : { kind: "loading" } + )); + void Promise.all([ + loadRenderGlb(viewerAssetUrl, { signal: controller.signal }), + loadRenderSelectorBundle(viewerAssetUrl, { signal: controller.signal }).catch(() => null), + loadRenderDisplayEdgeBundle(viewerAssetUrl, { signal: controller.signal }).catch(() => null), + ]) + .then(([meshData, selectorBundle, displayEdgeBundle]) => { + if (controller.signal.aborted) return; + const selectorRuntime = selectorBundle + ? buildSelectorRuntime(selectorBundle, { + copyCadPath: artifactPath.replace(/\.(step|stp)$/i, ""), + }) + : null; + const displayEdgeRuntime = displayEdgeBundle ? buildDisplayEdgeRuntime(displayEdgeBundle) : null; + const references = Array.isArray(selectorRuntime?.references) ? selectorRuntime.references : []; + setLoadState({ + kind: "ready", + viewerAssetUrl, + meshData, + selectorRuntime, + displayEdgeRuntime, + references, + isRefreshing: false, + }); + }) + .catch((error) => { + if (controller.signal.aborted) return; + setLoadState((current) => ( + current.kind === "ready" + ? { ...current, isRefreshing: false } + : { kind: "error", message: error instanceof Error ? error.message : "CAD Viewer 资产加载失败。" } + )); + }); + return () => controller.abort(); + }, [artifactPath, viewerAssetUrl]); + + const pickableFaces = useMemo(() => { + if (loadState.kind !== "ready") return []; + return loadState.references.filter((reference) => referenceKind(reference) === "face"); + }, [loadState]); + + const pickableEdges = useMemo(() => { + if (loadState.kind !== "ready") return []; + return loadState.references.filter((reference) => referenceKind(reference) === "edge"); + }, [loadState]); + + const handleEditToolPick = useCallback((payload: Record | null) => { + if (!activeEditToolId || !payload) return; + const nextPicks = [...editToolPicks, payload]; + setEditToolPicks(nextPicks); + setEditToolHoverPick(null); + setEditToolSelectionReady(false); + const pickedReferenceId = referenceId(payload); + if (pickedReferenceId) { + setSelectedReferenceIds([pickedReferenceId]); + } + if (!cadEditToolPickComplete(activeEditToolId, nextPicks)) { + return; + } + setEditToolSelectionReady(true); + }, [activeEditToolId, editToolPicks]); + + const handleEditToolParameterChange = useCallback((name: string, value: string | number) => { + setEditToolParameters((previous) => ({ + ...previous, + [name]: value, + })); + }, []); + + const handleEditToolCancel = useCallback(() => { + setEditToolPicks([]); + setEditToolHoverPick(null); + setEditToolSelectionReady(false); + onSelectTool(""); + onSelectionModeChange("point"); + }, [onSelectTool, onSelectionModeChange]); + + const handleEditToolSubmit = useCallback(() => { + if (!activeEditToolId || !cadEditToolPickComplete(activeEditToolId, editToolPicks)) { + return; + } + const selection = activeEditToolId === "add_slot" ? buildSlotSelection(editToolPicks) : editToolPicks[0]; + onEditIntent(buildEmbeddedCadEditIntent({ + operation: activeEditToolId, + pick: selection, + parameters: coerceEditToolParameters(activeEditToolId, editToolParameters), + artifactPath, + taskId, + })); + setEditToolSelectionReady(false); + setEditToolPicks([]); + setEditToolHoverPick(null); + onSelectTool(""); + onSelectionModeChange("point"); + }, [activeEditToolId, artifactPath, editToolParameters, editToolPicks, onEditIntent, onSelectTool, onSelectionModeChange, taskId]); + + const handleGeometrySelection = useCallback((selection: Record | null) => { + if (!selection) return; + const referenceIds = selectionReferenceIds(selection, { includePick: true }); + let nextSelection: Record = { + ...selection, + referenceIds, + }; + if (selection.kind === "point_pick" && selection.multiSelect && referenceIds.length) { + const pickedReferenceId = referenceId(selection.pick) || referenceIds[0] || ""; + const previousSelection = aiGeometrySelectionRef.current; + const previousReferenceIds = selectionReferenceIds(previousSelection); + const nextReferenceIds = previousReferenceIds.includes(pickedReferenceId) + ? previousReferenceIds.filter((id) => id !== pickedReferenceId) + : uniqueStringList([...previousReferenceIds, pickedReferenceId]); + const entityByReferenceId = new Map(); + for (const entity of [ + ...(Array.isArray(previousSelection?.entities) ? previousSelection.entities : []), + ...(Array.isArray(selection.entities) ? selection.entities : []), + ]) { + const entityId = referenceId(entity); + if (entityId) entityByReferenceId.set(entityId, entity); + } + const entities = nextReferenceIds + .map((id) => entityByReferenceId.get(id)) + .filter(Boolean); + nextSelection = { + ...selection, + referenceIds: nextReferenceIds, + entities, + entityCount: entities.length, + }; + } else if (selection.kind === "point_pick") { + nextSelection = { + ...selection, + referenceIds, + entityCount: Array.isArray(selection.entities) ? selection.entities.length : referenceIds.length, + }; + } + const nextReferenceIds = selectionReferenceIds(nextSelection); + nextSelection = { + ...nextSelection, + referenceIds: nextReferenceIds, + }; + if (Number(nextSelection.entityCount) !== nextReferenceIds.length) { + nextSelection.entityCount = Array.isArray(nextSelection.entities) ? nextSelection.entities.length : nextReferenceIds.length; + } + aiGeometrySelectionRef.current = nextSelection; + setSelectedReferenceIds(nextReferenceIds); + onGeometrySelection(buildEmbeddedGeometrySelectionIntent({ + selection: nextSelection, + artifactPath, + taskId, + })); + }, [artifactPath, onGeometrySelection, taskId]); + + const handleHoverReferenceChange = useCallback((referenceId: string) => { + const normalized = String(referenceId || "").trim(); + setHoveredReferenceId((current) => (current === normalized ? current : normalized)); + }, []); + + const handleActivateReference = useCallback((referenceId: string) => { + const normalized = String(referenceId || "").trim(); + setSelectedReferenceIds((current) => { + const next = normalized ? [normalized] : []; + return current.length === next.length && current.every((id, index) => id === next[index]) ? current : next; + }); + if (!normalized || loadState.kind !== "ready" || lastActivatedReferenceIdRef.current === normalized) { + return; + } + lastActivatedReferenceIdRef.current = normalized; + const reference = loadState.references.find((candidate) => runtimeReferenceId(candidate) === normalized) || {}; + onGeometrySelection(buildEmbeddedGeometrySelectionIntent({ + selection: buildSingleReferenceSelection(reference, normalized), + artifactPath, + taskId, + })); + }, [artifactPath, loadState, onGeometrySelection, taskId]); + + const handleEditToolHover = useCallback((pick: Record | null) => { + const nextSignature = editPickSignature(pick); + setEditToolHoverPick((current) => ( + editPickSignature(current) === nextSignature ? current : pick + )); + }, []); + + const handleAiSelectionDraftChange = useCallback((draft: AiSelectionDraft) => { + setAiSelectionDraft((current) => { + const currentPoints = current?.points || []; + const nextPoints = draft?.points || []; + const samePoints = currentPoints.length === nextPoints.length && + currentPoints.every((point, index) => ( + point.x === nextPoints[index]?.x && point.y === nextPoints[index]?.y + )); + if ((current?.active || false) === (draft?.active || false) && samePoints) { + return current; + } + return draft; + }); + }, []); + + if (loadState.kind === "idle" || loadState.kind === "loading") { + return ( +
+
+ + 加载 CAD Viewer 资产... +
+
+ ); + } + + if (loadState.kind === "error") { + return ( +
+
+ {loadState.message} +
+
+ ); + } + + if (loadState.kind !== "ready") { + return null; + } + + return ( +
+ + {loadState.isRefreshing ? ( +
+
+ + 加载 CAD Viewer 资产... +
+
+ ) : null} + + + +
+ ); +} diff --git a/text-to-cad/apps/cad-agent-studio/src/components/embedded-cad-toolbar.tsx b/text-to-cad/apps/cad-agent-studio/src/components/embedded-cad-toolbar.tsx new file mode 100644 index 0000000..6c0f236 --- /dev/null +++ b/text-to-cad/apps/cad-agent-studio/src/components/embedded-cad-toolbar.tsx @@ -0,0 +1,169 @@ +"use client"; + +import type { ReactNode } from "react"; +import { + CircleDot, + CircleDotDashed, + CornerDownRight, + Disc, + Drill, + Focus, + Grid2X2Plus, + LassoSelect, + MousePointerClick, + Orbit, + Radius, + SquareDashed, + SquareSplitHorizontal, +} from "lucide-react"; +import { AiSelectionMode, CAD_EDIT_TOOLS } from "@/lib/cad-edit-tools"; + +const EDIT_TOOL_ICONS = { + add_hole: Drill, + add_counterbore: CircleDot, + add_countersink: CircleDotDashed, + add_slot: SquareSplitHorizontal, + add_pocket: SquareDashed, + add_circular_pocket: Disc, + add_hole_pattern: Grid2X2Plus, + add_chamfer: CornerDownRight, + add_fillet: Radius, +}; + +function ToolbarButton({ + label, + active = false, + disabled = false, + children, + onClick, +}: { + label: string; + active?: boolean; + disabled?: boolean; + children: ReactNode; + onClick?: () => void; +}) { + return ( + + ); +} + +function Divider() { + return